UNPKG

20.6 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../client/route-loader.ts"],"names":["MS_MAX_IDLE_DELAY","withFuture","key","map","generator","entry","get","future","Promise","resolve","resolver","prom","set","then","value","hasPrefetch","link","document","createElement","window","MSInputMethodContext","documentMode","relList","supports","canPrefetch","prefetchViaDom","href","as","res","rej","querySelector","rel","crossOrigin","process","env","__NEXT_CROSS_ORIGIN","onload","onerror","head","appendChild","ASSET_LOAD_ERROR","Symbol","markAssetError","err","Object","defineProperty","isAssetError","appendScript","src","script","reject","Error","body","resolvePromiseWithTimeout","p","ms","cancelled","r","catch","setTimeout","getClientBuildManifest","self","__BUILD_MANIFEST","onBuildManifest","cb","__BUILD_MANIFEST_CB","getFilesForRoute","assetPrefix","route","NODE_ENV","scripts","encodeURI","css","manifest","allFiles","filter","v","endsWith","createRouteLoader","entrypoints","Map","loadedScripts","styleSheets","routes","maybeExecuteScript","fetchStyleSheet","fetch","ok","text","content","whenEntrypoint","onEntrypoint","execute","fn","exports","component","default","error","input","old","loadRoute","prefetch","all","has","entrypoint","styles","assign","cn","navigator","connection","saveData","test","effectiveType","output"],"mappings":"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","sourcesContent":["import { ComponentType } from 'react'\nimport { ClientBuildManifest } from '../build/webpack/plugins/build-manifest-plugin'\nimport getAssetPathFromRoute from '../next-server/lib/router/utils/get-asset-path-from-route'\nimport { requestIdleCallback } from './request-idle-callback'\n\n// 3.8s was arbitrarily chosen as it's what https://web.dev/interactive\n// considers as \"Good\" time-to-interactive. We must assume something went\n// wrong beyond this point, and then fall-back to a full page transition to\n// show the user something of value.\nconst MS_MAX_IDLE_DELAY = 3800\n\ndeclare global {\n interface Window {\n __BUILD_MANIFEST?: ClientBuildManifest\n __BUILD_MANIFEST_CB?: Function\n }\n}\n\nexport interface LoadedEntrypointSuccess {\n component: ComponentType\n exports: any\n}\nexport interface LoadedEntrypointFailure {\n error: unknown\n}\nexport type RouteEntrypoint = LoadedEntrypointSuccess | LoadedEntrypointFailure\n\nexport interface RouteStyleSheet {\n href: string\n content: string\n}\n\nexport interface LoadedRouteSuccess extends LoadedEntrypointSuccess {\n styles: RouteStyleSheet[]\n}\nexport interface LoadedRouteFailure {\n error: unknown\n}\nexport type RouteLoaderEntry = LoadedRouteSuccess | LoadedRouteFailure\n\nexport type Future<V> = {\n resolve: (entrypoint: V) => void\n future: Promise<V>\n}\nfunction withFuture<T>(\n key: string,\n map: Map<string, Future<T> | T>,\n generator?: () => Promise<T>\n): Promise<T> {\n let entry: Future<T> | T | undefined = map.get(key)\n if (entry) {\n if ('future' in entry) {\n return entry.future\n }\n return Promise.resolve(entry)\n }\n let resolver: (entrypoint: T) => void\n const prom: Promise<T> = new Promise<T>((resolve) => {\n resolver = resolve\n })\n map.set(key, (entry = { resolve: resolver!, future: prom }))\n return generator\n ? // eslint-disable-next-line no-sequences\n generator().then((value) => (resolver(value), value))\n : prom\n}\n\nexport interface RouteLoader {\n whenEntrypoint(route: string): Promise<RouteEntrypoint>\n onEntrypoint(route: string, execute: () => unknown): void\n loadRoute(route: string, prefetch?: boolean): Promise<RouteLoaderEntry>\n prefetch(route: string): Promise<void>\n}\n\nfunction hasPrefetch(link?: HTMLLinkElement): boolean {\n try {\n link = document.createElement('link')\n return (\n // detect IE11 since it supports prefetch but isn't detected\n // with relList.support\n (!!window.MSInputMethodContext && !!(document as any).documentMode) ||\n link.relList.supports('prefetch')\n )\n } catch {\n return false\n }\n}\n\nconst canPrefetch: boolean = hasPrefetch()\n\nfunction prefetchViaDom(\n href: string,\n as: string,\n link?: HTMLLinkElement\n): Promise<any> {\n return new Promise<void>((res, rej) => {\n if (document.querySelector(`link[rel=\"prefetch\"][href^=\"${href}\"]`)) {\n return res()\n }\n\n link = document.createElement('link')\n\n // The order of property assignment here is intentional:\n if (as) link!.as = as\n link!.rel = `prefetch`\n link!.crossOrigin = process.env.__NEXT_CROSS_ORIGIN!\n link!.onload = res as any\n link!.onerror = rej\n\n // `href` should always be last:\n link!.href = href\n\n document.head.appendChild(link)\n })\n}\n\nconst ASSET_LOAD_ERROR = Symbol('ASSET_LOAD_ERROR')\n// TODO: unexport\nexport function markAssetError(err: Error): Error {\n return Object.defineProperty(err, ASSET_LOAD_ERROR, {})\n}\n\nexport function isAssetError(err?: Error): boolean | undefined {\n return err && ASSET_LOAD_ERROR in err\n}\n\nfunction appendScript(\n src: string,\n script?: HTMLScriptElement\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n script = document.createElement('script')\n\n // The order of property assignment here is intentional.\n // 1. Setup success/failure hooks in case the browser synchronously\n // executes when `src` is set.\n script.onload = resolve\n script.onerror = () =>\n reject(markAssetError(new Error(`Failed to load script: ${src}`)))\n\n // 2. Configure the cross-origin attribute before setting `src` in case the\n // browser begins to fetch.\n script.crossOrigin = process.env.__NEXT_CROSS_ORIGIN!\n\n // 3. Finally, set the source and inject into the DOM in case the child\n // must be appended for fetching to start.\n script.src = src\n document.body.appendChild(script)\n })\n}\n\n// Resolve a promise that times out after given amount of milliseconds.\nfunction resolvePromiseWithTimeout<T>(\n p: Promise<T>,\n ms: number,\n err: Error\n): Promise<T> {\n return new Promise((resolve, reject) => {\n let cancelled = false\n\n p.then((r) => {\n // Resolved, cancel the timeout\n cancelled = true\n resolve(r)\n }).catch(reject)\n\n requestIdleCallback(() =>\n setTimeout(() => {\n if (!cancelled) {\n reject(err)\n }\n }, ms)\n )\n })\n}\n\n// TODO: stop exporting or cache the failure\n// It'd be best to stop exporting this. It's an implementation detail. We're\n// only exporting it for backwards compatibilty with the `page-loader`.\n// Only cache this response as a last resort if we cannot eliminate all other\n// code branches that use the Build Manifest Callback and push them through\n// the Route Loader interface.\nexport function getClientBuildManifest(): Promise<ClientBuildManifest> {\n if (self.__BUILD_MANIFEST) {\n return Promise.resolve(self.__BUILD_MANIFEST)\n }\n\n const onBuildManifest: Promise<ClientBuildManifest> = new Promise<\n ClientBuildManifest\n >((resolve) => {\n // Mandatory because this is not concurrent safe:\n const cb = self.__BUILD_MANIFEST_CB\n self.__BUILD_MANIFEST_CB = () => {\n resolve(self.__BUILD_MANIFEST!)\n cb && cb()\n }\n })\n\n return resolvePromiseWithTimeout<ClientBuildManifest>(\n onBuildManifest,\n MS_MAX_IDLE_DELAY,\n markAssetError(new Error('Failed to load client build manifest'))\n )\n}\n\ninterface RouteFiles {\n scripts: string[]\n css: string[]\n}\nfunction getFilesForRoute(\n assetPrefix: string,\n route: string\n): Promise<RouteFiles> {\n if (process.env.NODE_ENV === 'development') {\n return Promise.resolve({\n scripts: [\n assetPrefix +\n '/_next/static/chunks/pages' +\n encodeURI(getAssetPathFromRoute(route, '.js')),\n ],\n // Styles are handled by `style-loader` in development:\n css: [],\n })\n }\n return getClientBuildManifest().then((manifest) => {\n if (!(route in manifest)) {\n throw markAssetError(new Error(`Failed to lookup route: ${route}`))\n }\n const allFiles = manifest[route].map(\n (entry) => assetPrefix + '/_next/' + encodeURI(entry)\n )\n return {\n scripts: allFiles.filter((v) => v.endsWith('.js')),\n css: allFiles.filter((v) => v.endsWith('.css')),\n }\n })\n}\n\nfunction createRouteLoader(assetPrefix: string): RouteLoader {\n const entrypoints: Map<\n string,\n Future<RouteEntrypoint> | RouteEntrypoint\n > = new Map()\n const loadedScripts: Map<string, Promise<unknown>> = new Map()\n const styleSheets: Map<string, Promise<RouteStyleSheet>> = new Map()\n const routes: Map<\n string,\n Future<RouteLoaderEntry> | RouteLoaderEntry\n > = new Map()\n\n function maybeExecuteScript(src: string): Promise<unknown> {\n let prom: Promise<unknown> | undefined = loadedScripts.get(src)\n if (prom) {\n return prom\n }\n\n // Skip executing script if it's already in the DOM:\n if (document.querySelector(`script[src^=\"${src}\"]`)) {\n return Promise.resolve()\n }\n\n loadedScripts.set(src, (prom = appendScript(src)))\n return prom\n }\n\n function fetchStyleSheet(href: string): Promise<RouteStyleSheet> {\n let prom: Promise<RouteStyleSheet> | undefined = styleSheets.get(href)\n if (prom) {\n return prom\n }\n\n styleSheets.set(\n href,\n (prom = fetch(href)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`Failed to load stylesheet: ${href}`)\n }\n return res.text().then((text) => ({ href: href, content: text }))\n })\n .catch((err) => {\n throw markAssetError(err)\n }))\n )\n return prom\n }\n\n return {\n whenEntrypoint(route: string) {\n return withFuture(route, entrypoints)\n },\n onEntrypoint(route: string, execute: () => unknown) {\n Promise.resolve(execute)\n .then((fn) => fn())\n .then(\n (exports: any) => ({\n component: (exports && exports.default) || exports,\n exports: exports,\n }),\n (err) => ({ error: err })\n )\n .then((input: RouteEntrypoint) => {\n const old = entrypoints.get(route)\n entrypoints.set(route, input)\n if (old && 'resolve' in old) old.resolve(input)\n })\n },\n loadRoute(route: string, prefetch?: boolean) {\n return withFuture<RouteLoaderEntry>(route, routes, () => {\n return resolvePromiseWithTimeout(\n getFilesForRoute(assetPrefix, route)\n .then(({ scripts, css }) => {\n return Promise.all([\n entrypoints.has(route)\n ? []\n : Promise.all(scripts.map(maybeExecuteScript)),\n Promise.all(css.map(fetchStyleSheet)),\n ] as const)\n })\n .then((res) => {\n return this.whenEntrypoint(route).then((entrypoint) => ({\n entrypoint,\n styles: res[1],\n }))\n }),\n MS_MAX_IDLE_DELAY,\n markAssetError(new Error(`Route did not complete loading: ${route}`))\n )\n .then(({ entrypoint, styles }) => {\n const res: RouteLoaderEntry = Object.assign<\n { styles: RouteStyleSheet[] },\n RouteEntrypoint\n >({ styles: styles! }, entrypoint)\n return 'error' in entrypoint ? entrypoint : res\n })\n .catch((err) => {\n if (prefetch) {\n // we don't want to cache errors during prefetch\n throw err\n }\n return { error: err }\n })\n })\n },\n prefetch(route: string): Promise<void> {\n // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118\n // License: Apache 2.0\n let cn\n if ((cn = (navigator as any).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 return getFilesForRoute(assetPrefix, route)\n .then((output) =>\n Promise.all(\n canPrefetch\n ? output.scripts.map((script) => prefetchViaDom(script, 'script'))\n : []\n )\n )\n .then(() => {\n requestIdleCallback(() => this.loadRoute(route, true).catch(() => {}))\n })\n .catch(\n // swallow prefetch errors\n () => {}\n )\n },\n }\n}\n\nexport default createRouteLoader\n"]}
\No newline at end of file