feat(blog): add file-based blog with dynamic slugs, MDX content and layout shell

- Introduced blog routing using Next.js App Router
- Implemented dynamic [slug] pages for blog posts
- Added MDX-based content loading via lib/posts
- Integrated shared TopBar layout with navigation
- Established clear content, lib and component separation
This commit is contained in:
PascalSchattenburg
2026-01-22 14:14:15 +01:00
parent b717952234
commit d147843c76
10412 changed files with 2475583 additions and 0 deletions

View File

@@ -0,0 +1 @@
export * from './module'

View File

@@ -0,0 +1,20 @@
"use strict";
if (process.env.NEXT_RUNTIME === 'edge') {
module.exports = require('next/dist/server/route-modules/pages-api/module.js');
} else {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/pages-api-turbo.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/pages-api.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/pages-api-turbo.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/pages-api.runtime.prod.js');
}
}
}
//# sourceMappingURL=module.compiled.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/route-modules/pages-api/module.compiled.js"],"sourcesContent":["if (process.env.NEXT_RUNTIME === 'edge') {\n module.exports = require('next/dist/server/route-modules/pages-api/module.js')\n} else {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/pages-api-turbo.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/pages-api.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/pages-api-turbo.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/pages-api.runtime.prod.js')\n }\n }\n}\n"],"names":["process","env","NEXT_RUNTIME","module","exports","require","NODE_ENV","TURBOPACK"],"mappings":";AAAA,IAAIA,QAAQC,GAAG,CAACC,YAAY,KAAK,QAAQ;IACvCC,OAAOC,OAAO,GAAGC,QAAQ;AAC3B,OAAO;IACL,IAAIL,QAAQC,GAAG,CAACK,QAAQ,KAAK,eAAe;QAC1C,IAAIN,QAAQC,GAAG,CAACM,SAAS,EAAE;YACzBJ,OAAOC,OAAO,GAAGC,QAAQ;QAC3B,OAAO;YACLF,OAAOC,OAAO,GAAGC,QAAQ;QAC3B;IACF,OAAO;QACL,IAAIL,QAAQC,GAAG,CAACM,SAAS,EAAE;YACzBJ,OAAOC,OAAO,GAAGC,QAAQ;QAC3B,OAAO;YACLF,OAAOC,OAAO,GAAGC,QAAQ;QAC3B;IACF;AACF","ignoreList":[0]}

View File

@@ -0,0 +1,94 @@
import type { IncomingMessage, ServerResponse } from 'http';
import type { PagesAPIRouteDefinition } from '../../route-definitions/pages-api-route-definition';
import type { PageConfig } from '../../../types';
import type { ParsedUrlQuery } from 'querystring';
import { type __ApiPreviewProps } from '../../api-utils';
import type { RouteModuleOptions } from '../route-module';
import { RouteModule, type RouteModuleHandleContext } from '../route-module';
import { apiResolver } from '../../api-utils/node/api-resolver';
import type { RevalidateFn } from '../../lib/router-utils/router-server-context';
type PagesAPIHandleFn = (req: IncomingMessage, res: ServerResponse) => Promise<void>;
/**
* The PagesAPIModule is the type of the module exported by the bundled Pages
* API module.
*/
export type PagesAPIModule = typeof import('../../../build/templates/pages-api');
type PagesAPIUserlandModule = {
/**
* The exported handler method.
*/
readonly default: PagesAPIHandleFn;
/**
* The exported page config.
*/
readonly config?: PageConfig;
};
type PagesAPIRouteHandlerContext = RouteModuleHandleContext & {
/**
* The incoming server request in non-edge runtime.
*/
req?: IncomingMessage;
/**
* The outgoing server response in non-edge runtime.
*/
res?: ServerResponse;
/**
* The hostname for the request.
*/
hostname?: string;
/**
* Keys allowed in the revalidate call.
*/
allowedRevalidateHeaderKeys?: string[];
/**
* Whether to trust the host header.
*/
trustHostHeader?: boolean;
/**
* The query for the request.
*/
query: ParsedUrlQuery;
/**
* The preview props used by the `preview` API.
*/
previewProps: __ApiPreviewProps;
/**
* True if the server is in development mode.
*/
dev: boolean;
/**
* Whether errors should be left uncaught to handle
* higher up
*/
propagateError: boolean;
/**
* The page that's being rendered.
*/
page: string;
/**
* The error handler for the request.
*/
onError?: Parameters<typeof apiResolver>[8];
/**
* whether multi-zone flag is enabled for draft mode
*/
multiZoneDraftMode?: boolean;
/**
* Internal revalidate function to avoid revalidating
* over the network
*/
internalRevalidate?: RevalidateFn;
};
export type PagesAPIRouteModuleOptions = RouteModuleOptions<PagesAPIRouteDefinition, PagesAPIUserlandModule>;
export declare class PagesAPIRouteModule extends RouteModule<PagesAPIRouteDefinition, PagesAPIUserlandModule> {
private apiResolverWrapped;
constructor(options: PagesAPIRouteModuleOptions);
/**
*
* @param req the incoming server request
* @param res the outgoing server response
* @param context the context for the render
*/
render(req: IncomingMessage, res: ServerResponse, context: PagesAPIRouteHandlerContext): Promise<void>;
}
export default PagesAPIRouteModule;

View File

@@ -0,0 +1,58 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
PagesAPIRouteModule: null,
default: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
PagesAPIRouteModule: function() {
return PagesAPIRouteModule;
},
default: function() {
return _default;
}
});
const _apiutils = require("../../api-utils");
const _routemodule = require("../route-module");
const _apiresolver = require("../../api-utils/node/api-resolver");
class PagesAPIRouteModule extends _routemodule.RouteModule {
constructor(options){
super(options);
if (typeof options.userland.default !== 'function') {
throw Object.defineProperty(new Error(`Page ${options.definition.page} does not export a default function.`), "__NEXT_ERROR_CODE", {
value: "E379",
enumerable: false,
configurable: true
});
}
this.apiResolverWrapped = (0, _apiutils.wrapApiHandler)(options.definition.page, _apiresolver.apiResolver);
}
/**
*
* @param req the incoming server request
* @param res the outgoing server response
* @param context the context for the render
*/ async render(req, res, context) {
const { apiResolverWrapped } = this;
await apiResolverWrapped(req, res, context.query, this.userland, {
...context.previewProps,
trustHostHeader: context.trustHostHeader,
allowedRevalidateHeaderKeys: context.allowedRevalidateHeaderKeys,
hostname: context.hostname,
multiZoneDraftMode: context.multiZoneDraftMode,
dev: context.dev,
internalRevalidate: context.internalRevalidate
}, context.propagateError, context.dev, context.page, context.onError);
}
}
const _default = PagesAPIRouteModule;
//# sourceMappingURL=module.js.map

File diff suppressed because one or more lines are too long