UNPKG

next-csrf

Version:

CSRF mitigation library for Next.js

1 lines 91.7 kB
{"ast":null,"code":"\"use strict\";\n\nvar _slicedToArray = require(\"@babel/runtime/helpers/slicedToArray\");\n\nvar _regeneratorRuntime = require(\"@babel/runtime/regenerator\");\n\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/asyncToGenerator\");\n\nvar _classCallCheck = require(\"@babel/runtime/helpers/classCallCheck\");\n\nvar _createClass = require(\"@babel/runtime/helpers/createClass\");\n\nexports.__esModule = true;\nexports.hasBasePath = hasBasePath;\nexports.addBasePath = addBasePath;\nexports.delBasePath = delBasePath;\nexports.isLocalURL = isLocalURL;\nexports.resolveHref = resolveHref;\nexports.markLoadingError = markLoadingError;\nexports[\"default\"] = void 0;\n\nvar _normalizeTrailingSlash = require(\"../../../client/normalize-trailing-slash\");\n\nvar _denormalizePagePath = require(\"../../server/denormalize-page-path\");\n\nvar _mitt = _interopRequireDefault(require(\"../mitt\"));\n\nvar _utils = require(\"../utils\");\n\nvar _isDynamic = require(\"./utils/is-dynamic\");\n\nvar _parseRelativeUrl = require(\"./utils/parse-relative-url\");\n\nvar _querystring = require(\"./utils/querystring\");\n\nvar _resolveRewrites = _interopRequireDefault(require(\"./utils/resolve-rewrites\"));\n\nvar _routeMatcher = require(\"./utils/route-matcher\");\n\nvar _routeRegex = require(\"./utils/route-regex\");\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n/* global __NEXT_DATA__ */\n// tslint:disable:no-console\n\n\nvar basePath = process.env.__NEXT_ROUTER_BASEPATH || '';\n\nfunction buildCancellationError() {\n return Object.assign(new Error('Route Cancelled'), {\n cancelled: true\n });\n}\n\nfunction hasBasePath(path) {\n return path === basePath || path.startsWith(basePath + '/');\n}\n\nfunction addBasePath(path) {\n // we only add the basepath on relative urls\n return basePath && path.startsWith('/') ? path === '/' ? (0, _normalizeTrailingSlash.normalizePathTrailingSlash)(basePath) : basePath + path : path;\n}\n\nfunction delBasePath(path) {\n return path.slice(basePath.length) || '/';\n}\n/**\n* Detects whether a given url is routable by the Next.js router (browser only).\n*/\n\n\nfunction isLocalURL(url) {\n if (url.startsWith('/')) return true;\n\n try {\n // absolute urls can be local if they are on the same origin\n var locationOrigin = (0, _utils.getLocationOrigin)();\n var resolved = new URL(url, locationOrigin);\n return resolved.origin === locationOrigin && hasBasePath(resolved.pathname);\n } catch (_) {\n return false;\n }\n}\n/**\n* Resolves a given hyperlink with a certain router state (basePath not included).\n* Preserves absolute urls.\n*/\n\n\nfunction resolveHref(currentPath, href) {\n // we use a dummy base url for relative urls\n var base = new URL(currentPath, 'http://n');\n var urlAsString = typeof href === 'string' ? href : (0, _utils.formatWithValidation)(href);\n\n try {\n var finalUrl = new URL(urlAsString, base);\n finalUrl.pathname = (0, _normalizeTrailingSlash.normalizePathTrailingSlash)(finalUrl.pathname); // if the origin didn't change, it means we received a relative href\n\n return finalUrl.origin === base.origin ? finalUrl.href.slice(finalUrl.origin.length) : finalUrl.href;\n } catch (_) {\n return urlAsString;\n }\n}\n\nvar PAGE_LOAD_ERROR = Symbol('PAGE_LOAD_ERROR');\n\nfunction markLoadingError(err) {\n return Object.defineProperty(err, PAGE_LOAD_ERROR, {});\n}\n\nfunction prepareUrlAs(router, url, as) {\n // If url and as provided as an object representation,\n // we'll format them into the string version here.\n return {\n url: addBasePath(resolveHref(router.pathname, url)),\n as: as ? addBasePath(resolveHref(router.pathname, as)) : as\n };\n}\n\nvar manualScrollRestoration = process.env.__NEXT_SCROLL_RESTORATION && true && 'scrollRestoration' in window.history;\n\nfunction fetchRetry(url, attempts) {\n return fetch(url, {\n // Cookies are required to be present for Next.js' SSG \"Preview Mode\".\n // Cookies may also be required for `getServerSideProps`.\n //\n // > `fetch` won’t send cookies, unless you set the credentials init\n // > option.\n // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch\n //\n // > For maximum browser compatibility when it comes to sending &\n // > receiving cookies, always supply the `credentials: 'same-origin'`\n // > option instead of relying on the default.\n // https://github.com/github/fetch#caveats\n credentials: 'same-origin'\n }).then(function (res) {\n if (!res.ok) {\n if (attempts > 1 && res.status >= 500) {\n return fetchRetry(url, attempts - 1);\n }\n\n throw new Error(\"Failed to load static props\");\n }\n\n return res.json();\n });\n}\n\nfunction fetchNextData(dataHref, isServerRender) {\n return fetchRetry(dataHref, isServerRender ? 3 : 1)[\"catch\"](function (err) {\n // We should only trigger a server-side transition if this was caused\n // on a client-side transition. Otherwise, we'd get into an infinite\n // loop.\n if (!isServerRender) {\n markLoadingError(err);\n }\n\n throw err;\n });\n}\n\nvar Router = /*#__PURE__*/function () {\n /**\n * Map of all components loaded in `Router`\n */\n // Static Data Cache\n function Router(_pathname, _query, _as, _ref) {\n var _this = this;\n\n var initialProps = _ref.initialProps,\n pageLoader = _ref.pageLoader,\n App = _ref.App,\n wrapApp = _ref.wrapApp,\n Component = _ref.Component,\n initialStyleSheets = _ref.initialStyleSheets,\n err = _ref.err,\n subscription = _ref.subscription,\n isFallback = _ref.isFallback;\n\n _classCallCheck(this, Router);\n\n this.route = void 0;\n this.pathname = void 0;\n this.query = void 0;\n this.asPath = void 0;\n this.basePath = void 0;\n this.components = void 0;\n this.sdc = {};\n this.sub = void 0;\n this.clc = void 0;\n this.pageLoader = void 0;\n this._bps = void 0;\n this.events = void 0;\n this._wrapApp = void 0;\n this.isSsr = void 0;\n this.isFallback = void 0;\n this._inFlightRoute = void 0;\n this._shallow = void 0;\n\n this.onPopState = function (e) {\n var state = e.state;\n\n if (!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 var _pathname2 = _this.pathname,\n query = _this.query;\n\n _this.changeState('replaceState', (0, _utils.formatWithValidation)({\n pathname: addBasePath(_pathname2),\n query: query\n }), (0, _utils.getURL)());\n\n return;\n }\n\n if (!state.__N) {\n return;\n }\n\n var url = state.url,\n as = state.as,\n options = state.options;\n\n var _ref2 = (0, _parseRelativeUrl.parseRelativeUrl)(url),\n pathname = _ref2.pathname; // 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 (_this.isSsr && as === _this.asPath && pathname === _this.pathname) {\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(state)) {\n return;\n }\n\n _this.change('replaceState', url, as, Object.assign({}, options, {\n shallow: options.shallow && _this._shallow\n }));\n }; // represents the current component key\n\n\n this.route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(_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: Component,\n styleSheets: initialStyleSheets,\n props: initialProps,\n err: err,\n __N_SSG: initialProps && initialProps.__N_SSG,\n __N_SSP: initialProps && initialProps.__N_SSP\n };\n }\n\n this.components['/_app'] = {\n Component: App,\n styleSheets: [\n /* /_app does not need its stylesheets managed */\n ]\n }; // Backwards compat for Router.router.events\n // TODO: Should be remove the following major version as it was never documented\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 (0, _isDynamic.isDynamicRoute)(_pathname) && __NEXT_DATA__.autoExport ? _pathname : _as;\n this.basePath = basePath;\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 this.isFallback = isFallback;\n\n if (true) {\n // make sure \"as\" doesn't start with double slashes or else it can\n // throw an error as it's considered invalid\n if (_as.substr(0, 2) !== '//') {\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', (0, _utils.formatWithValidation)({\n pathname: addBasePath(_pathname),\n query: _query\n }), (0, _utils.getURL)());\n }\n\n window.addEventListener('popstate', this.onPopState); // enable custom scroll restoration handling when available\n // otherwise fallback to browser's default handling\n\n if (process.env.__NEXT_SCROLL_RESTORATION) {\n if (manualScrollRestoration) {\n window.history.scrollRestoration = 'manual';\n var scrollDebounceTimeout;\n\n var debouncedScrollSave = function debouncedScrollSave() {\n if (scrollDebounceTimeout) clearTimeout(scrollDebounceTimeout);\n scrollDebounceTimeout = setTimeout(function () {\n var _history$state = history.state,\n url = _history$state.url,\n curAs = _history$state.as,\n options = _history$state.options;\n\n _this.changeState('replaceState', url, curAs, Object.assign({}, options, {\n _N_X: window.scrollX,\n _N_Y: window.scrollY\n }));\n }, 10);\n };\n\n window.addEventListener('scroll', debouncedScrollSave);\n }\n }\n }\n }\n\n _createClass(Router, [{\n key: \"reload\",\n value: function reload() {\n window.location.reload();\n }\n /**\n * Go back in history\n */\n\n }, {\n key: \"back\",\n value: function 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 key: \"push\",\n value: function push(url) {\n var as = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : url;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n ;\n\n var _prepareUrlAs = prepareUrlAs(this, url, as);\n\n url = _prepareUrlAs.url;\n as = _prepareUrlAs.as;\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 key: \"replace\",\n value: function replace(url) {\n var as = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : url;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n ;\n\n var _prepareUrlAs2 = prepareUrlAs(this, url, as);\n\n url = _prepareUrlAs2.url;\n as = _prepareUrlAs2.as;\n return this.change('replaceState', url, as, options);\n }\n }, {\n key: \"change\",\n value: function () {\n var _change = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, url, as, options) {\n var _this2 = this;\n\n var cleanedAs, pages, _yield$this$pageLoade, rewrites, parsed, _parsed, pathname, searchParams, query, route, _options$shallow, shallow, resolvedAs, _ref3, asPathname, routeRegex, routeMatch, missingParams, routeInfo, error, appComp;\n\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (isLocalURL(url)) {\n _context.next = 3;\n break;\n }\n\n window.location.href = url;\n return _context.abrupt(\"return\", false);\n\n case 3:\n if (!options._h) {\n this.isSsr = false;\n } // marking route changes as a navigation start entry\n\n\n if (_utils.ST) {\n performance.mark('routeChange');\n }\n\n if (this._inFlightRoute) {\n this.abortComponentLoad(this._inFlightRoute);\n }\n\n cleanedAs = hasBasePath(as) ? delBasePath(as) : as;\n this._inFlightRoute = 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(cleanedAs))) {\n _context.next = 16;\n break;\n }\n\n this.asPath = cleanedAs;\n Router.events.emit('hashChangeStart', as); // TODO: do we need the resolved href when only a hash change?\n\n this.changeState(method, url, as, options);\n this.scrollToHash(cleanedAs);\n this.notify(this.components[this.route]);\n Router.events.emit('hashChangeComplete', as);\n return _context.abrupt(\"return\", true);\n\n case 16:\n _context.next = 18;\n return this.pageLoader.getPageList();\n\n case 18:\n pages = _context.sent;\n _context.next = 21;\n return this.pageLoader.promisedBuildManifest;\n\n case 21:\n _yield$this$pageLoade = _context.sent;\n rewrites = _yield$this$pageLoade.__rewrites;\n parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url);\n _parsed = parsed, pathname = _parsed.pathname, searchParams = _parsed.searchParams;\n parsed = this._resolveHref(parsed, pages);\n\n if (parsed.pathname !== pathname) {\n pathname = parsed.pathname;\n url = (0, _utils.formatWithValidation)(parsed);\n }\n\n query = (0, _querystring.searchParamsToUrlQuery)(searchParams); // url and as should always be prefixed with basePath by this\n // point by either next/link or router.push/replace so strip the\n // basePath from the pathname to match the pages dir 1-to-1\n\n pathname = pathname ? (0, _normalizeTrailingSlash.removePathTrailingSlash)(delBasePath(pathname)) : pathname; // 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 if (!this.urlIsNew(cleanedAs)) {\n method = 'replaceState';\n }\n\n route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname);\n _options$shallow = options.shallow, shallow = _options$shallow === void 0 ? false : _options$shallow; // we need to resolve the as value using rewrites for dynamic SSG\n // pages to allow building the data URL correctly\n\n resolvedAs = as;\n\n if (process.env.__NEXT_HAS_REWRITES) {\n resolvedAs = (0, _resolveRewrites[\"default\"])(as, pages, basePath, rewrites, query, function (p) {\n return _this2._resolveHref({\n pathname: p\n }, pages).pathname;\n });\n }\n\n resolvedAs = delBasePath(resolvedAs);\n\n if (!(0, _isDynamic.isDynamicRoute)(route)) {\n _context.next = 47;\n break;\n }\n\n _ref3 = (0, _parseRelativeUrl.parseRelativeUrl)(resolvedAs), asPathname = _ref3.pathname;\n routeRegex = (0, _routeRegex.getRouteRegex)(route);\n routeMatch = (0, _routeMatcher.getRouteMatcher)(routeRegex)(asPathname);\n\n if (routeMatch) {\n _context.next = 46;\n break;\n }\n\n missingParams = Object.keys(routeRegex.groups).filter(function (param) {\n return !query[param];\n });\n\n if (!(missingParams.length > 0)) {\n _context.next = 44;\n break;\n }\n\n if (true) {\n console.warn(\"Mismatching `as` and `href` failed to manually provide \" + \"the params: \".concat(missingParams.join(', '), \" in the `href`'s `query`\"));\n }\n\n throw new Error(\"The provided `as` value (\".concat(asPathname, \") is incompatible with the `href` value (\").concat(route, \"). \") + \"Read more: https://err.sh/vercel/next.js/incompatible-href-as\");\n\n case 44:\n _context.next = 47;\n break;\n\n case 46:\n // Merge params into `query`, overwriting any specified in search\n Object.assign(query, routeMatch);\n\n case 47:\n Router.events.emit('routeChangeStart', as);\n _context.prev = 48;\n _context.next = 51;\n return this.getRouteInfo(route, pathname, query, as, shallow);\n\n case 51:\n routeInfo = _context.sent;\n error = routeInfo.error;\n Router.events.emit('beforeHistoryChange', as);\n this.changeState(method, url, as, options);\n\n if (true) {\n appComp = this.components['/_app'].Component;\n window.next.isPrerendered = appComp.getInitialProps === appComp.origGetInitialProps && !routeInfo.Component.getInitialProps;\n }\n\n _context.next = 58;\n return this.set(route, pathname, query, cleanedAs, routeInfo)[\"catch\"](function (e) {\n if (e.cancelled) error = error || e;else throw e;\n });\n\n case 58:\n if (!error) {\n _context.next = 61;\n break;\n }\n\n Router.events.emit('routeChangeError', error, cleanedAs);\n throw error;\n\n case 61:\n if (process.env.__NEXT_SCROLL_RESTORATION) {\n if (manualScrollRestoration && '_N_X' in options) {\n window.scrollTo(options._N_X, options._N_Y);\n }\n }\n\n Router.events.emit('routeChangeComplete', as);\n return _context.abrupt(\"return\", true);\n\n case 66:\n _context.prev = 66;\n _context.t0 = _context[\"catch\"](48);\n\n if (!_context.t0.cancelled) {\n _context.next = 70;\n break;\n }\n\n return _context.abrupt(\"return\", false);\n\n case 70:\n throw _context.t0;\n\n case 71:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this, [[48, 66]]);\n }));\n\n function change(_x, _x2, _x3, _x4) {\n return _change.apply(this, arguments);\n }\n\n return change;\n }()\n }, {\n key: \"changeState\",\n value: function changeState(method, url, as) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n if (true) {\n if (typeof window.history === 'undefined') {\n console.error(\"Warning: window.history is not available.\");\n return;\n }\n\n if (typeof window.history[method] === 'undefined') {\n console.error(\"Warning: window.history.\".concat(method, \" is not available\"));\n return;\n }\n }\n\n if (method !== 'pushState' || (0, _utils.getURL)() !== as) {\n this._shallow = options.shallow;\n window.history[method]({\n url: url,\n as: as,\n options: options,\n __N: true\n }, // Most browsers currently ignores this parameter, although they may use it in the future.\n // Passing the empty string here should be safe against future changes to the method.\n // https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n '', as);\n }\n }\n }, {\n key: \"handleRouteInfoError\",\n value: function () {\n var _handleRouteInfoError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(err, pathname, query, as, loadErrorFail) {\n var _yield$this$fetchComp, Component, styleSheets, routeInfo;\n\n return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!err.cancelled) {\n _context2.next = 2;\n break;\n }\n\n throw err;\n\n case 2:\n if (!(PAGE_LOAD_ERROR in err || loadErrorFail)) {\n _context2.next = 6;\n break;\n }\n\n Router.events.emit('routeChangeError', err, as); // 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\n window.location.href = as; // Changing the URL doesn't block executing the current code path.\n // So let's throw a cancellation error stop the routing logic.\n\n throw buildCancellationError();\n\n case 6:\n _context2.prev = 6;\n _context2.next = 9;\n return this.fetchComponent('/_error');\n\n case 9:\n _yield$this$fetchComp = _context2.sent;\n Component = _yield$this$fetchComp.page;\n styleSheets = _yield$this$fetchComp.styleSheets;\n routeInfo = {\n Component: Component,\n styleSheets: styleSheets,\n err: err,\n error: err\n };\n _context2.prev = 13;\n _context2.next = 16;\n return this.getInitialProps(Component, {\n err: err,\n pathname: pathname,\n query: query\n });\n\n case 16:\n routeInfo.props = _context2.sent;\n _context2.next = 23;\n break;\n\n case 19:\n _context2.prev = 19;\n _context2.t0 = _context2[\"catch\"](13);\n console.error('Error in error page `getInitialProps`: ', _context2.t0);\n routeInfo.props = {};\n\n case 23:\n return _context2.abrupt(\"return\", routeInfo);\n\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](6);\n return _context2.abrupt(\"return\", this.handleRouteInfoError(_context2.t1, pathname, query, as, true));\n\n case 29:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, this, [[6, 26], [13, 19]]);\n }));\n\n function handleRouteInfoError(_x5, _x6, _x7, _x8, _x9) {\n return _handleRouteInfoError.apply(this, arguments);\n }\n\n return handleRouteInfoError;\n }()\n }, {\n key: \"getRouteInfo\",\n value: function () {\n var _getRouteInfo = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(route, pathname, query, as) {\n var _this3 = this;\n\n var shallow,\n cachedRouteInfo,\n routeInfo,\n Component,\n __N_SSG,\n __N_SSP,\n _require,\n isValidElementType,\n dataHref,\n props,\n _args3 = arguments;\n\n return _regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n shallow = _args3.length > 4 && _args3[4] !== undefined ? _args3[4] : false;\n _context3.prev = 1;\n cachedRouteInfo = this.components[route];\n\n if (!(shallow && cachedRouteInfo && this.route === route)) {\n _context3.next = 5;\n break;\n }\n\n return _context3.abrupt(\"return\", cachedRouteInfo);\n\n case 5:\n if (!cachedRouteInfo) {\n _context3.next = 9;\n break;\n }\n\n _context3.t0 = cachedRouteInfo;\n _context3.next = 12;\n break;\n\n case 9:\n _context3.next = 11;\n return this.fetchComponent(route).then(function (res) {\n return {\n Component: res.page,\n styleSheets: res.styleSheets,\n __N_SSG: res.mod.__N_SSG,\n __N_SSP: res.mod.__N_SSP\n };\n });\n\n case 11:\n _context3.t0 = _context3.sent;\n\n case 12:\n routeInfo = _context3.t0;\n Component = routeInfo.Component, __N_SSG = routeInfo.__N_SSG, __N_SSP = routeInfo.__N_SSP;\n\n if (!true) {\n _context3.next = 18;\n break;\n }\n\n _require = require('react-is'), isValidElementType = _require.isValidElementType;\n\n if (isValidElementType(Component)) {\n _context3.next = 18;\n break;\n }\n\n throw new Error(\"The default export is not a React Component in page: \\\"\".concat(pathname, \"\\\"\"));\n\n case 18:\n if (__N_SSG || __N_SSP) {\n dataHref = this.pageLoader.getDataHref((0, _utils.formatWithValidation)({\n pathname: pathname,\n query: query\n }), delBasePath(as), __N_SSG);\n }\n\n _context3.next = 21;\n return this._getData(function () {\n return __N_SSG ? _this3._getStaticData(dataHref) : __N_SSP ? _this3._getServerData(dataHref) : _this3.getInitialProps(Component, // we provide AppTree later so this needs to be `any`\n {\n pathname: pathname,\n query: query,\n asPath: as\n });\n });\n\n case 21:\n props = _context3.sent;\n routeInfo.props = props;\n this.components[route] = routeInfo;\n return _context3.abrupt(\"return\", routeInfo);\n\n case 27:\n _context3.prev = 27;\n _context3.t1 = _context3[\"catch\"](1);\n return _context3.abrupt(\"return\", this.handleRouteInfoError(_context3.t1, pathname, query, as));\n\n case 30:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, this, [[1, 27]]);\n }));\n\n function getRouteInfo(_x10, _x11, _x12, _x13) {\n return _getRouteInfo.apply(this, arguments);\n }\n\n return getRouteInfo;\n }()\n }, {\n key: \"set\",\n value: function set(route, pathname, query, as, data) {\n this.isFallback = false;\n this.route = route;\n this.pathname = pathname;\n this.query = query;\n this.asPath = as;\n return this.notify(data);\n }\n /**\n * Callback to execute before replacing router state\n * @param cb callback to be executed\n */\n\n }, {\n key: \"beforePopState\",\n value: function beforePopState(cb) {\n this._bps = cb;\n }\n }, {\n key: \"onlyAHashChange\",\n value: function onlyAHashChange(as) {\n if (!this.asPath) return false;\n\n var _this$asPath$split = this.asPath.split('#'),\n _this$asPath$split2 = _slicedToArray(_this$asPath$split, 2),\n oldUrlNoHash = _this$asPath$split2[0],\n oldHash = _this$asPath$split2[1];\n\n var _as$split = as.split('#'),\n _as$split2 = _slicedToArray(_as$split, 2),\n newUrlNoHash = _as$split2[0],\n newHash = _as$split2[1]; // Makes sure we scroll to the provided hash if the url/hash are the same\n\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 key: \"scrollToHash\",\n value: function scrollToHash(as) {\n var _as$split3 = as.split('#'),\n _as$split4 = _slicedToArray(_as$split3, 2),\n hash = _as$split4[1]; // Scroll to top if the hash is just `#` with no value\n\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 var 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 var nameEl = document.getElementsByName(hash)[0];\n\n if (nameEl) {\n nameEl.scrollIntoView();\n }\n }\n }, {\n key: \"urlIsNew\",\n value: function urlIsNew(asPath) {\n return this.asPath !== asPath;\n }\n }, {\n key: \"_resolveHref\",\n value: function _resolveHref(parsedHref, pages) {\n var pathname = parsedHref.pathname;\n var cleanPathname = (0, _denormalizePagePath.denormalizePagePath)(delBasePath(pathname));\n\n if (cleanPathname === '/404' || cleanPathname === '/_error') {\n return parsedHref;\n } // handle resolving href for dynamic routes\n\n\n if (!pages.includes(cleanPathname)) {\n // eslint-disable-next-line array-callback-return\n pages.some(function (page) {\n if ((0, _isDynamic.isDynamicRoute)(page) && (0, _routeRegex.getRouteRegex)(page).re.test(cleanPathname)) {\n parsedHref.pathname = addBasePath(page);\n return true;\n }\n });\n }\n\n return parsedHref;\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 the href of prefetched page\n * @param asPath the as path of the prefetched page\n */\n\n }, {\n key: \"prefetch\",\n value: function () {\n var _prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(url) {\n var asPath,\n options,\n parsed,\n _parsed2,\n pathname,\n pages,\n route,\n _args4 = arguments;\n\n return _regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n asPath = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : url;\n options = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : {};\n parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url);\n _parsed2 = parsed, pathname = _parsed2.pathname;\n _context4.next = 6;\n return this.pageLoader.getPageList();\n\n case 6:\n pages = _context4.sent;\n parsed = this._resolveHref(parsed, pages);\n\n if (parsed.pathname !== pathname) {\n pathname = parsed.pathname;\n url = (0, _utils.formatWithValidation)(parsed);\n } // Prefetch is not supported in development mode because it would trigger on-demand-entries\n\n\n if (!true) {\n _context4.next = 11;\n break;\n }\n\n return _context4.abrupt(\"return\");\n\n case 11:\n route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname);\n _context4.next = 14;\n return Promise.all([this.pageLoader.prefetchData(url, asPath), this.pageLoader[options.priority ? 'loadPage' : 'prefetch'](route)]);\n\n case 14:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function prefetch(_x14) {\n return _prefetch.apply(this, arguments);\n }\n\n return prefetch;\n }()\n }, {\n key: \"fetchComponent\",\n value: function () {\n var _fetchComponent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(route) {\n var cancelled, cancel, componentResult, error;\n return _regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n cancelled = false;\n\n cancel = this.clc = function () {\n cancelled = true;\n };\n\n _context5.next = 4;\n return this.pageLoader.loadPage(route);\n\n case 4:\n componentResult = _context5.sent;\n\n if (!cancelled) {\n _context5.next = 9;\n break;\n }\n\n error = new Error(\"Abort fetching component for route: \\\"\".concat(route, \"\\\"\"));\n error.cancelled = true;\n throw error;\n\n case 9:\n if (cancel === this.clc) {\n this.clc = null;\n }\n\n return _context5.abrupt(\"return\", componentResult);\n\n case 11:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n function fetchComponent(_x15) {\n return _fetchComponent.apply(this, arguments);\n }\n\n return fetchComponent;\n }()\n }, {\n key: \"_getData\",\n value: function _getData(fn) {\n var _this4 = this;\n\n var cancelled = false;\n\n var cancel = function cancel() {\n cancelled = true;\n };\n\n this.clc = cancel;\n return fn().then(function (data) {\n if (cancel === _this4.clc) {\n _this4.clc = null;\n }\n\n if (cancelled) {\n var err = new Error('Loading initial props cancelled');\n err.cancelled = true;\n throw err;\n }\n\n return data;\n });\n }\n }, {\n key: \"_getStaticData\",\n value: function _getStaticData(dataHref) {\n var _this5 = this;\n\n var _URL = new URL(dataHref, window.location.href),\n cacheKey = _URL.href;\n\n if (false && this.sdc[cacheKey]) {\n return Promise.resolve(this.sdc[cacheKey]);\n }\n\n return fetchNextData(dataHref, this.isSsr).then(function (data) {\n _this5.sdc[cacheKey] = data;\n return data;\n });\n }\n }, {\n key: \"_getServerData\",\n value: function _getServerData(dataHref) {\n return fetchNextData(dataHref, this.isSsr);\n }\n }, {\n key: \"getInitialProps\",\n value: function getInitialProps(Component, ctx) {\n var App = this.components['/_app'].Component;\n\n var AppTree = this._wrapApp(App);\n\n ctx.AppTree = AppTree;\n return (0, _utils.loadGetInitialProps)(App, {\n AppTree: AppTree,\n Component: Component,\n router: this,\n ctx: ctx\n });\n }\n }, {\n key: \"abortComponentLoad\",\n value: function abortComponentLoad(as) {\n if (this.clc) {\n Router.events.emit('routeChangeError', buildCancellationError(), as);\n this.clc();\n this.clc = null;\n }\n }\n }, {\n key: \"notify\",\n value: function notify(data) {\n return this.sub(data, this.components['/_app'].Component);\n }\n }]);\n\n return Router;\n}();\n\nexports[\"default\"] = Router;\nRouter.events = (0, _mitt[\"default\"])();","map":{"version":3,"sources":["../../../../next-server/lib/router/router.ts"],"names":["basePath","process","Object","cancelled","path","url","locationOrigin","resolved","hasBasePath","base","urlAsString","finalUrl","PAGE_LOAD_ERROR","Symbol","addBasePath","resolveHref","router","as","manualScrollRestoration","window","credentials","res","attempts","fetchRetry","isServerRender","err","markLoadingError","Router","route","pathname","query","asPath","components","sdc","sub","clc","pageLoader","_bps","events","_wrapApp","isSsr","isFallback","_inFlightRoute","_shallow","constructor","Component","styleSheets","props","__N_SSG","initialProps","__N_SSP","__NEXT_DATA__","debouncedScrollSave","clearTimeout","scrollDebounceTimeout","setTimeout","history","_N_X","_N_Y","e","state","shallow","options","reload","back","push","prepareUrlAs","replace","isLocalURL","ST","performance","cleanedAs","delBasePath","pages","__rewrites","parsed","method","resolvedAs","p","routeRegex","routeMatch","missingParams","param","console","asPathname","routeInfo","appComp","error","changeState","__N","buildCancellationError","page","cachedRouteInfo","require","isValidElementType","dataHref","set","beforePopState","onlyAHashChange","newHash","oldUrlNoHash","oldHash","scrollToHash","hash","idEl","document","nameEl","urlIsNew","_resolveHref","cleanPathname","parsedHref","Promise","cancel","componentResult","_getData","fn","data","_getStaticData","href","fetchNextData","_getServerData","getInitialProps","AppTree","ctx","abortComponentLoad","notify"],"mappings":"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