UNPKG

next-csrf

Version:

CSRF mitigation library for Next.js

1 lines 52.2 kB
{"ast":null,"code":"\"use strict\";\n\nvar _classCallCheck = require(\"@babel/runtime/helpers/classCallCheck\");\n\nvar _createClass = require(\"@babel/runtime/helpers/createClass\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports[\"default\"] = exports.looseToArray = void 0;\n\nvar _mitt = _interopRequireDefault(require(\"../next-server/lib/mitt\"));\n\nvar _router = require(\"../next-server/lib/router/router\");\n\nvar _escapePathDelimiters = _interopRequireDefault(require(\"../next-server/lib/router/utils/escape-path-delimiters\"));\n\nvar _getAssetPathFromRoute = _interopRequireDefault(require(\"../next-server/lib/router/utils/get-asset-path-from-route\"));\n\nvar _isDynamic = require(\"../next-server/lib/router/utils/is-dynamic\");\n\nvar _parseRelativeUrl = require(\"../next-server/lib/router/utils/parse-relative-url\");\n\nvar _querystring = require(\"../next-server/lib/router/utils/querystring\");\n\nvar _routeMatcher = require(\"../next-server/lib/router/utils/route-matcher\");\n\nvar _routeRegex = require(\"../next-server/lib/router/utils/route-regex\");\n\nvar looseToArray = function looseToArray(input) {\n return [].slice.call(input);\n};\n\nexports.looseToArray = looseToArray;\n\nfunction getInitialStylesheets() {\n return looseToArray(document.styleSheets).filter(function (el) {\n return el.ownerNode && el.ownerNode.tagName === 'LINK' && el.ownerNode.hasAttribute('data-n-p');\n }).map(function (sheet) {\n return {\n href: sheet.ownerNode.getAttribute('href'),\n text: looseToArray(sheet.cssRules).map(function (r) {\n return r.cssText;\n }).join('')\n };\n });\n}\n\nfunction hasRel(rel, link) {\n try {\n link = document.createElement('link');\n return link.relList.supports(rel);\n } catch (_unused) {}\n}\n\nfunction pageLoadError(route) {\n return (0, _router.markLoadingError)(new Error(\"Error loading \".concat(route)));\n}\n\nvar relPrefetch = hasRel('preload') && !hasRel('prefetch') ? // https://caniuse.com/#feat=link-rel-preload\n// macOS and iOS (Safari does not support prefetch)\n'preload' : // https://caniuse.com/#feat=link-rel-prefetch\n// IE 11, Edge 12+, nearly all evergreen\n'prefetch';\nvar relPreload = hasRel('preload') ? 'preload' : relPrefetch;\nvar relPreloadStyle = 'fetch';\nvar hasNoModule = ('noModule' in document.createElement('script'));\n\nfunction normalizeRoute(route) {\n if (route[0] !== '/') {\n throw new Error(\"Route name should start with a \\\"/\\\", got \\\"\".concat(route, \"\\\"\"));\n }\n\n if (route === '/') return route;\n return route.replace(/\\/$/, '');\n}\n\nfunction appendLink(href, rel, as, link) {\n return new Promise(function (res, rej) {\n link = document.createElement('link'); // The order of property assignment here is intentional:\n\n if (as) link.as = as;\n link.rel = rel;\n link.crossOrigin = process.env.__NEXT_CROSS_ORIGIN;\n link.onload = res;\n link.onerror = rej; // `href` should always be last:\n\n link.href = href;\n document.head.appendChild(link);\n });\n}\n\nfunction loadScript(url) {\n return new Promise(function (res, rej) {\n var script = document.createElement('script');\n\n if (process.env.__NEXT_MODERN_BUILD && hasNoModule) {\n script.type = 'module';\n }\n\n script.crossOrigin = process.env.__NEXT_CROSS_ORIGIN;\n script.src = url;\n script.onload = res;\n\n script.onerror = function () {\n return rej(pageLoadError(url));\n };\n\n document.body.appendChild(script);\n });\n}\n\nvar PageLoader = /*#__PURE__*/function () {\n function PageLoader(buildId, assetPrefix, initialPage) {\n _classCallCheck(this, PageLoader);\n\n this.initialPage = void 0;\n this.buildId = void 0;\n this.assetPrefix = void 0;\n this.pageCache = void 0;\n this.pageRegisterEvents = void 0;\n this.loadingRoutes = void 0;\n this.promisedBuildManifest = void 0;\n this.promisedSsgManifest = void 0;\n this.promisedDevPagesManifest = void 0;\n this.initialPage = initialPage;\n this.buildId = buildId;\n this.assetPrefix = assetPrefix;\n this.pageCache = {};\n this.pageRegisterEvents = (0, _mitt[\"default\"])();\n this.loadingRoutes = {\n // By default these 2 pages are being loaded in the initial html\n '/_app': true\n }; // TODO: get rid of this limitation for rendering the error page\n\n if (initialPage !== '/_error') {\n this.loadingRoutes[initialPage] = true;\n }\n\n this.promisedBuildManifest = new Promise(function (resolve) {\n if (window.__BUILD_MANIFEST) {\n resolve(window.__BUILD_MANIFEST);\n } else {\n ;\n\n window.__BUILD_MANIFEST_CB = function () {\n resolve(window.__BUILD_MANIFEST);\n };\n }\n });\n /** @type {Promise<Set<string>>} */\n\n this.promisedSsgManifest = new Promise(function (resolve) {\n if (window.__SSG_MANIFEST) {\n resolve(window.__SSG_MANIFEST);\n } else {\n ;\n\n window.__SSG_MANIFEST_CB = function () {\n resolve(window.__SSG_MANIFEST);\n };\n }\n });\n }\n\n _createClass(PageLoader, [{\n key: \"getPageList\",\n value: function getPageList() {\n if (false) {\n return this.promisedBuildManifest.then(function (buildManifest) {\n return buildManifest.sortedPages;\n });\n } else {\n if (window.__DEV_PAGES_MANIFEST) {\n return window.__DEV_PAGES_MANIFEST.pages;\n } else {\n if (!this.promisedDevPagesManifest) {\n this.promisedDevPagesManifest = fetch(\"\".concat(this.assetPrefix, \"/_next/static/development/_devPagesManifest.json\")).then(function (res) {\n return res.json();\n }).then(function (manifest) {\n ;\n window.__DEV_PAGES_MANIFEST = manifest;\n return manifest.pages;\n })[\"catch\"](function (err) {\n console.log(\"Failed to fetch devPagesManifest\", err);\n });\n }\n\n return this.promisedDevPagesManifest;\n }\n }\n } // Returns a promise for the dependencies for a particular route\n\n }, {\n key: \"getDependencies\",\n value: function getDependencies(route) {\n var _this = this;\n\n return this.promisedBuildManifest.then(function (m) {\n return m[route] ? m[route].map(function (url) {\n return \"\".concat(_this.assetPrefix, \"/_next/\").concat(encodeURI(url));\n }) : Promise.reject(pageLoadError(route));\n });\n }\n /**\n * @param {string} href the route href (file-system path)\n * @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes\n */\n\n }, {\n key: \"getDataHref\",\n value: function getDataHref(href, asPath, ssg) {\n var _this2 = this;\n\n var _ref = (0, _parseRelativeUrl.parseRelativeUrl)(href),\n hrefPathname = _ref.pathname,\n searchParams = _ref.searchParams,\n search = _ref.search;\n\n var query = (0, _querystring.searchParamsToUrlQuery)(searchParams);\n\n var _ref2 = (0, _parseRelativeUrl.parseRelativeUrl)(asPath),\n asPathname = _ref2.pathname;\n\n var route = normalizeRoute(hrefPathname);\n\n var getHrefForSlug = function getHrefForSlug(path) {\n var dataRoute = (0, _getAssetPathFromRoute[\"default\"])(path, '.json');\n return (0, _router.addBasePath)(\"/_next/data/\".concat(_this2.buildId).concat(dataRoute).concat(ssg ? '' : search));\n };\n\n var isDynamic = (0, _isDynamic.isDynamicRoute)(route),\n interpolatedRoute;\n\n if (isDynamic) {\n var dynamicRegex = (0, _routeRegex.getRouteRegex)(route);\n var dynamicGroups = dynamicRegex.groups;\n var dynamicMatches = // Try to match the dynamic route against the asPath\n (0, _routeMatcher.getRouteMatcher)(dynamicRegex)(asPathname) || // Fall back to reading the values from the href\n // TODO: should this take priority; also need to change in the router.\n query;\n interpolatedRoute = route;\n\n if (!Object.keys(dynamicGroups).every(function (param) {\n var value = dynamicMatches[param] || '';\n var _dynamicGroups$param = dynamicGroups[param],\n repeat = _dynamicGroups$param.repeat,\n optional = _dynamicGroups$param.optional; // support single-level catch-all\n // TODO: more robust handling for user-error (passing `/`)\n\n var replaced = \"[\".concat(repeat ? '...' : '').concat(param, \"]\");\n\n if (optional) {\n replaced = \"\".concat(!value ? '/' : '', \"[\").concat(replaced, \"]\");\n }\n\n if (repeat && !Array.isArray(value)) value = [value];\n return (optional || param in dynamicMatches) && ( // Interpolate group into data URL if present\n interpolatedRoute = interpolatedRoute.replace(replaced, repeat ? value.map(_escapePathDelimiters[\"default\"]).join('/') : (0, _escapePathDelimiters[\"default\"])(value)) || '/');\n })) {\n interpolatedRoute = ''; // did not satisfy all requirements\n // n.b. We ignore this error because we handle warning for this case in\n // development in the `<Link>` component directly.\n }\n }\n\n return isDynamic ? interpolatedRoute && getHrefForSlug(interpolatedRoute) : getHrefForSlug(route);\n }\n /**\n * @param {string} href the route href (file-system path)\n * @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes\n */\n\n }, {\n key: \"prefetchData\",\n value: function prefetchData(href, asPath) {\n var _this3 = this;\n\n var _ref3 = (0, _parseRelativeUrl.parseRelativeUrl)(href),\n hrefPathname = _ref3.pathname;\n\n var route = normalizeRoute(hrefPathname);\n return this.promisedSsgManifest.then(function (s, _dataHref) {\n return (// Check if the route requires a data file\n s.has(route) && ( // Try to generate data href, noop when falsy\n _dataHref = _this3.getDataHref(href, asPath, true)) && // noop when data has already been prefetched (dedupe)\n !document.querySelector(\"link[rel=\\\"\".concat(relPrefetch, \"\\\"][href^=\\\"\").concat(_dataHref, \"\\\"]\")) && // Inject the `<link rel=prefetch>` tag for above computed `href`.\n appendLink(_dataHref, relPrefetch, 'fetch')[\"catch\"](function () {\n /* ignore prefetch error */\n })\n );\n });\n }\n }, {\n key: \"loadPage\",\n value: function loadPage(route) {\n var _this4 = this;\n\n route = normalizeRoute(route);\n return new Promise(function (resolve, reject) {\n // If there's a cached version of the page, let's use it.\n var cachedPage = _this4.pageCache[route];\n\n if (cachedPage) {\n if ('error' in cachedPage) {\n reject(cachedPage.error);\n } else {\n resolve(cachedPage);\n }\n\n return;\n }\n\n var fire = function fire(pageToCache) {\n _this4.pageRegisterEvents.off(route, fire);\n\n delete _this4.loadingRoutes[route];\n\n if ('error' in pageToCache) {\n reject(pageToCache.error);\n } else {\n resolve(pageToCache);\n }\n }; // Register a listener to get the page\n\n\n _this4.pageRegisterEvents.on(route, fire);\n\n if (!_this4.loadingRoutes[route]) {\n _this4.loadingRoutes[route] = true;\n\n if (false) {\n _this4.getDependencies(route).then(function (deps) {\n var pending = [];\n deps.forEach(function (d) {\n if (d.endsWith('.js') && !document.querySelector(\"script[src^=\\\"\".concat(d, \"\\\"]\"))) {\n pending.push(loadScript(d));\n } // Prefetch CSS as it'll be needed when the page JavaScript\n // evaluates. This will only trigger if explicit prefetching is\n // disabled for a <Link>... prefetching in this case is desirable\n // because we *know* it's going to be used very soon (page was\n // loaded).\n\n\n if (d.endsWith('.css') && !document.querySelector(\"link[rel=\\\"\".concat(relPreload, \"\\\"][href^=\\\"\").concat(d, \"\\\"]\"))) {\n // This is not pushed into `pending` because we don't need to\n // wait for these to resolve. To prevent an unhandled\n // rejection, we swallow the error which is handled later in\n // the rendering cycle (this is just a preload optimization).\n appendLink(d, relPreload, relPreloadStyle)[\"catch\"](function () {\n /* ignore preload error */\n });\n }\n });\n return Promise.all(pending);\n })[\"catch\"](function (err) {\n // Mark the page as failed to load if any of its required scripts\n // fail to load:\n _this4.pageCache[route] = {\n error: err\n };\n fire({\n error: err\n });\n });\n } else {\n // Development only. In production the page file is part of the build manifest\n route = normalizeRoute(route);\n var scriptRoute = (0, _getAssetPathFromRoute[\"default\"])(route, '.js');\n var url = \"\".concat(_this4.assetPrefix, \"/_next/static/chunks/pages\").concat(encodeURI(scriptRoute));\n loadScript(url)[\"catch\"](function (err) {\n // Mark the page as failed to load if its script fails to load:\n _this4.pageCache[route] = {\n error: err\n };\n fire({\n error: err\n });\n });\n }\n }\n });\n } // This method if called by the route code.\n\n }, {\n key: \"registerPage\",\n value: function registerPage(route, regFn) {\n var _this5 = this;\n\n var register = function register(styleSheets) {\n try {\n var mod = regFn();\n var pageData = {\n page: mod[\"default\"] || mod,\n mod: mod,\n styleSheets: styleSheets\n };\n _this5.pageCache[route] = pageData;\n\n _this5.pageRegisterEvents.emit(route, pageData);\n } catch (error) {\n _this5.pageCache[route] = {\n error: error\n };\n\n _this5.pageRegisterEvents.emit(route, {\n error: error\n });\n }\n };\n\n if (true) {\n // Wait for webpack to become idle if it's not.\n // More info: https://github.com/vercel/next.js/pull/1511\n if (module.hot && module.hot.status() !== 'idle') {\n console.log(\"Waiting for webpack to become \\\"idle\\\" to initialize the page: \\\"\".concat(route, \"\\\"\"));\n\n var check = function check(status) {\n if (status === 'idle') {\n ;\n module.hot.removeStatusHandler(check);\n register(\n /* css is handled via style-loader in development */\n []);\n }\n };\n\n module.hot.status(check);\n return;\n }\n }\n\n function fetchStyleSheet(href) {\n return fetch(href).then(function (res) {\n if (!res.ok) throw pageLoadError(href);\n return res.text().then(function (text) {\n return {\n href: href,\n text: text\n };\n });\n });\n }\n\n var isInitialLoad = route === this.initialPage;\n var promisedDeps = // Shared styles will already be on the page:\n route === '/_app' || // We use `style-loader` in development:\n true ? Promise.resolve([]) : // Tests that this does not block hydration:\n // test/integration/css-fixtures/hydrate-without-deps/\n (isInitialLoad ? Promise.resolve(looseToArray(document.querySelectorAll('link[data-n-p]')).map(function (e) {\n return e.getAttribute('href');\n })) : this.getDependencies(route).then(function (deps) {\n return deps.filter(function (d) {\n return d.endsWith('.css');\n });\n })).then(function (cssFiles) {\n return (// These files should've already been fetched by now, so this\n // should resolve instantly.\n Promise.all(cssFiles.map(function (d) {\n return fetchStyleSheet(d);\n }))[\"catch\"](function (err) {\n if (isInitialLoad) return getInitialStylesheets();\n throw err;\n })\n );\n });\n promisedDeps.then(function (deps) {\n return register(deps);\n }, function (error) {\n _this5.pageCache[route] = {\n error: error\n };\n\n _this5.pageRegisterEvents.emit(route, {\n error: error\n });\n });\n }\n /**\n * @param {string} route\n * @param {boolean} [isDependency]\n */\n\n }, {\n key: \"prefetch\",\n value: function prefetch(route, isDependency) {\n var _this6 = this;\n\n // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118\n // License: Apache 2.0\n var cn;\n\n if (cn = navigator.connection) {\n // Don't prefetch if using 2G or if Save-Data is enabled.\n if (cn.saveData || /2g/.test(cn.effectiveType)) return Promise.resolve();\n }\n /** @type {string} */\n\n\n var url;\n\n if (isDependency) {\n url = route;\n } else {\n if (true) {\n route = normalizeRoute(route);\n var ext = process.env.__NEXT_MODERN_BUILD && hasNoModule ? '.module.js' : '.js';\n var scriptRoute = (0, _getAssetPathFromRoute[\"default\"])(route, ext);\n url = \"\".concat(this.assetPrefix, \"/_next/static/\").concat(encodeURIComponent(this.buildId), \"/pages\").concat(encodeURI(scriptRoute));\n }\n }\n\n return Promise.all(document.querySelector(\"link[rel=\\\"\".concat(relPrefetch, \"\\\"][href^=\\\"\").concat(url, \"\\\"]\")) ? [] : [url && appendLink(url, relPrefetch, url.endsWith('.css') ? relPreloadStyle : 'script'), false && !isDependency && this.getDependencies(route).then(function (urls) {\n return Promise.all(urls.map(function (dependencyUrl) {\n return _this6.prefetch(dependencyUrl, true);\n }));\n })]).then( // do not return any data\n function () {}, // swallow prefetch errors\n function () {});\n }\n }]);\n\n return PageLoader;\n}();\n\nexports[\"default\"] = PageLoader;","map":{"version":3,"sources":["../../client/page-loader.ts"],"names":["looseToArray","input","document","el","sheet","href","text","r","link","relPrefetch","hasRel","relPreload","relPreloadStyle","hasNoModule","route","process","script","rej","pageLoadError","PageLoader","initialPage","buildId","assetPrefix","pageCache","pageRegisterEvents","loadingRoutes","promisedBuildManifest","promisedSsgManifest","promisedDevPagesManifest","constructor","resolve","window","getPageList","buildManifest","fetch","res","manifest","err","console","m","url","encodeURI","Promise","getDataHref","pathname","query","normalizeRoute","getHrefForSlug","path","dataRoute","ssg","isDynamic","dynamicRegex","dynamicGroups","dynamicMatches","interpolatedRoute","Object","param","value","replaced","repeat","Array","optional","escapePathDelimiters","prefetchData","s","_dataHref","appendLink","loadPage","cachedPage","reject","fire","pageToCache","deps","pending","d","loadScript","error","scriptRoute","registerPage","register","styleSheets","mod","regFn","pageData","page","module","check","status","isInitialLoad","promisedDeps","e","cssFiles","fetchStyleSheet","getInitialStylesheets","prefetch","cn","navigator","ext","encodeURIComponent","urls","dependencyUrl"],"mappings":"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","sourcesContent":["import { ComponentType } from 'react'\nimport type { ClientSsgManifest } from '../build'\nimport type { ClientBuildManifest } from '../build/webpack/plugins/build-manifest-plugin'\nimport mitt from '../next-server/lib/mitt'\nimport type { MittEmitter } from '../next-server/lib/mitt'\nimport { addBasePath, markLoadingError } from '../next-server/lib/router/router'\nimport escapePathDelimiters from '../next-server/lib/router/utils/escape-path-delimiters'\nimport getAssetPathFromRoute from '../next-server/lib/router/utils/get-asset-path-from-route'\nimport { isDynamicRoute } from '../next-server/lib/router/utils/is-dynamic'\nimport { parseRelativeUrl } from '../next-server/lib/router/utils/parse-relative-url'\nimport { searchParamsToUrlQuery } from '../next-server/lib/router/utils/querystring'\nimport { getRouteMatcher } from '../next-server/lib/router/utils/route-matcher'\nimport { getRouteRegex } from '../next-server/lib/router/utils/route-regex'\n\nexport const looseToArray = <T extends {}>(input: any): T[] =>\n [].slice.call(input)\n\nfunction getInitialStylesheets(): StyleSheetTuple[] {\n return looseToArray<CSSStyleSheet>(document.styleSheets)\n .filter(\n (el: CSSStyleSheet) =>\n el.ownerNode &&\n (el.ownerNode as Element).tagName === 'LINK' &&\n (el.ownerNode as Element).hasAttribute('data-n-p')\n )\n .map((sheet) => ({\n href: (sheet.ownerNode as Element).getAttribute('href')!,\n text: looseToArray<CSSRule>(sheet.cssRules)\n .map((r) => r.cssText)\n .join(''),\n }))\n}\n\nfunction hasRel(rel: string, link?: HTMLLinkElement) {\n try {\n link = document.createElement('link')\n return link.relList.supports(rel)\n } catch {}\n}\n\nfunction pageLoadError(route: string) {\n return markLoadingError(new Error(`Error loading ${route}`))\n}\n\nconst relPrefetch =\n hasRel('preload') && !hasRel('prefetch')\n ? // https://caniuse.com/#feat=link-rel-preload\n // macOS and iOS (Safari does not support prefetch)\n 'preload'\n : // https://caniuse.com/#feat=link-rel-prefetch\n // IE 11, Edge 12+, nearly all evergreen\n 'prefetch'\n\nconst relPreload = hasRel('preload') ? 'preload' : relPrefetch\nconst relPreloadStyle = 'fetch'\n\nconst hasNoModule = 'noModule' in document.createElement('script')\n\nfunction normalizeRoute(route: string) {\n if (route[0] !== '/') {\n throw new Error(`Route name should start with a \"/\", got \"${route}\"`)\n }\n\n if (route === '/') return route\n return route.replace(/\\/$/, '')\n}\n\nfunction appendLink(\n href: string,\n rel: string,\n as?: string,\n link?: HTMLLinkElement\n): Promise<any> {\n return new Promise((res, rej) => {\n link = document.createElement('link')\n\n // The order of property assignment here is intentional:\n if (as) link!.as = as\n link!.rel = rel\n link!.crossOrigin = process.env.__NEXT_CROSS_ORIGIN!\n link!.onload = res\n link!.onerror = rej\n\n // `href` should always be last:\n link!.href = href\n\n document.head.appendChild(link)\n })\n}\n\nfunction loadScript(url: string): Promise<any> {\n return new Promise((res, rej) => {\n const script = document.createElement('script')\n if (process.env.__NEXT_MODERN_BUILD && hasNoModule) {\n script.type = 'module'\n }\n script.crossOrigin = process.env.__NEXT_CROSS_ORIGIN!\n script.src = url\n script.onload = res\n script.onerror = () => rej(pageLoadError(url))\n document.body.appendChild(script)\n })\n}\n\nexport type StyleSheetTuple = { href: string; text: string }\nexport type GoodPageCache = {\n page: ComponentType\n mod: any\n styleSheets: StyleSheetTuple[]\n}\nexport type PageCacheEntry = { error: any } | GoodPageCache\n\nexport default class PageLoader {\n private initialPage: string\n private buildId: string\n private assetPrefix: string\n private pageCache: Record<string, PageCacheEntry>\n private pageRegisterEvents: MittEmitter\n private loadingRoutes: Record<string, boolean>\n private promisedBuildManifest?: Promise<ClientBuildManifest>\n private promisedSsgManifest?: Promise<ClientSsgManifest>\n private promisedDevPagesManifest?: Promise<any>\n\n constructor(buildId: string, assetPrefix: string, initialPage: string) {\n this.initialPage = initialPage\n\n this.buildId = buildId\n this.assetPrefix = assetPrefix\n\n this.pageCache = {}\n this.pageRegisterEvents = mitt()\n this.loadingRoutes = {\n // By default these 2 pages are being loaded in the initial html\n '/_app': true,\n }\n\n // TODO: get rid of this limitation for rendering the error page\n if (initialPage !== '/_error') {\n this.loadingRoutes[initialPage] = true\n }\n\n this.promisedBuildManifest = new Promise((resolve) => {\n if ((window as any).__BUILD_MANIFEST) {\n resolve((window as any).__BUILD_MANIFEST)\n } else {\n ;(window as any).__BUILD_MANIFEST_CB = () => {\n resolve((window as any).__BUILD_MANIFEST)\n }\n }\n })\n\n /** @type {Promise<Set<string>>} */\n this.promisedSsgManifest = new Promise((resolve) => {\n if ((window as any).__SSG_MANIFEST) {\n resolve((window as any).__SSG_MANIFEST)\n } else {\n ;(window as any).__SSG_MANIFEST_CB = () => {\n resolve((window as any).__SSG_MANIFEST)\n }\n }\n })\n }\n\n getPageList() {\n if (process.env.NODE_ENV === 'production') {\n return this.promisedBuildManifest!.then(\n (buildManifest) => buildManifest.sortedPages\n )\n } else {\n if ((window as any).__DEV_PAGES_MANIFEST) {\n return (window as any).__DEV_PAGES_MANIFEST.pages\n } else {\n if (!this.promisedDevPagesManifest) {\n this.promisedDevPagesManifest = fetch(\n `${this.assetPrefix}/_next/static/development/_devPagesManifest.json`\n )\n .then((res) => res.json())\n .then((manifest) => {\n ;(window as any).__DEV_PAGES_MANIFEST = manifest\n return manifest.pages\n })\n .catch((err) => {\n console.log(`Failed to fetch devPagesManifest`, err)\n })\n }\n return this.promisedDevPagesManifest\n }\n }\n }\n\n // Returns a promise for the dependencies for a particular route\n private getDependencies(route: string): Promise<string[]> {\n return this.promisedBuildManifest!.then((m) => {\n return m[route]\n ? m[route].map((url) => `${this.assetPrefix}/_next/${encodeURI(url)}`)\n : Promise.reject(pageLoadError(route))\n })\n }\n\n /**\n * @param {string} href the route href (file-system path)\n * @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes\n */\n getDataHref(href: string, asPath: string, ssg: boolean) {\n const { pathname: hrefPathname, searchParams, search } = parseRelativeUrl(\n href\n )\n const query = searchParamsToUrlQuery(searchParams)\n const { pathname: asPathname } = parseRelativeUrl(asPath)\n const route = normalizeRoute(hrefPathname)\n\n const getHrefForSlug = (path: string) => {\n const dataRoute = getAssetPathFromRoute(path, '.json')\n return addBasePath(\n `/_next/data/${this.buildId}${dataRoute}${ssg ? '' : search}`\n )\n }\n\n let isDynamic: boolean = isDynamicRoute(route),\n interpolatedRoute: string | undefined\n if (isDynamic) {\n const dynamicRegex = getRouteRegex(route)\n const dynamicGroups = dynamicRegex.groups\n const dynamicMatches =\n // Try to match the dynamic route against the asPath\n getRouteMatcher(dynamicRegex)(asPathname) ||\n // Fall back to reading the values from the href\n // TODO: should this take priority; also need to change in the router.\n query\n\n interpolatedRoute = route\n if (\n !Object.keys(dynamicGroups).every((param) => {\n let value = dynamicMatches[param] || ''\n const { repeat, optional } = dynamicGroups[param]\n\n // support single-level catch-all\n // TODO: more robust handling for user-error (passing `/`)\n let replaced = `[${repeat ? '...' : ''}${param}]`\n if (optional) {\n replaced = `${!value ? '/' : ''}[${replaced}]`\n }\n if (repeat && !Array.isArray(value)) value = [value]\n\n return (\n (optional || param in dynamicMatches) &&\n // Interpolate group into data URL if present\n (interpolatedRoute =\n interpolatedRoute!.replace(\n replaced,\n repeat\n ? (value as string[]).map(escapePathDelimiters).join('/')\n : escapePathDelimiters(value as string)\n ) || '/')\n )\n })\n ) {\n interpolatedRoute = '' // did not satisfy all requirements\n\n // n.b. We ignore this error because we handle warning for this case in\n // development in the `<Link>` component directly.\n }\n }\n\n return isDynamic\n ? interpolatedRoute && getHrefForSlug(interpolatedRoute)\n : getHrefForSlug(route)\n }\n\n /**\n * @param {string} href the route href (file-system path)\n * @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes\n */\n prefetchData(href: string, asPath: string) {\n const { pathname: hrefPathname } = parseRelativeUrl(href)\n const route = normalizeRoute(hrefPathname)\n return this.promisedSsgManifest!.then(\n (s: ClientSsgManifest, _dataHref?: string) =>\n // Check if the route requires a data file\n s.has(route) &&\n // Try to generate data href, noop when falsy\n (_dataHref = this.getDataHref(href, asPath, true)) &&\n // noop when data has already been prefetched (dedupe)\n !document.querySelector(\n `link[rel=\"${relPrefetch}\"][href^=\"${_dataHref}\"]`\n ) &&\n // Inject the `<link rel=prefetch>` tag for above computed `href`.\n appendLink(_dataHref, relPrefetch, 'fetch').catch(() => {\n /* ignore prefetch error */\n })\n )\n }\n\n loadPage(route: string): Promise<GoodPageCache> {\n route = normalizeRoute(route)\n\n return new Promise<GoodPageCache>((resolve, reject) => {\n // If there's a cached version of the page, let's use it.\n const cachedPage = this.pageCache[route]\n if (cachedPage) {\n if ('error' in cachedPage) {\n reject(cachedPage.error)\n } else {\n resolve(cachedPage)\n }\n return\n }\n\n const fire = (pageToCache: PageCacheEntry) => {\n this.pageRegisterEvents.off(route, fire)\n delete this.loadingRoutes[route]\n\n if ('error' in pageToCache) {\n reject(pageToCache.error)\n } else {\n resolve(pageToCache)\n }\n }\n\n // Register a listener to get the page\n this.pageRegisterEvents.on(route, fire)\n\n if (!this.loadingRoutes[route]) {\n this.loadingRoutes[route] = true\n if (process.env.NODE_ENV === 'production') {\n this.getDependencies(route)\n .then((deps) => {\n const pending: Promise<any>[] = []\n deps.forEach((d) => {\n if (\n d.endsWith('.js') &&\n !document.querySelector(`script[src^=\"${d}\"]`)\n ) {\n pending.push(loadScript(d))\n }\n\n // Prefetch CSS as it'll be needed when the page JavaScript\n // evaluates. This will only trigger if explicit prefetching is\n // disabled for a <Link>... prefetching in this case is desirable\n // because we *know* it's going to be used very soon (page was\n // loaded).\n if (\n d.endsWith('.css') &&\n !document.querySelector(\n `link[rel=\"${relPreload}\"][href^=\"${d}\"]`\n )\n ) {\n // This is not pushed into `pending` because we don't need to\n // wait for these to resolve. To prevent an unhandled\n // rejection, we swallow the error which is handled later in\n // the rendering cycle (this is just a preload optimization).\n appendLink(d, relPreload, relPreloadStyle).catch(() => {\n /* ignore preload error */\n })\n }\n })\n return Promise.all(pending)\n })\n .catch((err) => {\n // Mark the page as failed to load if any of its required scripts\n // fail to load:\n this.pageCache[route] = { error: err }\n fire({ error: err })\n })\n } else {\n // Development only. In production the page file is part of the build manifest\n route = normalizeRoute(route)\n let scriptRoute = getAssetPathFromRoute(route, '.js')\n\n const url = `${this.assetPrefix}/_next/static/chunks/pages${encodeURI(\n scriptRoute\n )}`\n loadScript(url).catch((err) => {\n // Mark the page as failed to load if its script fails to load:\n this.pageCache[route] = { error: err }\n fire({ error: err })\n })\n }\n }\n })\n }\n\n // This method if called by the route code.\n registerPage(route: string, regFn: () => any) {\n const register = (styleSheets: StyleSheetTuple[]) => {\n try {\n const mod = regFn()\n const pageData: PageCacheEntry = {\n page: mod.default || mod,\n mod,\n styleSheets,\n }\n this.pageCache[route] = pageData\n this.pageRegisterEvents.emit(route, pageData)\n } catch (error) {\n this.pageCache[route] = { error }\n this.pageRegisterEvents.emit(route, { error })\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // Wait for webpack to become idle if it's not.\n // More info: https://github.com/vercel/next.js/pull/1511\n if ((module as any).hot && (module as any).hot.status() !== 'idle') {\n console.log(\n `Waiting for webpack to become \"idle\" to initialize the page: \"${route}\"`\n )\n\n const check = (status: string) => {\n if (status === 'idle') {\n ;(module as any).hot.removeStatusHandler(check)\n register(\n /* css is handled via style-loader in development */\n []\n )\n }\n }\n ;(module as any).hot.status(check)\n return\n }\n }\n\n function fetchStyleSheet(href: string): Promise<StyleSheetTuple> {\n return fetch(href).then((res) => {\n if (!res.ok) throw pageLoadError(href)\n return res.text().then((text) => ({ href, text }))\n })\n }\n\n const isInitialLoad = route === this.initialPage\n const promisedDeps: Promise<StyleSheetTuple[]> =\n // Shared styles will already be on the page:\n route === '/_app' ||\n // We use `style-loader` in development:\n process.env.NODE_ENV !== 'production'\n ? Promise.resolve([])\n : // Tests that this does not block hydration:\n // test/integration/css-fixtures/hydrate-without-deps/\n (isInitialLoad\n ? Promise.resolve(\n looseToArray<HTMLLinkElement>(\n document.querySelectorAll('link[data-n-p]')\n ).map((e) => e.getAttribute('href')!)\n )\n : this.getDependencies(route).then((deps) =>\n deps.filter((d) => d.endsWith('.css'))\n )\n ).then((cssFiles) =>\n // These files should've already been fetched by now, so this\n // should resolve instantly.\n Promise.all(cssFiles.map((d) => fetchStyleSheet(d))).catch(\n (err) => {\n if (isIni