UNPKG

next

Version:

The React Framework

73 lines (72 loc) 3.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "resolveHref", { enumerable: true, get: function() { return resolveHref; } }); const _querystring = require("./querystring"); const _formaturl = require("./format-url"); const _omit = require("./omit"); const _utils = require("../../utils"); const _normalizetrailingslash = require("../../../../client/normalize-trailing-slash"); const _islocalurl = require("./is-local-url"); const _isdynamic = require("./is-dynamic"); const _interpolateas = require("./interpolate-as"); function resolveHref(router, href, resolveAs) { // we use a dummy base url for relative urls let base; let urlAsString = typeof href === "string" ? href : (0, _formaturl.formatWithValidation)(href); // repeated slashes and backslashes in the URL are considered // invalid and will never match a Next.js page/file const urlProtoMatch = urlAsString.match(/^[a-zA-Z]{1,}:\/\//); const urlAsStringNoProto = urlProtoMatch ? urlAsString.slice(urlProtoMatch[0].length) : urlAsString; const urlParts = urlAsStringNoProto.split("?"); if ((urlParts[0] || "").match(/(\/\/|\\)/)) { console.error("Invalid href '" + urlAsString + "' passed to next/router in page: '" + router.pathname + "'. Repeated forward-slashes (//) or backslashes \\ are not valid in the href."); const normalizedUrl = (0, _utils.normalizeRepeatedSlashes)(urlAsStringNoProto); urlAsString = (urlProtoMatch ? urlProtoMatch[0] : "") + normalizedUrl; } // Return because it cannot be routed by the Next.js router if (!(0, _islocalurl.isLocalURL)(urlAsString)) { return resolveAs ? [ urlAsString ] : urlAsString; } try { base = new URL(urlAsString.startsWith("#") ? router.asPath : router.pathname, "http://n"); } catch (_) { // fallback to / for invalid asPath values e.g. // base = new URL("/", "http://n"); } try { const finalUrl = new URL(urlAsString, base); finalUrl.pathname = (0, _normalizetrailingslash.normalizePathTrailingSlash)(finalUrl.pathname); let interpolatedAs = ""; if ((0, _isdynamic.isDynamicRoute)(finalUrl.pathname) && finalUrl.searchParams && resolveAs) { const query = (0, _querystring.searchParamsToUrlQuery)(finalUrl.searchParams); const { result , params } = (0, _interpolateas.interpolateAs)(finalUrl.pathname, finalUrl.pathname, query); if (result) { interpolatedAs = (0, _formaturl.formatWithValidation)({ pathname: result, hash: finalUrl.hash, query: (0, _omit.omit)(query, params) }); } } // if the origin didn't change, it means we received a relative href const resolvedHref = finalUrl.origin === base.origin ? finalUrl.href.slice(finalUrl.origin.length) : finalUrl.href; return resolveAs ? [ resolvedHref, interpolatedAs || resolvedHref ] : resolvedHref; } catch (_) { return resolveAs ? [ urlAsString ] : urlAsString; } } //# sourceMappingURL=resolve-href.js.map