{"ast":null,"code":"\"use strict\";\n\nvar _Object$assign = require(\"@babel/runtime-corejs2/core-js/object/assign\");\n\nvar _Promise = require(\"@babel/runtime-corejs2/core-js/promise\");\n\nvar _Object$defineProperty = require(\"@babel/runtime-corejs2/core-js/object/define-property\");\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n  return mod && mod.__esModule ? mod : {\n    \"default\": mod\n  };\n};\n\n_Object$defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nconst url_1 = require(\"url\");\n\nconst mitt_1 = __importDefault(require(\"../mitt\"));\n\nconst utils_1 = require(\"../utils\");\n\nconst is_dynamic_1 = require(\"./utils/is-dynamic\");\n\nconst route_matcher_1 = require(\"./utils/route-matcher\");\n\nconst route_regex_1 = require(\"./utils/route-regex\");\n\nfunction addBasePath(path) {\n  // @ts-ignore variable is always a string\n  const p = process.env.__NEXT_ROUTER_BASEPATH;\n  return path.indexOf(p) !== 0 ? p + path : path;\n}\n\nfunction toRoute(path) {\n  return path.replace(/\\/$/, '') || '/';\n}\n\nclass Router {\n  constructor(pathname, query, as, {\n    initialProps,\n    pageLoader,\n    App,\n    wrapApp,\n    Component,\n    err,\n    subscription\n  }) {\n    // Static Data Cache\n    this.sdc = {};\n\n    this.onPopState = e => {\n      if (!e.state) {\n        // We get state as undefined for two reasons.\n        //  1. With older safari (< 8) and older chrome (< 34)\n        //  2. When the URL changed with #\n        //\n        // In the both cases, we don't need to proceed and change the route.\n        // (as it's already changed)\n        // But we can simply replace the state with the new changes.\n        // Actually, for (1) we don't need to nothing. But it's hard to detect that event.\n        // So, doing the following for (1) does no harm.\n        const {\n          pathname,\n          query\n        } = this;\n        this.changeState('replaceState', utils_1.formatWithValidation({\n          pathname,\n          query\n        }), utils_1.getURL());\n        return;\n      } // Make sure we don't re-render on initial load,\n      // can be caused by navigating back from an external site\n\n\n      if (e.state && this.isSsr && e.state.url === this.pathname && e.state.as === this.asPath) {\n        return;\n      } // If the downstream application returns falsy, return.\n      // They will then be responsible for handling the event.\n\n\n      if (this._bps && !this._bps(e.state)) {\n        return;\n      }\n\n      const {\n        url,\n        as,\n        options\n      } = e.state;\n\n      if (true) {\n        if (typeof url === 'undefined' || typeof as === 'undefined') {\n          console.warn('`popstate` event triggered but `event.state` did not have `url` or `as` https://err.sh/zeit/next.js/popstate-state-empty');\n        }\n      }\n\n      this.replace(url, as, options);\n    };\n\n    this._getStaticData = (asPath, _cachedData) => {\n      let pathname = url_1.parse(asPath).pathname;\n      pathname = !pathname || pathname === '/' ? '/index' : pathname;\n      return false && (_cachedData = this.sdc[pathname]) ? _Promise.resolve(_cachedData) : fetch( // @ts-ignore __NEXT_DATA__\n      `/_next/data/${__NEXT_DATA__.buildId}${pathname}.json`).then(res => {\n        if (!res.ok) {\n          throw new Error(`Failed to load static props`);\n        }\n\n        return res.json();\n      }).then(data => {\n        this.sdc[pathname] = data;\n        return data;\n      }).catch(err => {\n        ;\n        err.code = 'PAGE_LOAD_ERROR';\n        throw err;\n      });\n    }; // represents the current component key\n\n\n    this.route = toRoute(pathname); // set up the component cache (by route keys)\n\n    this.components = {}; // We should not keep the cache, if there's an error\n    // Otherwise, this cause issues when when going back and\n    // come again to the errored page.\n\n    if (pathname !== '/_error') {\n      this.components[this.route] = {\n        Component,\n        props: initialProps,\n        err\n      };\n    }\n\n    this.components['/_app'] = {\n      Component: App\n    }; // Backwards compat for Router.router.events\n    // TODO: Should be remove the following major version as it was never documented\n    // @ts-ignore backwards compatibility\n\n    this.events = Router.events;\n    this.pageLoader = pageLoader;\n    this.pathname = pathname;\n    this.query = query; // if auto prerendered and dynamic route wait to update asPath\n    // until after mount to prevent hydration mismatch\n\n    this.asPath = // @ts-ignore this is temporarily global (attached to window)\n    is_dynamic_1.isDynamicRoute(pathname) && __NEXT_DATA__.autoExport ? pathname : as;\n    this.sub = subscription;\n    this.clc = null;\n    this._wrapApp = wrapApp; // make sure to ignore extra popState in safari on navigating\n    // back from external site\n\n    this.isSsr = true;\n\n    if (false) {\n      // in order for `e.state` to work on the `onpopstate` event\n      // we have to register the initial route upon initialization\n      this.changeState('replaceState', utils_1.formatWithValidation({\n        pathname,\n        query\n      }), as);\n      window.addEventListener('popstate', this.onPopState);\n    }\n  } // @deprecated backwards compatibility even though it's a private method.\n\n\n  static _rewriteUrlForNextExport(url) {\n    if (process.env.__NEXT_EXPORT_TRAILING_SLASH) {\n      const rewriteUrlForNextExport = require('./rewrite-url-for-export').rewriteUrlForNextExport;\n\n      return rewriteUrlForNextExport(url);\n    } else {\n      return url;\n    }\n  }\n\n  update(route, mod) {\n    const Component = mod.default || mod;\n    const data = this.components[route];\n\n    if (!data) {\n      throw new Error(`Cannot update unavailable route: ${route}`);\n    }\n\n    const newData = _Object$assign(_Object$assign({}, data), {\n      Component\n    });\n\n    this.components[route] = newData; // pages/_app.js updated\n\n    if (route === '/_app') {\n      this.notify(this.components[this.route]);\n      return;\n    }\n\n    if (route === this.route) {\n      this.notify(newData);\n    }\n  }\n\n  reload() {\n    window.location.reload();\n  }\n  /**\n   * Go back in history\n   */\n\n\n  back() {\n    window.history.back();\n  }\n  /**\n   * Performs a `pushState` with arguments\n   * @param url of the route\n   * @param as masks `url` for the browser\n   * @param options object you can define `shallow` and other options\n   */\n\n\n  push(url, as = url, options = {}) {\n    return this.change('pushState', url, as, options);\n  }\n  /**\n   * Performs a `replaceState` with arguments\n   * @param url of the route\n   * @param as masks `url` for the browser\n   * @param options object you can define `shallow` and other options\n   */\n\n\n  replace(url, as = url, options = {}) {\n    return this.change('replaceState', url, as, options);\n  }\n\n  change(method, _url, _as, options) {\n    return new _Promise((resolve, reject) => {\n      if (!options._h) {\n        this.isSsr = false;\n      } // marking route changes as a navigation start entry\n\n\n      if (utils_1.ST) {\n        performance.mark('routeChange');\n      } // If url and as provided as an object representation,\n      // we'll format them into the string version here.\n\n\n      const url = typeof _url === 'object' ? utils_1.formatWithValidation(_url) : _url;\n      let as = typeof _as === 'object' ? utils_1.formatWithValidation(_as) : _as; // Add the ending slash to the paths. So, we can serve the\n      // \"<page>/index.html\" directly for the SSR page.\n\n      if (process.env.__NEXT_EXPORT_TRAILING_SLASH) {\n        const rewriteUrlForNextExport = require('./rewrite-url-for-export').rewriteUrlForNextExport; // @ts-ignore this is temporarily global (attached to window)\n\n\n        if (__NEXT_DATA__.nextExport) {\n          as = rewriteUrlForNextExport(as);\n        }\n      }\n\n      this.abortComponentLoad(as); // If the url change is only related to a hash change\n      // We should not proceed. We should only change the state.\n      // WARNING: `_h` is an internal option for handing Next.js client-side\n      // hydration. Your app should _never_ use this property. It may change at\n      // any time without notice.\n\n      if (!options._h && this.onlyAHashChange(as)) {\n        this.asPath = as;\n        Router.events.emit('hashChangeStart', as);\n        this.changeState(method, url, addBasePath(as));\n        this.scrollToHash(as);\n        Router.events.emit('hashChangeComplete', as);\n        return resolve(true);\n      }\n\n      const {\n        pathname,\n        query,\n        protocol\n      } = url_1.parse(url, true);\n\n      if (!pathname || protocol) {\n        if (true) {\n          throw new Error(`Invalid href passed to router: ${url} https://err.sh/zeit/next.js/invalid-href-passed`);\n        }\n\n        return resolve(false);\n      } // If asked to change the current URL we should reload the current page\n      // (not location.reload() but reload getInitialProps and other Next.js stuffs)\n      // We also need to set the method = replaceState always\n      // as this should not go into the history (That's how browsers work)\n      // We should compare the new asPath to the current asPath, not the url\n\n\n      if (!this.urlIsNew(as)) {\n        method = 'replaceState';\n      } // @ts-ignore pathname is always a string\n\n\n      const route = toRoute(pathname);\n      const {\n        shallow = false\n      } = options;\n\n      if (is_dynamic_1.isDynamicRoute(route)) {\n        const {\n          pathname: asPathname\n        } = url_1.parse(as);\n        const routeMatch = route_matcher_1.getRouteMatcher(route_regex_1.getRouteRegex(route))(asPathname);\n\n        if (!routeMatch) {\n          const error = `The provided \\`as\\` value (${asPathname}) is incompatible with the \\`href\\` value (${route}). ` + `Read more: https://err.sh/zeit/next.js/incompatible-href-as`;\n\n          if (true) {\n            throw new Error(error);\n          } else {\n            console.error(error);\n          }\n\n          return resolve(false);\n        } // Merge params into `query`, overwriting any specified in search\n\n\n        _Object$assign(query, routeMatch);\n      }\n\n      Router.events.emit('routeChangeStart', as); // If shallow is true and the route exists in the router cache we reuse the previous result\n      // @ts-ignore pathname is always a string\n\n      this.getRouteInfo(route, pathname, query, as, shallow).then(routeInfo => {\n        const {\n          error\n        } = routeInfo;\n\n        if (error && error.cancelled) {\n          return resolve(false);\n        }\n\n        Router.events.emit('beforeHistoryChange', as);\n        this.changeState(method, url, addBasePath(as), options);\n        const hash = window.location.hash.substring(1);\n\n        if (true) {\n          const appComp = this.components['/_app'].Component;\n          window.next.isPrerendered = appComp.getInitialProps === appComp.origGetInitialProps && !routeInfo.Component.getInitialProps;\n        } // @ts-ignore pathname is always defined\n\n\n        this.set(route, pathname, query, as, _Object$assign(_Object$assign({}, routeInfo), {\n          hash\n        }));\n\n        if (error) {\n          Router.events.emit('routeChangeError', error, as);\n          throw error;\n        }\n\n        Router.events.emit('routeChangeComplete', as);\n        return resolve(true);\n      }, reject);\n    });\n  }\n\n  changeState(method, url, as, options = {}) {\n    if (true) {\n      if (typeof window.history === 'undefined') {\n        console.error(`Warning: window.history is not available.`);\n        return;\n      } // @ts-ignore method should always exist on history\n\n\n      if (typeof window.history[method] === 'undefined') {\n        console.error(`Warning: window.history.${method} is not available`);\n        return;\n      }\n    }\n\n    if (method !== 'pushState' || utils_1.getURL() !== as) {\n      // @ts-ignore method should always exist on history\n      window.history[method]({\n        url,\n        as,\n        options\n      }, null, as);\n    }\n  }\n\n  getRouteInfo(route, pathname, query, as, shallow = false) {\n    const cachedRouteInfo = this.components[route]; // If there is a shallow route transition possible\n    // If the route is already rendered on the screen.\n\n    if (shallow && cachedRouteInfo && this.route === route) {\n      return _Promise.resolve(cachedRouteInfo);\n    }\n\n    return new _Promise((resolve, reject) => {\n      if (cachedRouteInfo) {\n        return resolve(cachedRouteInfo);\n      }\n\n      this.fetchComponent(route).then(Component => resolve({\n        Component\n      }), reject);\n    }).then(routeInfo => {\n      const {\n        Component\n      } = routeInfo;\n\n      if (true) {\n        const {\n          isValidElementType\n        } = require('react-is');\n\n        if (!isValidElementType(Component)) {\n          throw new Error(`The default export is not a React Component in page: \"${pathname}\"`);\n        }\n      }\n\n      return this._getData(() => Component.__N_SSG ? this._getStaticData(as) : this.getInitialProps(Component, // we provide AppTree later so this needs to be `any`\n      {\n        pathname,\n        query,\n        asPath: as\n      })).then(props => {\n        routeInfo.props = props;\n        this.components[route] = routeInfo;\n        return routeInfo;\n      });\n    }).catch(err => {\n      return new _Promise(resolve => {\n        if (err.code === 'PAGE_LOAD_ERROR') {\n          // If we can't load the page it could be one of following reasons\n          //  1. Page doesn't exists\n          //  2. Page does exist in a different zone\n          //  3. Internal error while loading the page\n          // So, doing a hard reload is the proper way to deal with this.\n          window.location.href = as; // Changing the URL doesn't block executing the current code path.\n          // So, we need to mark it as a cancelled error and stop the routing logic.\n\n          err.cancelled = true; // @ts-ignore TODO: fix the control flow here\n\n          return resolve({\n            error: err\n          });\n        }\n\n        if (err.cancelled) {\n          // @ts-ignore TODO: fix the control flow here\n          return resolve({\n            error: err\n          });\n        }\n\n        resolve(this.fetchComponent('/_error').then(Component => {\n          const routeInfo = {\n            Component,\n            err\n          };\n          return new _Promise(resolve => {\n            this.getInitialProps(Component, {\n              err,\n              pathname,\n              query\n            }).then(props => {\n              routeInfo.props = props;\n              routeInfo.error = err;\n              resolve(routeInfo);\n            }, gipErr => {\n              console.error('Error in error page `getInitialProps`: ', gipErr);\n              routeInfo.error = err;\n              routeInfo.props = {};\n              resolve(routeInfo);\n            });\n          });\n        }));\n      });\n    });\n  }\n\n  set(route, pathname, query, as, data) {\n    this.route = route;\n    this.pathname = pathname;\n    this.query = query;\n    this.asPath = as;\n    this.notify(data);\n  }\n  /**\n   * Callback to execute before replacing router state\n   * @param cb callback to be executed\n   */\n\n\n  beforePopState(cb) {\n    this._bps = cb;\n  }\n\n  onlyAHashChange(as) {\n    if (!this.asPath) return false;\n    const [oldUrlNoHash, oldHash] = this.asPath.split('#');\n    const [newUrlNoHash, newHash] = as.split('#'); // Makes sure we scroll to the provided hash if the url/hash are the same\n\n    if (newHash && oldUrlNoHash === newUrlNoHash && oldHash === newHash) {\n      return true;\n    } // If the urls are change, there's more than a hash change\n\n\n    if (oldUrlNoHash !== newUrlNoHash) {\n      return false;\n    } // If the hash has changed, then it's a hash only change.\n    // This check is necessary to handle both the enter and\n    // leave hash === '' cases. The identity case falls through\n    // and is treated as a next reload.\n\n\n    return oldHash !== newHash;\n  }\n\n  scrollToHash(as) {\n    const [, hash] = as.split('#'); // Scroll to top if the hash is just `#` with no value\n\n    if (hash === '') {\n      window.scrollTo(0, 0);\n      return;\n    } // First we check if the element by id is found\n\n\n    const idEl = document.getElementById(hash);\n\n    if (idEl) {\n      idEl.scrollIntoView();\n      return;\n    } // If there's no element with the id, we check the `name` property\n    // To mirror browsers\n\n\n    const nameEl = document.getElementsByName(hash)[0];\n\n    if (nameEl) {\n      nameEl.scrollIntoView();\n    }\n  }\n\n  urlIsNew(asPath) {\n    return this.asPath !== asPath;\n  }\n  /**\n   * Prefetch `page` code, you may wait for the data during `page` rendering.\n   * This feature only works in production!\n   * @param url of prefetched `page`\n   */\n\n\n  prefetch(url) {\n    return new _Promise((resolve, reject) => {\n      const {\n        pathname,\n        protocol\n      } = url_1.parse(url);\n\n      if (!pathname || protocol) {\n        if (true) {\n          throw new Error(`Invalid href passed to router: ${url} https://err.sh/zeit/next.js/invalid-href-passed`);\n        }\n\n        return;\n      } // Prefetch is not supported in development mode because it would trigger on-demand-entries\n\n\n      if (true) {\n        return;\n      } // @ts-ignore pathname is always defined\n\n\n      const route = toRoute(pathname);\n      this.pageLoader.prefetch(route).then(resolve, reject);\n    });\n  }\n\n  async fetchComponent(route) {\n    let cancelled = false;\n\n    const cancel = this.clc = () => {\n      cancelled = true;\n    };\n\n    const Component = await this.pageLoader.loadPage(route);\n\n    if (cancelled) {\n      const error = new Error(`Abort fetching component for route: \"${route}\"`);\n      error.cancelled = true;\n      throw error;\n    }\n\n    if (cancel === this.clc) {\n      this.clc = null;\n    }\n\n    return Component;\n  }\n\n  _getData(fn) {\n    let cancelled = false;\n\n    const cancel = () => {\n      cancelled = true;\n    };\n\n    this.clc = cancel;\n    return fn().then(data => {\n      if (cancel === this.clc) {\n        this.clc = null;\n      }\n\n      if (cancelled) {\n        const err = new Error('Loading initial props cancelled');\n        err.cancelled = true;\n        throw err;\n      }\n\n      return data;\n    });\n  }\n\n  getInitialProps(Component, ctx) {\n    const {\n      Component: App\n    } = this.components['/_app'];\n\n    const AppTree = this._wrapApp(App);\n\n    ctx.AppTree = AppTree;\n    return utils_1.loadGetInitialProps(App, {\n      AppTree,\n      Component,\n      router: this,\n      ctx\n    });\n  }\n\n  abortComponentLoad(as) {\n    if (this.clc) {\n      const e = new Error('Route Cancelled');\n      e.cancelled = true;\n      Router.events.emit('routeChangeError', e, as);\n      this.clc();\n      this.clc = null;\n    }\n  }\n\n  notify(data) {\n    this.sub(data, this.components['/_app'].Component);\n  }\n\n}\n\nexports.default = Router;\nRouter.events = mitt_1.default();","map":{"version":3,"sources":["/Users/sbourgal/Documents/Projets/DAN/dan-framework/template/node_modules/next/dist/next-server/lib/router/router.js"],"names":["__importDefault","mod","__esModule","exports","value","url_1","require","mitt_1","utils_1","is_dynamic_1","route_matcher_1","route_regex_1","addBasePath","path","p","process","env","__NEXT_ROUTER_BASEPATH","indexOf","toRoute","replace","Router","constructor","pathname","query","as","initialProps","pageLoader","App","wrapApp","Component","err","subscription","sdc","onPopState","e","state","changeState","formatWithValidation","getURL","isSsr","url","asPath","_bps","options","console","warn","_getStaticData","_cachedData","parse","resolve","fetch","__NEXT_DATA__","buildId","then","res","ok","Error","json","data","catch","code","route","components","props","events","isDynamicRoute","autoExport","sub","clc","_wrapApp","window","addEventListener","_rewriteUrlForNextExport","__NEXT_EXPORT_TRAILING_SLASH","rewriteUrlForNextExport","update","default","newData","notify","reload","location","back","history","push","change","method","_url","_as","reject","_h","ST","performance","mark","nextExport","abortComponentLoad","onlyAHashChange","emit","scrollToHash","protocol","urlIsNew","shallow","asPathname","routeMatch","getRouteMatcher","getRouteRegex","error","getRouteInfo","routeInfo","cancelled","hash","substring","appComp","next","isPrerendered","getInitialProps","origGetInitialProps","set","cachedRouteInfo","fetchComponent","isValidElementType","_getData","__N_SSG","href","gipErr","beforePopState","cb","oldUrlNoHash","oldHash","split","newUrlNoHash","newHash","scrollTo","idEl","document","getElementById","scrollIntoView","nameEl","getElementsByName","prefetch","cancel","loadPage","fn","ctx","AppTree","loadGetInitialProps","router"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url_1 = require(\"url\");\nconst mitt_1 = __importDefault(require(\"../mitt\"));\nconst utils_1 = require(\"../utils\");\nconst is_dynamic_1 = require(\"./utils/is-dynamic\");\nconst route_matcher_1 = require(\"./utils/route-matcher\");\nconst route_regex_1 = require(\"./utils/route-regex\");\nfunction addBasePath(path) {\n    // @ts-ignore variable is always a string\n    const p = process.env.__NEXT_ROUTER_BASEPATH;\n    return path.indexOf(p) !== 0 ? p + path : path;\n}\nfunction toRoute(path) {\n    return path.replace(/\\/$/, '') || '/';\n}\nclass Router {\n    constructor(pathname, query, as, { initialProps, pageLoader, App, wrapApp, Component, err, subscription, }) {\n        // Static Data Cache\n        this.sdc = {};\n        this.onPopState = (e) => {\n            if (!e.state) {\n                // We get state as undefined for two reasons.\n                //  1. With older safari (< 8) and older chrome (< 34)\n                //  2. When the URL changed with #\n                //\n                // In the both cases, we don't need to proceed and change the route.\n                // (as it's already changed)\n                // But we can simply replace the state with the new changes.\n                // Actually, for (1) we don't need to nothing. But it's hard to detect that event.\n                // So, doing the following for (1) does no harm.\n                const { pathname, query } = this;\n                this.changeState('replaceState', utils_1.formatWithValidation({ pathname, query }), utils_1.getURL());\n                return;\n            }\n            // Make sure we don't re-render on initial load,\n            // can be caused by navigating back from an external site\n            if (e.state &&\n                this.isSsr &&\n                e.state.url === this.pathname &&\n                e.state.as === this.asPath) {\n                return;\n            }\n            // If the downstream application returns falsy, return.\n            // They will then be responsible for handling the event.\n            if (this._bps && !this._bps(e.state)) {\n                return;\n            }\n            const { url, as, options } = e.state;\n            if (process.env.NODE_ENV !== 'production') {\n                if (typeof url === 'undefined' || typeof as === 'undefined') {\n                    console.warn('`popstate` event triggered but `event.state` did not have `url` or `as` https://err.sh/zeit/next.js/popstate-state-empty');\n                }\n            }\n            this.replace(url, as, options);\n        };\n        this._getStaticData = (asPath, _cachedData) => {\n            let pathname = url_1.parse(asPath).pathname;\n            pathname = !pathname || pathname === '/' ? '/index' : pathname;\n            return process.env.NODE_ENV === 'production' &&\n                (_cachedData = this.sdc[pathname])\n                ? Promise.resolve(_cachedData)\n                : fetch(\n                // @ts-ignore __NEXT_DATA__\n                `/_next/data/${__NEXT_DATA__.buildId}${pathname}.json`)\n                    .then(res => {\n                    if (!res.ok) {\n                        throw new Error(`Failed to load static props`);\n                    }\n                    return res.json();\n                })\n                    .then(data => {\n                    this.sdc[pathname] = data;\n                    return data;\n                })\n                    .catch((err) => {\n                    ;\n                    err.code = 'PAGE_LOAD_ERROR';\n                    throw err;\n                });\n        };\n        // represents the current component key\n        this.route = toRoute(pathname);\n        // set up the component cache (by route keys)\n        this.components = {};\n        // We should not keep the cache, if there's an error\n        // Otherwise, this cause issues when when going back and\n        // come again to the errored page.\n        if (pathname !== '/_error') {\n            this.components[this.route] = { Component, props: initialProps, err };\n        }\n        this.components['/_app'] = { Component: App };\n        // Backwards compat for Router.router.events\n        // TODO: Should be remove the following major version as it was never documented\n        // @ts-ignore backwards compatibility\n        this.events = Router.events;\n        this.pageLoader = pageLoader;\n        this.pathname = pathname;\n        this.query = query;\n        // if auto prerendered and dynamic route wait to update asPath\n        // until after mount to prevent hydration mismatch\n        this.asPath =\n            // @ts-ignore this is temporarily global (attached to window)\n            is_dynamic_1.isDynamicRoute(pathname) && __NEXT_DATA__.autoExport ? pathname : as;\n        this.sub = subscription;\n        this.clc = null;\n        this._wrapApp = wrapApp;\n        // make sure to ignore extra popState in safari on navigating\n        // back from external site\n        this.isSsr = true;\n        if (typeof window !== 'undefined') {\n            // in order for `e.state` to work on the `onpopstate` event\n            // we have to register the initial route upon initialization\n            this.changeState('replaceState', utils_1.formatWithValidation({ pathname, query }), as);\n            window.addEventListener('popstate', this.onPopState);\n        }\n    }\n    // @deprecated backwards compatibility even though it's a private method.\n    static _rewriteUrlForNextExport(url) {\n        if (process.env.__NEXT_EXPORT_TRAILING_SLASH) {\n            const rewriteUrlForNextExport = require('./rewrite-url-for-export')\n                .rewriteUrlForNextExport;\n            return rewriteUrlForNextExport(url);\n        }\n        else {\n            return url;\n        }\n    }\n    update(route, mod) {\n        const Component = mod.default || mod;\n        const data = this.components[route];\n        if (!data) {\n            throw new Error(`Cannot update unavailable route: ${route}`);\n        }\n        const newData = Object.assign(Object.assign({}, data), { Component });\n        this.components[route] = newData;\n        // pages/_app.js updated\n        if (route === '/_app') {\n            this.notify(this.components[this.route]);\n            return;\n        }\n        if (route === this.route) {\n            this.notify(newData);\n        }\n    }\n    reload() {\n        window.location.reload();\n    }\n    /**\n     * Go back in history\n     */\n    back() {\n        window.history.back();\n    }\n    /**\n     * Performs a `pushState` with arguments\n     * @param url of the route\n     * @param as masks `url` for the browser\n     * @param options object you can define `shallow` and other options\n     */\n    push(url, as = url, options = {}) {\n        return this.change('pushState', url, as, options);\n    }\n    /**\n     * Performs a `replaceState` with arguments\n     * @param url of the route\n     * @param as masks `url` for the browser\n     * @param options object you can define `shallow` and other options\n     */\n    replace(url, as = url, options = {}) {\n        return this.change('replaceState', url, as, options);\n    }\n    change(method, _url, _as, options) {\n        return new Promise((resolve, reject) => {\n            if (!options._h) {\n                this.isSsr = false;\n            }\n            // marking route changes as a navigation start entry\n            if (utils_1.ST) {\n                performance.mark('routeChange');\n            }\n            // If url and as provided as an object representation,\n            // we'll format them into the string version here.\n            const url = typeof _url === 'object' ? utils_1.formatWithValidation(_url) : _url;\n            let as = typeof _as === 'object' ? utils_1.formatWithValidation(_as) : _as;\n            // Add the ending slash to the paths. So, we can serve the\n            // \"<page>/index.html\" directly for the SSR page.\n            if (process.env.__NEXT_EXPORT_TRAILING_SLASH) {\n                const rewriteUrlForNextExport = require('./rewrite-url-for-export')\n                    .rewriteUrlForNextExport;\n                // @ts-ignore this is temporarily global (attached to window)\n                if (__NEXT_DATA__.nextExport) {\n                    as = rewriteUrlForNextExport(as);\n                }\n            }\n            this.abortComponentLoad(as);\n            // If the url change is only related to a hash change\n            // We should not proceed. We should only change the state.\n            // WARNING: `_h` is an internal option for handing Next.js client-side\n            // hydration. Your app should _never_ use this property. It may change at\n            // any time without notice.\n            if (!options._h && this.onlyAHashChange(as)) {\n                this.asPath = as;\n                Router.events.emit('hashChangeStart', as);\n                this.changeState(method, url, addBasePath(as));\n                this.scrollToHash(as);\n                Router.events.emit('hashChangeComplete', as);\n                return resolve(true);\n            }\n            const { pathname, query, protocol } = url_1.parse(url, true);\n            if (!pathname || protocol) {\n                if (process.env.NODE_ENV !== 'production') {\n                    throw new Error(`Invalid href passed to router: ${url} https://err.sh/zeit/next.js/invalid-href-passed`);\n                }\n                return resolve(false);\n            }\n            // If asked to change the current URL we should reload the current page\n            // (not location.reload() but reload getInitialProps and other Next.js stuffs)\n            // We also need to set the method = replaceState always\n            // as this should not go into the history (That's how browsers work)\n            // We should compare the new asPath to the current asPath, not the url\n            if (!this.urlIsNew(as)) {\n                method = 'replaceState';\n            }\n            // @ts-ignore pathname is always a string\n            const route = toRoute(pathname);\n            const { shallow = false } = options;\n            if (is_dynamic_1.isDynamicRoute(route)) {\n                const { pathname: asPathname } = url_1.parse(as);\n                const routeMatch = route_matcher_1.getRouteMatcher(route_regex_1.getRouteRegex(route))(asPathname);\n                if (!routeMatch) {\n                    const error = `The provided \\`as\\` value (${asPathname}) is incompatible with the \\`href\\` value (${route}). ` +\n                        `Read more: https://err.sh/zeit/next.js/incompatible-href-as`;\n                    if (process.env.NODE_ENV !== 'production') {\n                        throw new Error(error);\n                    }\n                    else {\n                        console.error(error);\n                    }\n                    return resolve(false);\n                }\n                // Merge params into `query`, overwriting any specified in search\n                Object.assign(query, routeMatch);\n            }\n            Router.events.emit('routeChangeStart', as);\n            // If shallow is true and the route exists in the router cache we reuse the previous result\n            // @ts-ignore pathname is always a string\n            this.getRouteInfo(route, pathname, query, as, shallow).then(routeInfo => {\n                const { error } = routeInfo;\n                if (error && error.cancelled) {\n                    return resolve(false);\n                }\n                Router.events.emit('beforeHistoryChange', as);\n                this.changeState(method, url, addBasePath(as), options);\n                const hash = window.location.hash.substring(1);\n                if (process.env.NODE_ENV !== 'production') {\n                    const appComp = this.components['/_app'].Component;\n                    window.next.isPrerendered =\n                        appComp.getInitialProps === appComp.origGetInitialProps &&\n                            !routeInfo.Component.getInitialProps;\n                }\n                // @ts-ignore pathname is always defined\n                this.set(route, pathname, query, as, Object.assign(Object.assign({}, routeInfo), { hash }));\n                if (error) {\n                    Router.events.emit('routeChangeError', error, as);\n                    throw error;\n                }\n                Router.events.emit('routeChangeComplete', as);\n                return resolve(true);\n            }, reject);\n        });\n    }\n    changeState(method, url, as, options = {}) {\n        if (process.env.NODE_ENV !== 'production') {\n            if (typeof window.history === 'undefined') {\n                console.error(`Warning: window.history is not available.`);\n                return;\n            }\n            // @ts-ignore method should always exist on history\n            if (typeof window.history[method] === 'undefined') {\n                console.error(`Warning: window.history.${method} is not available`);\n                return;\n            }\n        }\n        if (method !== 'pushState' || utils_1.getURL() !== as) {\n            // @ts-ignore method should always exist on history\n            window.history[method]({\n                url,\n                as,\n                options,\n            }, null, as);\n        }\n    }\n    getRouteInfo(route, pathname, query, as, shallow = false) {\n        const cachedRouteInfo = this.components[route];\n        // If there is a shallow route transition possible\n        // If the route is already rendered on the screen.\n        if (shallow && cachedRouteInfo && this.route === route) {\n            return Promise.resolve(cachedRouteInfo);\n        }\n        return new Promise((resolve, reject) => {\n            if (cachedRouteInfo) {\n                return resolve(cachedRouteInfo);\n            }\n            this.fetchComponent(route).then(Component => resolve({ Component }), reject);\n        })\n            .then((routeInfo) => {\n            const { Component } = routeInfo;\n            if (process.env.NODE_ENV !== 'production') {\n                const { isValidElementType } = require('react-is');\n                if (!isValidElementType(Component)) {\n                    throw new Error(`The default export is not a React Component in page: \"${pathname}\"`);\n                }\n            }\n            return this._getData(() => Component.__N_SSG\n                ? this._getStaticData(as)\n                : this.getInitialProps(Component, \n                // we provide AppTree later so this needs to be `any`\n                {\n                    pathname,\n                    query,\n                    asPath: as,\n                })).then(props => {\n                routeInfo.props = props;\n                this.components[route] = routeInfo;\n                return routeInfo;\n            });\n        })\n            .catch(err => {\n            return new Promise(resolve => {\n                if (err.code === 'PAGE_LOAD_ERROR') {\n                    // If we can't load the page it could be one of following reasons\n                    //  1. Page doesn't exists\n                    //  2. Page does exist in a different zone\n                    //  3. Internal error while loading the page\n                    // So, doing a hard reload is the proper way to deal with this.\n                    window.location.href = as;\n                    // Changing the URL doesn't block executing the current code path.\n                    // So, we need to mark it as a cancelled error and stop the routing logic.\n                    err.cancelled = true;\n                    // @ts-ignore TODO: fix the control flow here\n                    return resolve({ error: err });\n                }\n                if (err.cancelled) {\n                    // @ts-ignore TODO: fix the control flow here\n                    return resolve({ error: err });\n                }\n                resolve(this.fetchComponent('/_error').then(Component => {\n                    const routeInfo = { Component, err };\n                    return new Promise(resolve => {\n                        this.getInitialProps(Component, {\n                            err,\n                            pathname,\n                            query,\n                        }).then(props => {\n                            routeInfo.props = props;\n                            routeInfo.error = err;\n                            resolve(routeInfo);\n                        }, gipErr => {\n                            console.error('Error in error page `getInitialProps`: ', gipErr);\n                            routeInfo.error = err;\n                            routeInfo.props = {};\n                            resolve(routeInfo);\n                        });\n                    });\n                }));\n            });\n        });\n    }\n    set(route, pathname, query, as, data) {\n        this.route = route;\n        this.pathname = pathname;\n        this.query = query;\n        this.asPath = as;\n        this.notify(data);\n    }\n    /**\n     * Callback to execute before replacing router state\n     * @param cb callback to be executed\n     */\n    beforePopState(cb) {\n        this._bps = cb;\n    }\n    onlyAHashChange(as) {\n        if (!this.asPath)\n            return false;\n        const [oldUrlNoHash, oldHash] = this.asPath.split('#');\n        const [newUrlNoHash, newHash] = as.split('#');\n        // Makes sure we scroll to the provided hash if the url/hash are the same\n        if (newHash && oldUrlNoHash === newUrlNoHash && oldHash === newHash) {\n            return true;\n        }\n        // If the urls are change, there's more than a hash change\n        if (oldUrlNoHash !== newUrlNoHash) {\n            return false;\n        }\n        // If the hash has changed, then it's a hash only change.\n        // This check is necessary to handle both the enter and\n        // leave hash === '' cases. The identity case falls through\n        // and is treated as a next reload.\n        return oldHash !== newHash;\n    }\n    scrollToHash(as) {\n        const [, hash] = as.split('#');\n        // Scroll to top if the hash is just `#` with no value\n        if (hash === '') {\n            window.scrollTo(0, 0);\n            return;\n        }\n        // First we check if the element by id is found\n        const idEl = document.getElementById(hash);\n        if (idEl) {\n            idEl.scrollIntoView();\n            return;\n        }\n        // If there's no element with the id, we check the `name` property\n        // To mirror browsers\n        const nameEl = document.getElementsByName(hash)[0];\n        if (nameEl) {\n            nameEl.scrollIntoView();\n        }\n    }\n    urlIsNew(asPath) {\n        return this.asPath !== asPath;\n    }\n    /**\n     * Prefetch `page` code, you may wait for the data during `page` rendering.\n     * This feature only works in production!\n     * @param url of prefetched `page`\n     */\n    prefetch(url) {\n        return new Promise((resolve, reject) => {\n            const { pathname, protocol } = url_1.parse(url);\n            if (!pathname || protocol) {\n                if (process.env.NODE_ENV !== 'production') {\n                    throw new Error(`Invalid href passed to router: ${url} https://err.sh/zeit/next.js/invalid-href-passed`);\n                }\n                return;\n            }\n            // Prefetch is not supported in development mode because it would trigger on-demand-entries\n            if (process.env.NODE_ENV !== 'production') {\n                return;\n            }\n            // @ts-ignore pathname is always defined\n            const route = toRoute(pathname);\n            this.pageLoader.prefetch(route).then(resolve, reject);\n        });\n    }\n    async fetchComponent(route) {\n        let cancelled = false;\n        const cancel = (this.clc = () => {\n            cancelled = true;\n        });\n        const Component = await this.pageLoader.loadPage(route);\n        if (cancelled) {\n            const error = new Error(`Abort fetching component for route: \"${route}\"`);\n            error.cancelled = true;\n            throw error;\n        }\n        if (cancel === this.clc) {\n            this.clc = null;\n        }\n        return Component;\n    }\n    _getData(fn) {\n        let cancelled = false;\n        const cancel = () => {\n            cancelled = true;\n        };\n        this.clc = cancel;\n        return fn().then(data => {\n            if (cancel === this.clc) {\n                this.clc = null;\n            }\n            if (cancelled) {\n                const err = new Error('Loading initial props cancelled');\n                err.cancelled = true;\n                throw err;\n            }\n            return data;\n        });\n    }\n    getInitialProps(Component, ctx) {\n        const { Component: App } = this.components['/_app'];\n        const AppTree = this._wrapApp(App);\n        ctx.AppTree = AppTree;\n        return utils_1.loadGetInitialProps(App, {\n            AppTree,\n            Component,\n            router: this,\n            ctx,\n        });\n    }\n    abortComponentLoad(as) {\n        if (this.clc) {\n            const e = new Error('Route Cancelled');\n            e.cancelled = true;\n            Router.events.emit('routeChangeError', e, as);\n            this.clc();\n            this.clc = null;\n        }\n    }\n    notify(data) {\n        this.sub(data, this.components['/_app'].Component);\n    }\n}\nexports.default = Router;\nRouter.events = mitt_1.default();\n"]},"metadata":{},"sourceType":"script"}