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:
594
apps/public-web/node_modules/next/dist/server/route-modules/route-module.js
generated
vendored
Normal file
594
apps/public-web/node_modules/next/dist/server/route-modules/route-module.js
generated
vendored
Normal file
@@ -0,0 +1,594 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "RouteModule", {
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
return RouteModule;
|
||||
}
|
||||
});
|
||||
const _constants = require("../../shared/lib/constants");
|
||||
const _url = require("../../lib/url");
|
||||
const _normalizelocalepath = require("../../shared/lib/i18n/normalize-locale-path");
|
||||
const _utils = require("../../shared/lib/router/utils");
|
||||
const _removepathprefix = require("../../shared/lib/router/utils/remove-path-prefix");
|
||||
const _serverutils = require("../server-utils");
|
||||
const _detectdomainlocale = require("../../shared/lib/i18n/detect-domain-locale");
|
||||
const _gethostname = require("../../shared/lib/get-hostname");
|
||||
const _apiutils = require("../api-utils");
|
||||
const _normalizedatapath = require("../../shared/lib/page-path/normalize-data-path");
|
||||
const _pathhasprefix = require("../../shared/lib/router/utils/path-has-prefix");
|
||||
const _requestmeta = require("../request-meta");
|
||||
const _normalizepagepath = require("../../shared/lib/page-path/normalize-page-path");
|
||||
const _ismetadataroute = require("../../lib/metadata/is-metadata-route");
|
||||
const _incrementalcache = require("../lib/incremental-cache");
|
||||
const _handlers = require("../use-cache/handlers");
|
||||
const _interopdefault = require("../app-render/interop-default");
|
||||
const _routekind = require("../route-kind");
|
||||
const _responsecache = /*#__PURE__*/ _interop_require_default(require("../response-cache"));
|
||||
const _apppaths = require("../../shared/lib/router/utils/app-paths");
|
||||
const _routerservercontext = require("../lib/router-utils/router-server-context");
|
||||
const _decodepathparams = require("../lib/router-utils/decode-path-params");
|
||||
const _removetrailingslash = require("../../shared/lib/router/utils/remove-trailing-slash");
|
||||
const _generateinterceptionroutesrewrites = require("../../lib/generate-interception-routes-rewrites");
|
||||
function _interop_require_default(obj) {
|
||||
return obj && obj.__esModule ? obj : {
|
||||
default: obj
|
||||
};
|
||||
}
|
||||
const dynamicImportEsmDefault = (id)=>import(/* webpackIgnore: true */ /* turbopackIgnore: true */ id).then((mod)=>mod.default || mod);
|
||||
class RouteModule {
|
||||
constructor({ userland, definition, distDir, relativeProjectDir }){
|
||||
this.userland = userland;
|
||||
this.definition = definition;
|
||||
this.isDev = process.env.NODE_ENV === 'development';
|
||||
this.distDir = distDir;
|
||||
this.relativeProjectDir = relativeProjectDir;
|
||||
}
|
||||
async instrumentationOnRequestError(req, ...args) {
|
||||
if (process.env.NEXT_RUNTIME === 'edge') {
|
||||
const { getEdgeInstrumentationModule } = await import('../web/globals');
|
||||
const instrumentation = await getEdgeInstrumentationModule();
|
||||
if (instrumentation) {
|
||||
await (instrumentation.onRequestError == null ? void 0 : instrumentation.onRequestError.call(instrumentation, ...args));
|
||||
}
|
||||
} else {
|
||||
const { join } = require('node:path');
|
||||
const absoluteProjectDir = join(/* turbopackIgnore: true */ process.cwd(), (0, _requestmeta.getRequestMeta)(req, 'relativeProjectDir') || this.relativeProjectDir);
|
||||
const { instrumentationOnRequestError } = await import('../lib/router-utils/instrumentation-globals.external.js');
|
||||
return instrumentationOnRequestError(absoluteProjectDir, this.distDir, ...args);
|
||||
}
|
||||
}
|
||||
loadManifests(srcPage, projectDir) {
|
||||
let result;
|
||||
if (process.env.NEXT_RUNTIME === 'edge') {
|
||||
var _self___RSC_MANIFEST;
|
||||
const { getEdgePreviewProps } = require('../web/get-edge-preview-props');
|
||||
const maybeJSONParse = (str)=>str ? JSON.parse(str) : undefined;
|
||||
result = {
|
||||
buildId: process.env.__NEXT_BUILD_ID || '',
|
||||
buildManifest: self.__BUILD_MANIFEST,
|
||||
fallbackBuildManifest: {},
|
||||
reactLoadableManifest: maybeJSONParse(self.__REACT_LOADABLE_MANIFEST),
|
||||
nextFontManifest: maybeJSONParse(self.__NEXT_FONT_MANIFEST),
|
||||
prerenderManifest: {
|
||||
routes: {},
|
||||
dynamicRoutes: {},
|
||||
notFoundRoutes: [],
|
||||
version: 4,
|
||||
preview: getEdgePreviewProps()
|
||||
},
|
||||
routesManifest: {
|
||||
version: 4,
|
||||
caseSensitive: Boolean(process.env.__NEXT_CASE_SENSITIVE_ROUTES),
|
||||
basePath: process.env.__NEXT_BASE_PATH || '',
|
||||
rewrites: process.env.__NEXT_REWRITES || {
|
||||
beforeFiles: [],
|
||||
afterFiles: [],
|
||||
fallback: []
|
||||
},
|
||||
redirects: [],
|
||||
headers: [],
|
||||
i18n: process.env.__NEXT_I18N_CONFIG || undefined,
|
||||
skipProxyUrlNormalize: Boolean(process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE)
|
||||
},
|
||||
serverFilesManifest: self.__SERVER_FILES_MANIFEST,
|
||||
clientReferenceManifest: (_self___RSC_MANIFEST = self.__RSC_MANIFEST) == null ? void 0 : _self___RSC_MANIFEST[srcPage],
|
||||
serverActionsManifest: maybeJSONParse(self.__RSC_SERVER_MANIFEST),
|
||||
subresourceIntegrityManifest: maybeJSONParse(self.__SUBRESOURCE_INTEGRITY_MANIFEST),
|
||||
dynamicCssManifest: maybeJSONParse(self.__DYNAMIC_CSS_MANIFEST),
|
||||
interceptionRoutePatterns: (maybeJSONParse(self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST) ?? []).map((rewrite)=>new RegExp(rewrite.regex))
|
||||
};
|
||||
} else {
|
||||
var _clientReferenceManifest___RSC_MANIFEST;
|
||||
if (!projectDir) {
|
||||
throw Object.defineProperty(new Error('Invariant: projectDir is required for node runtime'), "__NEXT_ERROR_CODE", {
|
||||
value: "E718",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
const { loadManifestFromRelativePath } = require('../load-manifest.external');
|
||||
const normalizedPagePath = (0, _normalizepagepath.normalizePagePath)(srcPage);
|
||||
const router = this.definition.kind === _routekind.RouteKind.PAGES || this.definition.kind === _routekind.RouteKind.PAGES_API ? 'pages' : 'app';
|
||||
const [routesManifest, prerenderManifest, buildManifest, fallbackBuildManifest, reactLoadableManifest, nextFontManifest, clientReferenceManifest, serverActionsManifest, subresourceIntegrityManifest, serverFilesManifest, buildId, dynamicCssManifest] = [
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: _constants.ROUTES_MANIFEST,
|
||||
shouldCache: !this.isDev
|
||||
}),
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: _constants.PRERENDER_MANIFEST,
|
||||
shouldCache: !this.isDev
|
||||
}),
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: _constants.BUILD_MANIFEST,
|
||||
shouldCache: !this.isDev
|
||||
}),
|
||||
srcPage === '/_error' ? loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: `fallback-${_constants.BUILD_MANIFEST}`,
|
||||
shouldCache: !this.isDev,
|
||||
handleMissing: true
|
||||
}) : {},
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: process.env.TURBOPACK ? `server/${router === 'app' ? 'app' : 'pages'}${normalizedPagePath}/${_constants.REACT_LOADABLE_MANIFEST}` : _constants.REACT_LOADABLE_MANIFEST,
|
||||
handleMissing: true,
|
||||
shouldCache: !this.isDev
|
||||
}),
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: `server/${_constants.NEXT_FONT_MANIFEST}.json`,
|
||||
shouldCache: !this.isDev
|
||||
}),
|
||||
router === 'app' && !(0, _ismetadataroute.isStaticMetadataRoute)(srcPage) ? loadManifestFromRelativePath({
|
||||
distDir: this.distDir,
|
||||
projectDir,
|
||||
useEval: true,
|
||||
handleMissing: true,
|
||||
manifest: `server/app${srcPage.replace(/%5F/g, '_') + '_' + _constants.CLIENT_REFERENCE_MANIFEST}.js`,
|
||||
shouldCache: !this.isDev
|
||||
}) : undefined,
|
||||
router === 'app' ? loadManifestFromRelativePath({
|
||||
distDir: this.distDir,
|
||||
projectDir,
|
||||
manifest: `server/${_constants.SERVER_REFERENCE_MANIFEST}.json`,
|
||||
handleMissing: true,
|
||||
shouldCache: !this.isDev
|
||||
}) : {},
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: `server/${_constants.SUBRESOURCE_INTEGRITY_MANIFEST}.json`,
|
||||
handleMissing: true,
|
||||
shouldCache: !this.isDev
|
||||
}),
|
||||
this.isDev ? undefined : loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: `${_constants.SERVER_FILES_MANIFEST}.json`
|
||||
}),
|
||||
this.isDev ? 'development' : loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: _constants.BUILD_ID_FILE,
|
||||
skipParse: true
|
||||
}),
|
||||
loadManifestFromRelativePath({
|
||||
projectDir,
|
||||
distDir: this.distDir,
|
||||
manifest: _constants.DYNAMIC_CSS_MANIFEST,
|
||||
handleMissing: true
|
||||
})
|
||||
];
|
||||
result = {
|
||||
buildId,
|
||||
buildManifest,
|
||||
fallbackBuildManifest,
|
||||
routesManifest,
|
||||
nextFontManifest,
|
||||
prerenderManifest,
|
||||
serverFilesManifest,
|
||||
reactLoadableManifest,
|
||||
clientReferenceManifest: clientReferenceManifest == null ? void 0 : (_clientReferenceManifest___RSC_MANIFEST = clientReferenceManifest.__RSC_MANIFEST) == null ? void 0 : _clientReferenceManifest___RSC_MANIFEST[srcPage.replace(/%5F/g, '_')],
|
||||
serverActionsManifest,
|
||||
subresourceIntegrityManifest,
|
||||
dynamicCssManifest,
|
||||
interceptionRoutePatterns: routesManifest.rewrites.beforeFiles.filter(_generateinterceptionroutesrewrites.isInterceptionRouteRewrite).map((rewrite)=>new RegExp(rewrite.regex))
|
||||
};
|
||||
}
|
||||
return result;
|
||||
}
|
||||
async loadCustomCacheHandlers(req, nextConfig) {
|
||||
if (process.env.NEXT_RUNTIME !== 'edge') {
|
||||
const { cacheMaxMemorySize, cacheHandlers } = nextConfig;
|
||||
if (!cacheHandlers) return;
|
||||
// If we've already initialized the cache handlers interface, don't do it
|
||||
// again.
|
||||
if (!(0, _handlers.initializeCacheHandlers)(cacheMaxMemorySize)) return;
|
||||
for (const [kind, handler] of Object.entries(cacheHandlers)){
|
||||
if (!handler) continue;
|
||||
const { formatDynamicImportPath } = require('../../lib/format-dynamic-import-path');
|
||||
const { join } = require('node:path');
|
||||
const absoluteProjectDir = join(/* turbopackIgnore: true */ process.cwd(), (0, _requestmeta.getRequestMeta)(req, 'relativeProjectDir') || this.relativeProjectDir);
|
||||
(0, _handlers.setCacheHandler)(kind, (0, _interopdefault.interopDefault)(await dynamicImportEsmDefault(formatDynamicImportPath(`${absoluteProjectDir}/${this.distDir}`, handler))));
|
||||
}
|
||||
}
|
||||
}
|
||||
async getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode) {
|
||||
if (process.env.NEXT_RUNTIME === 'edge') {
|
||||
return globalThis.__incrementalCache;
|
||||
} else {
|
||||
let CacheHandler;
|
||||
const { cacheHandler } = nextConfig;
|
||||
if (cacheHandler) {
|
||||
const { formatDynamicImportPath } = require('../../lib/format-dynamic-import-path');
|
||||
CacheHandler = (0, _interopdefault.interopDefault)(await dynamicImportEsmDefault(formatDynamicImportPath(this.distDir, cacheHandler)));
|
||||
}
|
||||
const { join } = require('node:path');
|
||||
const projectDir = join(/* turbopackIgnore: true */ process.cwd(), (0, _requestmeta.getRequestMeta)(req, 'relativeProjectDir') || this.relativeProjectDir);
|
||||
await this.loadCustomCacheHandlers(req, nextConfig);
|
||||
// incremental-cache is request specific
|
||||
// although can have shared caches in module scope
|
||||
// per-cache handler
|
||||
const incrementalCache = new _incrementalcache.IncrementalCache({
|
||||
fs: require('../lib/node-fs-methods').nodeFs,
|
||||
dev: this.isDev,
|
||||
requestHeaders: req.headers,
|
||||
allowedRevalidateHeaderKeys: nextConfig.experimental.allowedRevalidateHeaderKeys,
|
||||
minimalMode: isMinimalMode,
|
||||
serverDistDir: `${projectDir}/${this.distDir}/server`,
|
||||
fetchCacheKeyPrefix: nextConfig.experimental.fetchCacheKeyPrefix,
|
||||
maxMemoryCacheSize: nextConfig.cacheMaxMemorySize,
|
||||
flushToDisk: !isMinimalMode && nextConfig.experimental.isrFlushToDisk,
|
||||
getPrerenderManifest: ()=>prerenderManifest,
|
||||
CurCacheHandler: CacheHandler
|
||||
});
|
||||
globalThis.__incrementalCache = incrementalCache;
|
||||
return incrementalCache;
|
||||
}
|
||||
}
|
||||
async onRequestError(req, err, errorContext, silenceLog, routerServerContext) {
|
||||
if (!silenceLog) {
|
||||
if (routerServerContext == null ? void 0 : routerServerContext.logErrorWithOriginalStack) {
|
||||
routerServerContext.logErrorWithOriginalStack(err, 'app-dir');
|
||||
} else {
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
await this.instrumentationOnRequestError(req, err, {
|
||||
path: req.url || '/',
|
||||
headers: req.headers,
|
||||
method: req.method || 'GET'
|
||||
}, errorContext);
|
||||
}
|
||||
/** A more lightweight version of `prepare()` for only retrieving the config on edge */ getNextConfigEdge(req) {
|
||||
var _routerServerGlobal_RouterServerContextSymbol, _nextConfig_experimental;
|
||||
if (process.env.NEXT_RUNTIME !== 'edge') {
|
||||
throw Object.defineProperty(new Error('Invariant: getNextConfigEdge must only be called in edge runtime'), "__NEXT_ERROR_CODE", {
|
||||
value: "E968",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
let serverFilesManifest = self.__SERVER_FILES_MANIFEST;
|
||||
const relativeProjectDir = (0, _requestmeta.getRequestMeta)(req, 'relativeProjectDir') || this.relativeProjectDir;
|
||||
const routerServerContext = (_routerServerGlobal_RouterServerContextSymbol = _routerservercontext.routerServerGlobal[_routerservercontext.RouterServerContextSymbol]) == null ? void 0 : _routerServerGlobal_RouterServerContextSymbol[relativeProjectDir];
|
||||
const nextConfig = (routerServerContext == null ? void 0 : routerServerContext.nextConfig) || (serverFilesManifest == null ? void 0 : serverFilesManifest.config);
|
||||
if (!nextConfig) {
|
||||
throw Object.defineProperty(new Error("Invariant: nextConfig couldn't be loaded"), "__NEXT_ERROR_CODE", {
|
||||
value: "E969",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
let deploymentId;
|
||||
if ((_nextConfig_experimental = nextConfig.experimental) == null ? void 0 : _nextConfig_experimental.runtimeServerDeploymentId) {
|
||||
if (!process.env.NEXT_DEPLOYMENT_ID) {
|
||||
throw Object.defineProperty(new Error('process.env.NEXT_DEPLOYMENT_ID is missing but runtimeServerDeploymentId is enabled'), "__NEXT_ERROR_CODE", {
|
||||
value: "E970",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
deploymentId = process.env.NEXT_DEPLOYMENT_ID;
|
||||
} else {
|
||||
deploymentId = nextConfig.deploymentId || '';
|
||||
}
|
||||
return {
|
||||
nextConfig,
|
||||
deploymentId
|
||||
};
|
||||
}
|
||||
async prepare(req, res, { srcPage, multiZoneDraftMode }) {
|
||||
var _routerServerGlobal_RouterServerContextSymbol, _nextConfig_experimental;
|
||||
let absoluteProjectDir;
|
||||
// edge runtime handles loading instrumentation at the edge adapter level
|
||||
if (process.env.NEXT_RUNTIME !== 'edge') {
|
||||
const { join, relative } = require('node:path');
|
||||
absoluteProjectDir = join(/* turbopackIgnore: true */ process.cwd(), (0, _requestmeta.getRequestMeta)(req, 'relativeProjectDir') || this.relativeProjectDir);
|
||||
const absoluteDistDir = (0, _requestmeta.getRequestMeta)(req, 'distDir');
|
||||
if (absoluteDistDir) {
|
||||
this.distDir = relative(absoluteProjectDir, absoluteDistDir);
|
||||
}
|
||||
const { ensureInstrumentationRegistered } = await import('../lib/router-utils/instrumentation-globals.external.js');
|
||||
// ensure instrumentation is registered and pass
|
||||
// onRequestError below
|
||||
ensureInstrumentationRegistered(absoluteProjectDir, this.distDir);
|
||||
}
|
||||
const manifests = await this.loadManifests(srcPage, absoluteProjectDir);
|
||||
const { routesManifest, prerenderManifest, serverFilesManifest } = manifests;
|
||||
const { basePath, i18n, rewrites } = routesManifest;
|
||||
if (basePath) {
|
||||
req.url = (0, _removepathprefix.removePathPrefix)(req.url || '/', basePath);
|
||||
}
|
||||
const parsedUrl = (0, _url.parseReqUrl)(req.url || '/');
|
||||
// if we couldn't parse the URL we can't continue
|
||||
if (!parsedUrl) {
|
||||
return;
|
||||
}
|
||||
let isNextDataRequest = false;
|
||||
if ((0, _pathhasprefix.pathHasPrefix)(parsedUrl.pathname || '/', '/_next/data')) {
|
||||
isNextDataRequest = true;
|
||||
parsedUrl.pathname = (0, _normalizedatapath.normalizeDataPath)(parsedUrl.pathname || '/');
|
||||
}
|
||||
let originalPathname = parsedUrl.pathname || '/';
|
||||
const originalQuery = {
|
||||
...parsedUrl.query
|
||||
};
|
||||
const pageIsDynamic = (0, _utils.isDynamicRoute)(srcPage);
|
||||
let localeResult;
|
||||
let detectedLocale;
|
||||
if (i18n) {
|
||||
localeResult = (0, _normalizelocalepath.normalizeLocalePath)(parsedUrl.pathname || '/', i18n.locales);
|
||||
if (localeResult.detectedLocale) {
|
||||
req.url = `${localeResult.pathname}${parsedUrl.search}`;
|
||||
originalPathname = localeResult.pathname;
|
||||
if (!detectedLocale) {
|
||||
detectedLocale = localeResult.detectedLocale;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Normalize the page path for route matching. The srcPage contains the
|
||||
// internal page path (e.g., /app/[slug]/page), but route matchers expect
|
||||
// the pathname format (e.g., /app/[slug]).
|
||||
const normalizedSrcPage = (0, _apppaths.normalizeAppPath)(srcPage);
|
||||
const serverUtils = (0, _serverutils.getServerUtils)({
|
||||
page: normalizedSrcPage,
|
||||
i18n,
|
||||
basePath,
|
||||
rewrites,
|
||||
pageIsDynamic,
|
||||
trailingSlash: process.env.__NEXT_TRAILING_SLASH,
|
||||
caseSensitive: Boolean(routesManifest.caseSensitive)
|
||||
});
|
||||
const domainLocale = (0, _detectdomainlocale.detectDomainLocale)(i18n == null ? void 0 : i18n.domains, (0, _gethostname.getHostname)(parsedUrl, req.headers), detectedLocale);
|
||||
(0, _requestmeta.addRequestMeta)(req, 'isLocaleDomain', Boolean(domainLocale));
|
||||
const defaultLocale = (domainLocale == null ? void 0 : domainLocale.defaultLocale) || (i18n == null ? void 0 : i18n.defaultLocale);
|
||||
// Ensure parsedUrl.pathname includes locale before processing
|
||||
// rewrites or they won't match correctly.
|
||||
if (defaultLocale && !detectedLocale) {
|
||||
parsedUrl.pathname = `/${defaultLocale}${parsedUrl.pathname === '/' ? '' : parsedUrl.pathname}`;
|
||||
}
|
||||
const locale = (0, _requestmeta.getRequestMeta)(req, 'locale') || detectedLocale || defaultLocale;
|
||||
// we apply rewrites against cloned URL so that we don't
|
||||
// modify the original with the rewrite destination
|
||||
const { rewriteParams, rewrittenParsedUrl } = serverUtils.handleRewrites(req, parsedUrl);
|
||||
const rewriteParamKeys = Object.keys(rewriteParams);
|
||||
Object.assign(parsedUrl.query, rewrittenParsedUrl.query);
|
||||
// after processing rewrites we want to remove locale
|
||||
// from parsedUrl pathname
|
||||
if (i18n) {
|
||||
parsedUrl.pathname = (0, _normalizelocalepath.normalizeLocalePath)(parsedUrl.pathname || '/', i18n.locales).pathname;
|
||||
rewrittenParsedUrl.pathname = (0, _normalizelocalepath.normalizeLocalePath)(rewrittenParsedUrl.pathname || '/', i18n.locales).pathname;
|
||||
}
|
||||
let params = (0, _requestmeta.getRequestMeta)(req, 'params');
|
||||
// attempt parsing from pathname
|
||||
if (!params && serverUtils.dynamicRouteMatcher) {
|
||||
const paramsMatch = serverUtils.dynamicRouteMatcher((0, _normalizedatapath.normalizeDataPath)((rewrittenParsedUrl == null ? void 0 : rewrittenParsedUrl.pathname) || parsedUrl.pathname || '/'));
|
||||
const paramsResult = serverUtils.normalizeDynamicRouteParams(paramsMatch || {}, true);
|
||||
if (paramsResult.hasValidParams) {
|
||||
params = paramsResult.params;
|
||||
}
|
||||
}
|
||||
// Local "next start" expects the routing parsed query values
|
||||
// to not be present in the URL although when deployed proxies
|
||||
// will add query values from resolving the routes to pass to function.
|
||||
// TODO: do we want to change expectations for "next start"
|
||||
// to include these query values in the URL which affects asPath
|
||||
// but would match deployed behavior, e.g. a rewrite from middleware
|
||||
// that adds a query param would be in asPath as query but locally
|
||||
// it won't be in the asPath but still available in the query object
|
||||
const query = (0, _requestmeta.getRequestMeta)(req, 'query') || {
|
||||
...parsedUrl.query
|
||||
};
|
||||
const routeParamKeys = new Set();
|
||||
const combinedParamKeys = [];
|
||||
// We don't include rewriteParamKeys in the combinedParamKeys
|
||||
// for app router since the searchParams is populated from the
|
||||
// URL so we don't want to strip the rewrite params from the URL
|
||||
// so that searchParams can include them.
|
||||
if (this.definition.kind === _routekind.RouteKind.PAGES || this.definition.kind === _routekind.RouteKind.PAGES_API) {
|
||||
for (const key of [
|
||||
...rewriteParamKeys,
|
||||
...Object.keys(serverUtils.defaultRouteMatches || {})
|
||||
]){
|
||||
// We only want to filter rewrite param keys from the URL
|
||||
// if they are matches from the URL e.g. the key/value matches
|
||||
// before and after applying the rewrites /:path for /hello and
|
||||
// { path: 'hello' } but not for { path: 'another' } and /hello
|
||||
// TODO: we should prefix rewrite param keys the same as we do
|
||||
// for dynamic routes so we can identify them properly
|
||||
const originalValue = Array.isArray(originalQuery[key]) ? originalQuery[key].join('') : originalQuery[key];
|
||||
const queryValue = Array.isArray(query[key]) ? query[key].join('') : query[key];
|
||||
if (!(key in originalQuery) || originalValue === queryValue) {
|
||||
combinedParamKeys.push(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
serverUtils.normalizeCdnUrl(req, combinedParamKeys);
|
||||
serverUtils.normalizeQueryParams(query, routeParamKeys);
|
||||
serverUtils.filterInternalQuery(originalQuery, combinedParamKeys);
|
||||
if (pageIsDynamic) {
|
||||
const queryResult = serverUtils.normalizeDynamicRouteParams(query, true);
|
||||
const paramsResult = serverUtils.normalizeDynamicRouteParams(params || {}, true);
|
||||
let paramsToInterpolate;
|
||||
if (// if both query and params are valid but one
|
||||
// provided more information rely on that one
|
||||
query && params && paramsResult.hasValidParams && queryResult.hasValidParams && Object.keys(paramsResult.params).length < Object.keys(queryResult.params).length) {
|
||||
paramsToInterpolate = queryResult.params;
|
||||
params = Object.assign(queryResult.params);
|
||||
} else {
|
||||
paramsToInterpolate = paramsResult.hasValidParams && params ? params : queryResult.hasValidParams ? query : {};
|
||||
}
|
||||
req.url = serverUtils.interpolateDynamicPath(req.url || '/', paramsToInterpolate);
|
||||
parsedUrl.pathname = serverUtils.interpolateDynamicPath(parsedUrl.pathname || '/', paramsToInterpolate);
|
||||
originalPathname = serverUtils.interpolateDynamicPath(originalPathname, paramsToInterpolate);
|
||||
// try pulling from query if valid
|
||||
if (!params) {
|
||||
if (queryResult.hasValidParams) {
|
||||
params = Object.assign({}, queryResult.params);
|
||||
// If we pulled from query remove it so it's
|
||||
// only in params
|
||||
for(const key in serverUtils.defaultRouteMatches){
|
||||
delete query[key];
|
||||
}
|
||||
} else {
|
||||
// use final params from URL matching
|
||||
const paramsMatch = serverUtils.dynamicRouteMatcher == null ? void 0 : serverUtils.dynamicRouteMatcher.call(serverUtils, (0, _normalizedatapath.normalizeDataPath)((localeResult == null ? void 0 : localeResult.pathname) || parsedUrl.pathname || '/'));
|
||||
// we don't normalize these as they are allowed to be
|
||||
// the literal slug matches here e.g. /blog/[slug]
|
||||
// actually being requested
|
||||
if (paramsMatch) {
|
||||
params = Object.assign({}, paramsMatch);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Remove any normalized params from the query if they
|
||||
// weren't present as non-prefixed query key e.g.
|
||||
// ?search=1&nxtPsearch=hello we don't delete search
|
||||
for (const key of routeParamKeys){
|
||||
if (!(key in originalQuery)) {
|
||||
delete query[key];
|
||||
}
|
||||
}
|
||||
const { isOnDemandRevalidate, revalidateOnlyGenerated } = (0, _apiutils.checkIsOnDemandRevalidate)(req, prerenderManifest.preview);
|
||||
let isDraftMode = false;
|
||||
let previewData;
|
||||
// preview data relies on non-edge utils
|
||||
if (process.env.NEXT_RUNTIME !== 'edge' && res) {
|
||||
const { tryGetPreviewData } = require('../api-utils/node/try-get-preview-data');
|
||||
previewData = tryGetPreviewData(req, res, prerenderManifest.preview, Boolean(multiZoneDraftMode));
|
||||
isDraftMode = previewData !== false;
|
||||
}
|
||||
const relativeProjectDir = (0, _requestmeta.getRequestMeta)(req, 'relativeProjectDir') || this.relativeProjectDir;
|
||||
const routerServerContext = (_routerServerGlobal_RouterServerContextSymbol = _routerservercontext.routerServerGlobal[_routerservercontext.RouterServerContextSymbol]) == null ? void 0 : _routerServerGlobal_RouterServerContextSymbol[relativeProjectDir];
|
||||
const nextConfig = (routerServerContext == null ? void 0 : routerServerContext.nextConfig) || (serverFilesManifest == null ? void 0 : serverFilesManifest.config);
|
||||
if (!nextConfig) {
|
||||
throw Object.defineProperty(new Error("Invariant: nextConfig couldn't be loaded"), "__NEXT_ERROR_CODE", {
|
||||
value: "E969",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
let resolvedPathname = normalizedSrcPage;
|
||||
if ((0, _utils.isDynamicRoute)(resolvedPathname) && params) {
|
||||
resolvedPathname = serverUtils.interpolateDynamicPath(resolvedPathname, params);
|
||||
}
|
||||
if (resolvedPathname === '/index') {
|
||||
resolvedPathname = '/';
|
||||
}
|
||||
const encodedResolvedPathname = resolvedPathname;
|
||||
// we decode for cache key/manifest usage encoded is
|
||||
// for URL building
|
||||
try {
|
||||
resolvedPathname = (0, _decodepathparams.decodePathParams)(resolvedPathname);
|
||||
} catch (_) {}
|
||||
resolvedPathname = (0, _removetrailingslash.removeTrailingSlash)(resolvedPathname);
|
||||
let deploymentId;
|
||||
if ((_nextConfig_experimental = nextConfig.experimental) == null ? void 0 : _nextConfig_experimental.runtimeServerDeploymentId) {
|
||||
if (!process.env.NEXT_DEPLOYMENT_ID) {
|
||||
throw Object.defineProperty(new Error('process.env.NEXT_DEPLOYMENT_ID is missing but runtimeServerDeploymentId is enabled'), "__NEXT_ERROR_CODE", {
|
||||
value: "E970",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
deploymentId = process.env.NEXT_DEPLOYMENT_ID;
|
||||
} else {
|
||||
deploymentId = nextConfig.deploymentId || '';
|
||||
}
|
||||
return {
|
||||
query,
|
||||
originalQuery,
|
||||
originalPathname,
|
||||
params,
|
||||
parsedUrl,
|
||||
locale,
|
||||
isNextDataRequest,
|
||||
locales: i18n == null ? void 0 : i18n.locales,
|
||||
defaultLocale,
|
||||
isDraftMode,
|
||||
previewData,
|
||||
pageIsDynamic,
|
||||
resolvedPathname,
|
||||
encodedResolvedPathname,
|
||||
isOnDemandRevalidate,
|
||||
revalidateOnlyGenerated,
|
||||
...manifests,
|
||||
// loadManifest returns a readonly object, but we don't want to propagate that throughout the
|
||||
// whole codebase (for now)
|
||||
nextConfig: nextConfig,
|
||||
routerServerContext,
|
||||
deploymentId
|
||||
};
|
||||
}
|
||||
getResponseCache(req) {
|
||||
if (!this.responseCache) {
|
||||
const minimalMode = (Boolean(process.env.MINIMAL_MODE) || (0, _requestmeta.getRequestMeta)(req, 'minimalMode')) ?? false;
|
||||
this.responseCache = new _responsecache.default(minimalMode);
|
||||
}
|
||||
return this.responseCache;
|
||||
}
|
||||
async handleResponse({ req, nextConfig, cacheKey, routeKind, isFallback, prerenderManifest, isRoutePPREnabled, isOnDemandRevalidate, revalidateOnlyGenerated, responseGenerator, waitUntil, isMinimalMode }) {
|
||||
const responseCache = this.getResponseCache(req);
|
||||
const cacheEntry = await responseCache.get(cacheKey, responseGenerator, {
|
||||
routeKind,
|
||||
isFallback,
|
||||
isRoutePPREnabled,
|
||||
isOnDemandRevalidate,
|
||||
isPrefetch: req.headers.purpose === 'prefetch',
|
||||
incrementalCache: await this.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode),
|
||||
waitUntil
|
||||
});
|
||||
if (!cacheEntry) {
|
||||
if (cacheKey && // revalidate only generated can bail even if cacheKey is provided
|
||||
!(isOnDemandRevalidate && revalidateOnlyGenerated)) {
|
||||
// A cache entry might not be generated if a response is written
|
||||
// in `getInitialProps` or `getServerSideProps`, but those shouldn't
|
||||
// have a cache key. If we do have a cache key but we don't end up
|
||||
// with a cache entry, then either Next.js or the application has a
|
||||
// bug that needs fixing.
|
||||
throw Object.defineProperty(new Error('invariant: cache entry required but not generated'), "__NEXT_ERROR_CODE", {
|
||||
value: "E62",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
return cacheEntry;
|
||||
}
|
||||
}
|
||||
|
||||
//# sourceMappingURL=route-module.js.map
|
||||
Reference in New Issue
Block a user