{"ast":null,"code":"\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.markAssetError = markAssetError;\nexports.isAssetError = isAssetError;\nexports.getClientBuildManifest = getClientBuildManifest;\nexports.default = void 0;\n\nvar _getAssetPathFromRoute = _interopRequireDefault(require(\"../next-server/lib/router/utils/get-asset-path-from-route\"));\n\nvar _requestIdleCallback = require(\"./request-idle-callback\"); // 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.\n\n\nconst MS_MAX_IDLE_DELAY = 3800;\n\nfunction withFuture(key, map, generator) {\n  let entry = map.get(key);\n\n  if (entry) {\n    if ('future' in entry) {\n      return entry.future;\n    }\n\n    return Promise.resolve(entry);\n  }\n\n  let resolver;\n  const prom = new Promise(resolve => {\n    resolver = resolve;\n  });\n  map.set(key, entry = {\n    resolve: resolver,\n    future: prom\n  });\n  return generator ? // eslint-disable-next-line no-sequences\n  generator().then(value => (resolver(value), value)) : prom;\n}\n\nfunction hasPrefetch(link) {\n  try {\n    link = document.createElement('link');\n    return (// detect IE11 since it supports prefetch but isn't detected\n      // with relList.support\n      !!window.MSInputMethodContext && !!document.documentMode || link.relList.supports('prefetch')\n    );\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst canPrefetch = hasPrefetch();\n\nfunction prefetchViaDom(href, as, link) {\n  return new Promise((res, rej) => {\n    if (document.querySelector(`link[rel=\"prefetch\"][href^=\"${href}\"]`)) {\n      return res();\n    }\n\n    link = document.createElement('link'); // The order of property assignment here is intentional:\n\n    if (as) link.as = as;\n    link.rel = `prefetch`;\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\nconst ASSET_LOAD_ERROR = Symbol('ASSET_LOAD_ERROR'); // TODO: unexport\n\nfunction markAssetError(err) {\n  return Object.defineProperty(err, ASSET_LOAD_ERROR, {});\n}\n\nfunction isAssetError(err) {\n  return err && ASSET_LOAD_ERROR in err;\n}\n\nfunction appendScript(src, script) {\n  return new Promise((resolve, reject) => {\n    script = document.createElement('script'); // 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\n    script.onload = resolve;\n\n    script.onerror = () => reject(markAssetError(new Error(`Failed to load script: ${src}`))); // 2. Configure the cross-origin attribute before setting `src` in case the\n    //    browser begins to fetch.\n\n\n    script.crossOrigin = process.env.__NEXT_CROSS_ORIGIN; // 3. Finally, set the source and inject into the DOM in case the child\n    //    must be appended for fetching to start.\n\n    script.src = src;\n    document.body.appendChild(script);\n  });\n} // Resolve a promise that times out after given amount of milliseconds.\n\n\nfunction resolvePromiseWithTimeout(p, ms, err) {\n  return new Promise((resolve, reject) => {\n    let cancelled = false;\n    p.then(r => {\n      // Resolved, cancel the timeout\n      cancelled = true;\n      resolve(r);\n    }).catch(reject);\n    (0, _requestIdleCallback.requestIdleCallback)(() => setTimeout(() => {\n      if (!cancelled) {\n        reject(err);\n      }\n    }, ms));\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.\n\n\nfunction getClientBuildManifest() {\n  if (self.__BUILD_MANIFEST) {\n    return Promise.resolve(self.__BUILD_MANIFEST);\n  }\n\n  const onBuildManifest = new Promise(resolve => {\n    // Mandatory because this is not concurrent safe:\n    const cb = self.__BUILD_MANIFEST_CB;\n\n    self.__BUILD_MANIFEST_CB = () => {\n      resolve(self.__BUILD_MANIFEST);\n      cb && cb();\n    };\n  });\n  return resolvePromiseWithTimeout(onBuildManifest, MS_MAX_IDLE_DELAY, markAssetError(new Error('Failed to load client build manifest')));\n}\n\nfunction getFilesForRoute(assetPrefix, route) {\n  if (true) {\n    return Promise.resolve({\n      scripts: [assetPrefix + '/_next/static/chunks/pages' + encodeURI((0, _getAssetPathFromRoute.default)(route, '.js'))],\n      // Styles are handled by `style-loader` in development:\n      css: []\n    });\n  }\n\n  return getClientBuildManifest().then(manifest => {\n    if (!(route in manifest)) {\n      throw markAssetError(new Error(`Failed to lookup route: ${route}`));\n    }\n\n    const allFiles = manifest[route].map(entry => assetPrefix + '/_next/' + encodeURI(entry));\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) {\n  const entrypoints = new Map();\n  const loadedScripts = new Map();\n  const styleSheets = new Map();\n  const routes = new Map();\n\n  function maybeExecuteScript(src) {\n    let prom = loadedScripts.get(src);\n\n    if (prom) {\n      return prom;\n    } // Skip executing script if it's already in the DOM:\n\n\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) {\n    let prom = styleSheets.get(href);\n\n    if (prom) {\n      return prom;\n    }\n\n    styleSheets.set(href, prom = fetch(href).then(res => {\n      if (!res.ok) {\n        throw new Error(`Failed to load stylesheet: ${href}`);\n      }\n\n      return res.text().then(text => ({\n        href: href,\n        content: text\n      }));\n    }).catch(err => {\n      throw markAssetError(err);\n    }));\n    return prom;\n  }\n\n  return {\n    whenEntrypoint(route) {\n      return withFuture(route, entrypoints);\n    },\n\n    onEntrypoint(route, execute) {\n      Promise.resolve(execute).then(fn => fn()).then(exports => ({\n        component: exports && exports.default || exports,\n        exports: exports\n      }), err => ({\n        error: err\n      })).then(input => {\n        const old = entrypoints.get(route);\n        entrypoints.set(route, input);\n        if (old && 'resolve' in old) old.resolve(input);\n      });\n    },\n\n    loadRoute(route) {\n      return withFuture(route, routes, async () => {\n        try {\n          const {\n            scripts,\n            css\n          } = await getFilesForRoute(assetPrefix, route);\n          const [, styles] = await Promise.all([entrypoints.has(route) ? [] : Promise.all(scripts.map(maybeExecuteScript)), Promise.all(css.map(fetchStyleSheet))]);\n          const entrypoint = await resolvePromiseWithTimeout(this.whenEntrypoint(route), MS_MAX_IDLE_DELAY, markAssetError(new Error(`Route did not complete loading: ${route}`)));\n          const res = Object.assign({\n            styles\n          }, entrypoint);\n          return 'error' in entrypoint ? entrypoint : res;\n        } catch (err) {\n          return {\n            error: err\n          };\n        }\n      });\n    },\n\n    prefetch(route) {\n      // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118\n      // License: Apache 2.0\n      let 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\n      return getFilesForRoute(assetPrefix, route).then(output => Promise.all(canPrefetch ? output.scripts.map(script => prefetchViaDom(script, 'script')) : [])).then(() => {\n        (0, _requestIdleCallback.requestIdleCallback)(() => this.loadRoute(route));\n      }).catch( // swallow prefetch errors\n      () => {});\n    }\n\n  };\n}\n\nvar _default = createRouteLoader;\nexports.default = _default;","map":{"version":3,"sources":["../../client/route-loader.ts"],"names":["MS_MAX_IDLE_DELAY","entry","map","Promise","prom","resolve","resolver","future","generator","value","link","document","window","canPrefetch","hasPrefetch","href","res","process","ASSET_LOAD_ERROR","Symbol","Object","err","script","reject","markAssetError","src","cancelled","r","setTimeout","self","onBuildManifest","cb","resolvePromiseWithTimeout","scripts","assetPrefix","encodeURI","css","getClientBuildManifest","manifest","route","allFiles","v","entrypoints","loadedScripts","styleSheets","routes","appendScript","fetch","text","content","whenEntrypoint","withFuture","onEntrypoint","fn","exports","component","error","input","old","loadRoute","getFilesForRoute","entrypoint","prefetch","cn","navigator","output","prefetchViaDom","createRouteLoader"],"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): 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((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\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) {\n      return withFuture<RouteLoaderEntry>(route, routes, async () => {\n        try {\n          const { scripts, css } = await getFilesForRoute(assetPrefix, route)\n          const [, styles] = await Promise.all([\n            entrypoints.has(route)\n              ? []\n              : Promise.all(scripts.map(maybeExecuteScript)),\n            Promise.all(css.map(fetchStyleSheet)),\n          ] as const)\n\n          const entrypoint: RouteEntrypoint = await resolvePromiseWithTimeout(\n            this.whenEntrypoint(route),\n            MS_MAX_IDLE_DELAY,\n            markAssetError(\n              new Error(`Route did not complete loading: ${route}`)\n            )\n          )\n\n          const res: RouteLoaderEntry = Object.assign<\n            { styles: RouteStyleSheet[] },\n            RouteEntrypoint\n          >({ styles }, entrypoint)\n          return 'error' in entrypoint ? entrypoint : res\n        } catch (err) {\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))\n        })\n        .catch(\n          // swallow prefetch errors\n          () => {}\n        )\n    },\n  }\n}\n\nexport default createRouteLoader\n"]},"metadata":{},"sourceType":"script"}