create project

This commit is contained in:
ismailsosic
2022-12-27 12:05:56 +01:00
parent 2a33a2d3de
commit cd2143287c
16035 changed files with 2489703 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
import _object_without_properties_loose from "@swc/helpers/src/_object_without_properties_loose.mjs";
import React, { useMemo, useRef } from 'react';
import { PathnameContext } from '../hooks-client-context';
import { isDynamicRoute } from './utils';
/**
* adaptForAppRouterInstance implements the AppRouterInstance with a NextRouter.
*
* @param router the NextRouter to adapt
* @returns an AppRouterInstance
*/ export function adaptForAppRouterInstance(router) {
return {
back () {
router.back();
},
forward () {
router.forward();
},
refresh () {
router.reload();
},
push (href) {
void router.push(href);
},
replace (href) {
void router.replace(href);
},
prefetch (href) {
void router.prefetch(href);
}
};
}
/**
* transforms the ParsedUrlQuery into a URLSearchParams.
*
* @param query the query to transform
* @returns URLSearchParams
*/ function transformQuery(query) {
const params = new URLSearchParams();
for (const [name, value] of Object.entries(query)){
if (Array.isArray(value)) {
for (const val of value){
params.append(name, val);
}
} else if (typeof value !== 'undefined') {
params.append(name, value);
}
}
return params;
}
/**
* adaptForSearchParams transforms the ParsedURLQuery into URLSearchParams.
*
* @param router the router that contains the query.
* @returns the search params in the URLSearchParams format
*/ export function adaptForSearchParams(router) {
if (!router.isReady || !router.query) {
return new URLSearchParams();
}
return transformQuery(router.query);
}
export function PathnameContextProviderAdapter(_param) {
var { children , router } = _param, props = _object_without_properties_loose(_param, [
"children",
"router"
]);
const ref = useRef(props.isAutoExport);
const value = useMemo(()=>{
// isAutoExport is only ever `true` on the first render from the server,
// so reset it to `false` after we read it for the first time as `true`. If
// we don't use the value, then we don't need it.
const isAutoExport = ref.current;
if (isAutoExport) {
ref.current = false;
}
// When the route is a dynamic route, we need to do more processing to
// determine if we need to stop showing the pathname.
if (isDynamicRoute(router.pathname)) {
// When the router is rendering the fallback page, it can't possibly know
// the path, so return `null` here. Read more about fallback pages over
// at:
// https://nextjs.org/docs/api-reference/data-fetching/get-static-paths#fallback-pages
if (router.isFallback) {
return null;
}
// When `isAutoExport` is true, meaning this is a page page has been
// automatically statically optimized, and the router is not ready, then
// we can't know the pathname yet. Read more about automatic static
// optimization at:
// https://nextjs.org/docs/advanced-features/automatic-static-optimization
if (isAutoExport && !router.isReady) {
return null;
}
}
// The `router.asPath` contains the pathname seen by the browser (including
// any query strings), so it should have that stripped. Read more about the
// `asPath` option over at:
// https://nextjs.org/docs/api-reference/next/router#router-object
let url;
try {
url = new URL(router.asPath, 'http://f');
} catch (_) {
// fallback to / for invalid asPath values e.g. //
return '/';
}
return url.pathname;
}, [
router.asPath,
router.isFallback,
router.isReady,
router.pathname
]);
return /*#__PURE__*/ React.createElement(PathnameContext.Provider, {
value: value
}, children);
}
//# sourceMappingURL=adapters.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../shared/lib/router/adapters.tsx"],"names":["React","useMemo","useRef","PathnameContext","isDynamicRoute","adaptForAppRouterInstance","router","back","forward","refresh","reload","push","href","replace","prefetch","transformQuery","query","params","URLSearchParams","name","value","Object","entries","Array","isArray","val","append","adaptForSearchParams","isReady","PathnameContextProviderAdapter","children","props","ref","isAutoExport","current","pathname","isFallback","url","URL","asPath","_","Provider"],"mappings":"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"}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
import { addPathPrefix } from './add-path-prefix';
import { pathHasPrefix } from './path-has-prefix';
/**
* For a given path and a locale, if the locale is given, it will prefix the
* locale. The path shouldn't be an API path. If a default locale is given the
* prefix will be omitted if the locale is already the default locale.
*/ export function addLocale(path, locale, defaultLocale, ignorePrefix) {
if (locale && locale !== defaultLocale && (ignorePrefix || !pathHasPrefix(path.toLowerCase(), `/${locale.toLowerCase()}`) && !pathHasPrefix(path.toLowerCase(), '/api'))) {
return addPathPrefix(path, `/${locale}`);
}
return path;
}
//# sourceMappingURL=add-locale.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/add-locale.ts"],"names":["addPathPrefix","pathHasPrefix","addLocale","path","locale","defaultLocale","ignorePrefix","toLowerCase"],"mappings":"AAAA,SAASA,aAAa,QAAQ,mBAAmB,CAAA;AACjD,SAASC,aAAa,QAAQ,mBAAmB,CAAA;AAEjD;;;;GAIG,CACH,OAAO,SAASC,SAAS,CACvBC,IAAY,EACZC,MAAuB,EACvBC,aAAsB,EACtBC,YAAsB,EACtB;IACA,IACEF,MAAM,IACNA,MAAM,KAAKC,aAAa,IACxB,CAACC,YAAY,IACV,CAACL,aAAa,CAACE,IAAI,CAACI,WAAW,EAAE,EAAE,CAAC,CAAC,EAAEH,MAAM,CAACG,WAAW,EAAE,CAAC,CAAC,CAAC,IAC7D,CAACN,aAAa,CAACE,IAAI,CAACI,WAAW,EAAE,EAAE,MAAM,CAAC,AAAC,CAAC,EAChD;QACA,OAAOP,aAAa,CAACG,IAAI,EAAE,CAAC,CAAC,EAAEC,MAAM,CAAC,CAAC,CAAC,CAAA;KACzC;IAED,OAAOD,IAAI,CAAA;CACZ"}

View File

@@ -0,0 +1,13 @@
import { parsePath } from './parse-path';
/**
* Adds the provided prefix to the given path. It first ensures that the path
* is indeed starting with a slash.
*/ export function addPathPrefix(path, prefix) {
if (!path.startsWith('/') || !prefix) {
return path;
}
const { pathname , query , hash } = parsePath(path);
return `${prefix}${pathname}${query}${hash}`;
}
//# sourceMappingURL=add-path-prefix.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/add-path-prefix.ts"],"names":["parsePath","addPathPrefix","path","prefix","startsWith","pathname","query","hash"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc,CAAA;AAExC;;;GAGG,CACH,OAAO,SAASC,aAAa,CAACC,IAAY,EAAEC,MAAe,EAAE;IAC3D,IAAI,CAACD,IAAI,CAACE,UAAU,CAAC,GAAG,CAAC,IAAI,CAACD,MAAM,EAAE;QACpC,OAAOD,IAAI,CAAA;KACZ;IAED,MAAM,EAAEG,QAAQ,CAAA,EAAEC,KAAK,CAAA,EAAEC,IAAI,CAAA,EAAE,GAAGP,SAAS,CAACE,IAAI,CAAC;IACjD,OAAO,CAAC,EAAEC,MAAM,CAAC,EAAEE,QAAQ,CAAC,EAAEC,KAAK,CAAC,EAAEC,IAAI,CAAC,CAAC,CAAA;CAC7C"}

View File

@@ -0,0 +1,14 @@
import { parsePath } from './parse-path';
/**
* Similarly to `addPathPrefix`, this function adds a suffix at the end on the
* provided path. It also works only for paths ensuring the argument starts
* with a slash.
*/ export function addPathSuffix(path, suffix) {
if (!path.startsWith('/') || !suffix) {
return path;
}
const { pathname , query , hash } = parsePath(path);
return `${pathname}${suffix}${query}${hash}`;
}
//# sourceMappingURL=add-path-suffix.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/add-path-suffix.ts"],"names":["parsePath","addPathSuffix","path","suffix","startsWith","pathname","query","hash"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc,CAAA;AAExC;;;;GAIG,CACH,OAAO,SAASC,aAAa,CAACC,IAAY,EAAEC,MAAe,EAAE;IAC3D,IAAI,CAACD,IAAI,CAACE,UAAU,CAAC,GAAG,CAAC,IAAI,CAACD,MAAM,EAAE;QACpC,OAAOD,IAAI,CAAA;KACZ;IAED,MAAM,EAAEG,QAAQ,CAAA,EAAEC,KAAK,CAAA,EAAEC,IAAI,CAAA,EAAE,GAAGP,SAAS,CAACE,IAAI,CAAC;IACjD,OAAO,CAAC,EAAEG,QAAQ,CAAC,EAAEF,MAAM,CAAC,EAAEG,KAAK,CAAC,EAAEC,IAAI,CAAC,CAAC,CAAA;CAC7C"}

View File

@@ -0,0 +1,24 @@
// remove (name) from pathname as it's not considered for routing
export function normalizeAppPath(pathname) {
return pathname.split('/').reduce((acc, segment, index, segments)=>{
// Empty segments are ignored.
if (!segment) {
return acc;
}
if (segment.startsWith('(') && segment.endsWith(')')) {
return acc;
}
if (segment.startsWith('@')) {
return acc;
}
if (segment === 'page' && index === segments.length - 1) {
return acc;
}
return acc + `/${segment}`;
}, '');
}
export function normalizeRscPath(pathname, enabled) {
return enabled ? pathname.replace(/\.rsc($|\?)/, '') : pathname;
}
//# sourceMappingURL=app-paths.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/app-paths.ts"],"names":["normalizeAppPath","pathname","split","reduce","acc","segment","index","segments","startsWith","endsWith","length","normalizeRscPath","enabled","replace"],"mappings":"AAAA,iEAAiE;AACjE,OAAO,SAASA,gBAAgB,CAACC,QAAgB,EAAE;IACjD,OAAOA,QAAQ,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,CAAC,CAACC,GAAG,EAAEC,OAAO,EAAEC,KAAK,EAAEC,QAAQ,GAAK;QACnE,8BAA8B;QAC9B,IAAI,CAACF,OAAO,EAAE;YACZ,OAAOD,GAAG,CAAA;SACX;QAED,IAAIC,OAAO,CAACG,UAAU,CAAC,GAAG,CAAC,IAAIH,OAAO,CAACI,QAAQ,CAAC,GAAG,CAAC,EAAE;YACpD,OAAOL,GAAG,CAAA;SACX;QAED,IAAIC,OAAO,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;YAC3B,OAAOJ,GAAG,CAAA;SACX;QAED,IAAIC,OAAO,KAAK,MAAM,IAAIC,KAAK,KAAKC,QAAQ,CAACG,MAAM,GAAG,CAAC,EAAE;YACvD,OAAON,GAAG,CAAA;SACX;QAED,OAAOA,GAAG,GAAG,CAAC,CAAC,EAAEC,OAAO,CAAC,CAAC,CAAA;KAC3B,EAAE,EAAE,CAAC,CAAA;CACP;AAED,OAAO,SAASM,gBAAgB,CAACV,QAAgB,EAAEW,OAAiB,EAAE;IACpE,OAAOA,OAAO,GAAGX,QAAQ,CAACY,OAAO,gBAAgB,EAAE,CAAC,GAAGZ,QAAQ,CAAA;CAChE"}

View File

@@ -0,0 +1,24 @@
export function compareRouterStates(a, b) {
const stateKeys = Object.keys(a);
if (stateKeys.length !== Object.keys(b).length) return false;
for(let i = stateKeys.length; i--;){
const key = stateKeys[i];
if (key === 'query') {
const queryKeys = Object.keys(a.query);
if (queryKeys.length !== Object.keys(b.query).length) {
return false;
}
for(let j = queryKeys.length; j--;){
const queryKey = queryKeys[j];
if (!b.query.hasOwnProperty(queryKey) || a.query[queryKey] !== b.query[queryKey]) {
return false;
}
}
} else if (!b.hasOwnProperty(key) || a[key] !== b[key]) {
return false;
}
}
return true;
}
//# sourceMappingURL=compare-states.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/compare-states.ts"],"names":["compareRouterStates","a","b","stateKeys","Object","keys","length","i","key","queryKeys","query","j","queryKey","hasOwnProperty"],"mappings":"AAEA,OAAO,SAASA,mBAAmB,CAACC,CAAkB,EAAEC,CAAkB,EAAE;IAC1E,MAAMC,SAAS,GAAGC,MAAM,CAACC,IAAI,CAACJ,CAAC,CAAC;IAChC,IAAIE,SAAS,CAACG,MAAM,KAAKF,MAAM,CAACC,IAAI,CAACH,CAAC,CAAC,CAACI,MAAM,EAAE,OAAO,KAAK,CAAA;IAE5D,IAAK,IAAIC,CAAC,GAAGJ,SAAS,CAACG,MAAM,EAAEC,CAAC,EAAE,EAAI;QACpC,MAAMC,GAAG,GAAGL,SAAS,CAACI,CAAC,CAAC;QACxB,IAAIC,GAAG,KAAK,OAAO,EAAE;YACnB,MAAMC,SAAS,GAAGL,MAAM,CAACC,IAAI,CAACJ,CAAC,CAACS,KAAK,CAAC;YACtC,IAAID,SAAS,CAACH,MAAM,KAAKF,MAAM,CAACC,IAAI,CAACH,CAAC,CAACQ,KAAK,CAAC,CAACJ,MAAM,EAAE;gBACpD,OAAO,KAAK,CAAA;aACb;YACD,IAAK,IAAIK,CAAC,GAAGF,SAAS,CAACH,MAAM,EAAEK,CAAC,EAAE,EAAI;gBACpC,MAAMC,QAAQ,GAAGH,SAAS,CAACE,CAAC,CAAC;gBAC7B,IACE,CAACT,CAAC,CAACQ,KAAK,CAACG,cAAc,CAACD,QAAQ,CAAC,IACjCX,CAAC,CAACS,KAAK,CAACE,QAAQ,CAAC,KAAKV,CAAC,CAACQ,KAAK,CAACE,QAAQ,CAAC,EACvC;oBACA,OAAO,KAAK,CAAA;iBACb;aACF;SACF,MAAM,IACL,CAACV,CAAC,CAACW,cAAc,CAACL,GAAG,CAAC,IACtBP,CAAC,CAACO,GAAG,CAA0B,KAAKN,CAAC,CAACM,GAAG,CAA0B,EACnE;YACA,OAAO,KAAK,CAAA;SACb;KACF;IAED,OAAO,IAAI,CAAA;CACZ"}

View File

@@ -0,0 +1,6 @@
// escape delimiters used by path-to-regexp
export default function escapePathDelimiters(segment, escapeEncoded) {
return segment.replace(new RegExp(`([/#?]${escapeEncoded ? '|%(2f|23|3f)' : ''})`, 'gi'), (char)=>encodeURIComponent(char));
};
//# sourceMappingURL=escape-path-delimiters.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/escape-path-delimiters.ts"],"names":["escapePathDelimiters","segment","escapeEncoded","replace","RegExp","char","encodeURIComponent"],"mappings":"AAAA,2CAA2C;AAC3C,eAAe,SAASA,oBAAoB,CAC1CC,OAAe,EACfC,aAAuB,EACf;IACR,OAAOD,OAAO,CAACE,OAAO,CACpB,IAAIC,MAAM,CAAC,CAAC,MAAM,EAAEF,aAAa,GAAG,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EACjE,CAACG,IAAY,GAAKC,kBAAkB,CAACD,IAAI,CAAC,CAC3C,CAAA;CACF,CAAA"}

View File

@@ -0,0 +1,17 @@
import { removeTrailingSlash } from './remove-trailing-slash';
import { addPathPrefix } from './add-path-prefix';
import { addPathSuffix } from './add-path-suffix';
import { addLocale } from './add-locale';
export function formatNextPathnameInfo(info) {
let pathname = addLocale(info.pathname, info.locale, info.buildId ? undefined : info.defaultLocale, info.ignorePrefix);
if (info.buildId || !info.trailingSlash) {
pathname = removeTrailingSlash(pathname);
}
if (info.buildId) {
pathname = addPathSuffix(addPathPrefix(pathname, `/_next/data/${info.buildId}`), info.pathname === '/' ? 'index.json' : '.json');
}
pathname = addPathPrefix(pathname, info.basePath);
return !info.buildId && info.trailingSlash ? !pathname.endsWith('/') ? addPathSuffix(pathname, '/') : pathname : removeTrailingSlash(pathname);
}
//# sourceMappingURL=format-next-pathname-info.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/format-next-pathname-info.ts"],"names":["removeTrailingSlash","addPathPrefix","addPathSuffix","addLocale","formatNextPathnameInfo","info","pathname","locale","buildId","undefined","defaultLocale","ignorePrefix","trailingSlash","basePath","endsWith"],"mappings":"AACA,SAASA,mBAAmB,QAAQ,yBAAyB,CAAA;AAC7D,SAASC,aAAa,QAAQ,mBAAmB,CAAA;AACjD,SAASC,aAAa,QAAQ,mBAAmB,CAAA;AACjD,SAASC,SAAS,QAAQ,cAAc,CAAA;AAOxC,OAAO,SAASC,sBAAsB,CAACC,IAAkB,EAAE;IACzD,IAAIC,QAAQ,GAAGH,SAAS,CACtBE,IAAI,CAACC,QAAQ,EACbD,IAAI,CAACE,MAAM,EACXF,IAAI,CAACG,OAAO,GAAGC,SAAS,GAAGJ,IAAI,CAACK,aAAa,EAC7CL,IAAI,CAACM,YAAY,CAClB;IAED,IAAIN,IAAI,CAACG,OAAO,IAAI,CAACH,IAAI,CAACO,aAAa,EAAE;QACvCN,QAAQ,GAAGN,mBAAmB,CAACM,QAAQ,CAAC;KACzC;IAED,IAAID,IAAI,CAACG,OAAO,EAAE;QAChBF,QAAQ,GAAGJ,aAAa,CACtBD,aAAa,CAACK,QAAQ,EAAE,CAAC,YAAY,EAAED,IAAI,CAACG,OAAO,CAAC,CAAC,CAAC,EACtDH,IAAI,CAACC,QAAQ,KAAK,GAAG,GAAG,YAAY,GAAG,OAAO,CAC/C;KACF;IAEDA,QAAQ,GAAGL,aAAa,CAACK,QAAQ,EAAED,IAAI,CAACQ,QAAQ,CAAC;IACjD,OAAO,CAACR,IAAI,CAACG,OAAO,IAAIH,IAAI,CAACO,aAAa,GACtC,CAACN,QAAQ,CAACQ,QAAQ,CAAC,GAAG,CAAC,GACrBZ,aAAa,CAACI,QAAQ,EAAE,GAAG,CAAC,GAC5BA,QAAQ,GACVN,mBAAmB,CAACM,QAAQ,CAAC,CAAA;CAClC"}

View File

@@ -0,0 +1,63 @@
import * as querystring from './querystring';
const slashedProtocols = /https?|ftp|gopher|file/;
export function formatUrl(urlObj) {
let { auth , hostname } = urlObj;
let protocol = urlObj.protocol || '';
let pathname = urlObj.pathname || '';
let hash = urlObj.hash || '';
let query = urlObj.query || '';
let host = false;
auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : '';
if (urlObj.host) {
host = auth + urlObj.host;
} else if (hostname) {
host = auth + (~hostname.indexOf(':') ? `[${hostname}]` : hostname);
if (urlObj.port) {
host += ':' + urlObj.port;
}
}
if (query && typeof query === 'object') {
query = String(querystring.urlQueryToSearchParams(query));
}
let search = urlObj.search || query && `?${query}` || '';
if (protocol && !protocol.endsWith(':')) protocol += ':';
if (urlObj.slashes || (!protocol || slashedProtocols.test(protocol)) && host !== false) {
host = '//' + (host || '');
if (pathname && pathname[0] !== '/') pathname = '/' + pathname;
} else if (!host) {
host = '';
}
if (hash && hash[0] !== '#') hash = '#' + hash;
if (search && search[0] !== '?') search = '?' + search;
pathname = pathname.replace(/[?#]/g, encodeURIComponent);
search = search.replace('#', '%23');
return `${protocol}${host}${pathname}${search}${hash}`;
}
export const urlObjectKeys = [
'auth',
'hash',
'host',
'hostname',
'href',
'path',
'pathname',
'port',
'protocol',
'query',
'search',
'slashes',
];
export function formatWithValidation(url) {
if (process.env.NODE_ENV === 'development') {
if (url !== null && typeof url === 'object') {
Object.keys(url).forEach((key)=>{
if (urlObjectKeys.indexOf(key) === -1) {
console.warn(`Unknown key passed via urlObject into url.format: ${key}`);
}
});
}
}
return formatUrl(url);
}
//# sourceMappingURL=format-url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/format-url.ts"],"names":["querystring","slashedProtocols","formatUrl","urlObj","auth","hostname","protocol","pathname","hash","query","host","encodeURIComponent","replace","indexOf","port","String","urlQueryToSearchParams","search","endsWith","slashes","test","urlObjectKeys","formatWithValidation","url","process","env","NODE_ENV","Object","keys","forEach","key","console","warn"],"mappings":"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"}

View File

@@ -0,0 +1,8 @@
// Translates a logical route into its pages asset path (relative from a common prefix)
// "asset path" being its javascript file, data file, prerendered html,...
export default function getAssetPathFromRoute(route, ext = '') {
const path = route === '/' ? '/index' : /^\/index(\/|$)/.test(route) ? `/index${route}` : `${route}`;
return path + ext;
};
//# sourceMappingURL=get-asset-path-from-route.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/get-asset-path-from-route.ts"],"names":["getAssetPathFromRoute","route","ext","path","test"],"mappings":"AAAA,uFAAuF;AACvF,0EAA0E;AAC1E,eAAe,SAASA,qBAAqB,CAC3CC,KAAa,EACbC,GAAW,GAAG,EAAE,EACR;IACR,MAAMC,IAAI,GACRF,KAAK,KAAK,GAAG,GACT,QAAQ,GACR,iBAAiBG,IAAI,CAACH,KAAK,CAAC,GAC5B,CAAC,MAAM,EAAEA,KAAK,CAAC,CAAC,GAChB,CAAC,EAAEA,KAAK,CAAC,CAAC;IAChB,OAAOE,IAAI,GAAGD,GAAG,CAAA;CAClB,CAAA"}

View File

@@ -0,0 +1,29 @@
import { normalizeLocalePath } from '../../i18n/normalize-locale-path';
import { removePathPrefix } from './remove-path-prefix';
import { pathHasPrefix } from './path-has-prefix';
export function getNextPathnameInfo(pathname, options) {
var _nextConfig;
const { basePath , i18n , trailingSlash } = (_nextConfig = options.nextConfig) != null ? _nextConfig : {};
const info = {
pathname: pathname,
trailingSlash: pathname !== '/' ? pathname.endsWith('/') : trailingSlash
};
if (basePath && pathHasPrefix(info.pathname, basePath)) {
info.pathname = removePathPrefix(info.pathname, basePath);
info.basePath = basePath;
}
if (options.parseData === true && info.pathname.startsWith('/_next/data/') && info.pathname.endsWith('.json')) {
const paths = info.pathname.replace(/^\/_next\/data\//, '').replace(/\.json$/, '').split('/');
const buildId = paths[0];
info.pathname = paths[1] !== 'index' ? `/${paths.slice(1).join('/')}` : '/';
info.buildId = buildId;
}
if (i18n) {
const pathLocale = normalizeLocalePath(info.pathname, i18n.locales);
info.locale = pathLocale == null ? void 0 : pathLocale.detectedLocale;
info.pathname = (pathLocale == null ? void 0 : pathLocale.pathname) || info.pathname;
}
return info;
}
//# sourceMappingURL=get-next-pathname-info.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/get-next-pathname-info.ts"],"names":["normalizeLocalePath","removePathPrefix","pathHasPrefix","getNextPathnameInfo","pathname","options","basePath","i18n","trailingSlash","nextConfig","info","endsWith","parseData","startsWith","paths","replace","split","buildId","slice","join","pathLocale","locales","locale","detectedLocale"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,kCAAkC,CAAA;AACtE,SAASC,gBAAgB,QAAQ,sBAAsB,CAAA;AACvD,SAASC,aAAa,QAAQ,mBAAmB,CAAA;AA2CjD,OAAO,SAASC,mBAAmB,CAACC,QAAgB,EAAEC,OAAgB,EAAE;QAC5BA,WAAkB;IAA5D,MAAM,EAAEC,QAAQ,CAAA,EAAEC,IAAI,CAAA,EAAEC,aAAa,CAAA,EAAE,GAAGH,CAAAA,WAAkB,GAAlBA,OAAO,CAACI,UAAU,YAAlBJ,WAAkB,GAAI,EAAE;IAClE,MAAMK,IAAI,GAAqB;QAC7BN,QAAQ,EAAEA,QAAQ;QAClBI,aAAa,EAAEJ,QAAQ,KAAK,GAAG,GAAGA,QAAQ,CAACO,QAAQ,CAAC,GAAG,CAAC,GAAGH,aAAa;KACzE;IAED,IAAIF,QAAQ,IAAIJ,aAAa,CAACQ,IAAI,CAACN,QAAQ,EAAEE,QAAQ,CAAC,EAAE;QACtDI,IAAI,CAACN,QAAQ,GAAGH,gBAAgB,CAACS,IAAI,CAACN,QAAQ,EAAEE,QAAQ,CAAC;QACzDI,IAAI,CAACJ,QAAQ,GAAGA,QAAQ;KACzB;IAED,IACED,OAAO,CAACO,SAAS,KAAK,IAAI,IAC1BF,IAAI,CAACN,QAAQ,CAACS,UAAU,CAAC,cAAc,CAAC,IACxCH,IAAI,CAACN,QAAQ,CAACO,QAAQ,CAAC,OAAO,CAAC,EAC/B;QACA,MAAMG,KAAK,GAAGJ,IAAI,CAACN,QAAQ,CACxBW,OAAO,qBAAqB,EAAE,CAAC,CAC/BA,OAAO,YAAY,EAAE,CAAC,CACtBC,KAAK,CAAC,GAAG,CAAC;QAEb,MAAMC,OAAO,GAAGH,KAAK,CAAC,CAAC,CAAC;QACxBJ,IAAI,CAACN,QAAQ,GAAGU,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,EAAEA,KAAK,CAACI,KAAK,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;QAC3ET,IAAI,CAACO,OAAO,GAAGA,OAAO;KACvB;IAED,IAAIV,IAAI,EAAE;QACR,MAAMa,UAAU,GAAGpB,mBAAmB,CAACU,IAAI,CAACN,QAAQ,EAAEG,IAAI,CAACc,OAAO,CAAC;QACnEX,IAAI,CAACY,MAAM,GAAGF,UAAU,QAAgB,GAA1BA,KAAAA,CAA0B,GAA1BA,UAAU,CAAEG,cAAc;QACxCb,IAAI,CAACN,QAAQ,GAAGgB,CAAAA,UAAU,QAAU,GAApBA,KAAAA,CAAoB,GAApBA,UAAU,CAAEhB,QAAQ,CAAA,IAAIM,IAAI,CAACN,QAAQ;KACtD;IAED,OAAOM,IAAI,CAAA;CACZ"}

View File

@@ -0,0 +1,15 @@
// Translate a pages asset path (relative from a common prefix) back into its logical route
import { isDynamicRoute } from './is-dynamic';
// "asset path" being its javascript file, data file, prerendered html,...
export default function getRouteFromAssetPath(assetPath, ext = '') {
assetPath = assetPath.replace(/\\/g, '/');
assetPath = ext && assetPath.endsWith(ext) ? assetPath.slice(0, -ext.length) : assetPath;
if (assetPath.startsWith('/index/') && !isDynamicRoute(assetPath)) {
assetPath = assetPath.slice(6);
} else if (assetPath === '/index') {
assetPath = '/';
}
return assetPath;
};
//# sourceMappingURL=get-route-from-asset-path.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/get-route-from-asset-path.ts"],"names":["isDynamicRoute","getRouteFromAssetPath","assetPath","ext","replace","endsWith","slice","length","startsWith"],"mappings":"AAAA,2FAA2F;AAE3F,SAASA,cAAc,QAAQ,cAAc,CAAA;AAE7C,0EAA0E;AAC1E,eAAe,SAASC,qBAAqB,CAC3CC,SAAiB,EACjBC,GAAW,GAAG,EAAE,EACR;IACRD,SAAS,GAAGA,SAAS,CAACE,OAAO,QAAQ,GAAG,CAAC;IACzCF,SAAS,GACPC,GAAG,IAAID,SAAS,CAACG,QAAQ,CAACF,GAAG,CAAC,GAAGD,SAAS,CAACI,KAAK,CAAC,CAAC,EAAE,CAACH,GAAG,CAACI,MAAM,CAAC,GAAGL,SAAS;IAC9E,IAAIA,SAAS,CAACM,UAAU,CAAC,SAAS,CAAC,IAAI,CAACR,cAAc,CAACE,SAAS,CAAC,EAAE;QACjEA,SAAS,GAAGA,SAAS,CAACI,KAAK,CAAC,CAAC,CAAC;KAC/B,MAAM,IAAIJ,SAAS,KAAK,QAAQ,EAAE;QACjCA,SAAS,GAAG,GAAG;KAChB;IACD,OAAOA,SAAS,CAAA;CACjB,CAAA"}

View File

@@ -0,0 +1,4 @@
export { getSortedRoutes } from './sorted-routes';
export { isDynamicRoute } from './is-dynamic';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/index.ts"],"names":["getSortedRoutes","isDynamicRoute"],"mappings":"AAAA,SAASA,eAAe,QAAQ,iBAAiB,CAAA;AACjD,SAASC,cAAc,QAAQ,cAAc,CAAA"}

View File

@@ -0,0 +1,5 @@
export function isBot(userAgent) {
return /Googlebot|Mediapartners-Google|AdsBot-Google|googleweblight|Storebot-Google|Google-PageRenderer|Bingbot|BingPreview|Slurp|DuckDuckBot|baiduspider|yandex|sogou|LinkedInBot|bitlybot|tumblr|vkShare|quora link preview|facebookexternalhit|facebookcatalog|Twitterbot|applebot|redditbot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|ia_archiver/i.test(userAgent);
}
//# sourceMappingURL=is-bot.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/is-bot.ts"],"names":["isBot","userAgent","test"],"mappings":"AAAA,OAAO,SAASA,KAAK,CAACC,SAAiB,EAAW;IAChD,OAAO,oVAAoVC,IAAI,CAC7VD,SAAS,CACV,CAAA;CACF"}

View File

@@ -0,0 +1,7 @@
// Identify /[param]/ in route string
const TEST_ROUTE = /\/\[[^/]+?\](?=\/|$)/;
export function isDynamicRoute(route) {
return TEST_ROUTE.test(route);
}
//# sourceMappingURL=is-dynamic.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/is-dynamic.ts"],"names":["TEST_ROUTE","isDynamicRoute","route","test"],"mappings":"AAAA,qCAAqC;AACrC,MAAMA,UAAU,yBAAyB;AAEzC,OAAO,SAASC,cAAc,CAACC,KAAa,EAAW;IACrD,OAAOF,UAAU,CAACG,IAAI,CAACD,KAAK,CAAC,CAAA;CAC9B"}

View File

@@ -0,0 +1,21 @@
import { matchHas } from './prepare-destination';
export function getMiddlewareRouteMatcher(matchers) {
return (pathname, req, query)=>{
for (const matcher of matchers){
const routeMatch = new RegExp(matcher.regexp).exec(pathname);
if (!routeMatch) {
continue;
}
if (matcher.has || matcher.missing) {
const hasParams = matchHas(req, query, matcher.has, matcher.missing);
if (!hasParams) {
continue;
}
}
return true;
}
return false;
};
}
//# sourceMappingURL=middleware-route-matcher.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/middleware-route-matcher.ts"],"names":["matchHas","getMiddlewareRouteMatcher","matchers","pathname","req","query","matcher","routeMatch","RegExp","regexp","exec","has","missing","hasParams"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,uBAAuB,CAAA;AAUhD,OAAO,SAASC,yBAAyB,CACvCC,QAA6B,EACP;IACtB,OAAO,CACLC,QAAmC,EACnCC,GAAoB,EACpBC,KAAa,GACV;QACH,KAAK,MAAMC,OAAO,IAAIJ,QAAQ,CAAE;YAC9B,MAAMK,UAAU,GAAG,IAAIC,MAAM,CAACF,OAAO,CAACG,MAAM,CAAC,CAACC,IAAI,CAACP,QAAQ,CAAE;YAC7D,IAAI,CAACI,UAAU,EAAE;gBACf,SAAQ;aACT;YAED,IAAID,OAAO,CAACK,GAAG,IAAIL,OAAO,CAACM,OAAO,EAAE;gBAClC,MAAMC,SAAS,GAAGb,QAAQ,CAACI,GAAG,EAAEC,KAAK,EAAEC,OAAO,CAACK,GAAG,EAAEL,OAAO,CAACM,OAAO,CAAC;gBACpE,IAAI,CAACC,SAAS,EAAE;oBACd,SAAQ;iBACT;aACF;YAED,OAAO,IAAI,CAAA;SACZ;QAED,OAAO,KAAK,CAAA;KACb,CAAA;CACF"}

View File

@@ -0,0 +1,23 @@
/**
* Given a path this function will find the pathname, query and hash and return
* them. This is useful to parse full paths on the client side.
* @param path A path to parse e.g. /foo/bar?id=1#hash
*/ export function parsePath(path) {
const hashIndex = path.indexOf('#');
const queryIndex = path.indexOf('?');
const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex);
if (hasQuery || hashIndex > -1) {
return {
pathname: path.substring(0, hasQuery ? queryIndex : hashIndex),
query: hasQuery ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : undefined) : '',
hash: hashIndex > -1 ? path.slice(hashIndex) : ''
};
}
return {
pathname: path,
query: '',
hash: ''
};
}
//# sourceMappingURL=parse-path.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/parse-path.ts"],"names":["parsePath","path","hashIndex","indexOf","queryIndex","hasQuery","pathname","substring","query","undefined","hash","slice"],"mappings":"AAAA;;;;GAIG,CACH,OAAO,SAASA,SAAS,CAACC,IAAY,EAAE;IACtC,MAAMC,SAAS,GAAGD,IAAI,CAACE,OAAO,CAAC,GAAG,CAAC;IACnC,MAAMC,UAAU,GAAGH,IAAI,CAACE,OAAO,CAAC,GAAG,CAAC;IACpC,MAAME,QAAQ,GAAGD,UAAU,GAAG,CAAC,CAAC,IAAI,CAACF,SAAS,GAAG,CAAC,IAAIE,UAAU,GAAGF,SAAS,CAAC;IAE7E,IAAIG,QAAQ,IAAIH,SAAS,GAAG,CAAC,CAAC,EAAE;QAC9B,OAAO;YACLI,QAAQ,EAAEL,IAAI,CAACM,SAAS,CAAC,CAAC,EAAEF,QAAQ,GAAGD,UAAU,GAAGF,SAAS,CAAC;YAC9DM,KAAK,EAAEH,QAAQ,GACXJ,IAAI,CAACM,SAAS,CAACH,UAAU,EAAEF,SAAS,GAAG,CAAC,CAAC,GAAGA,SAAS,GAAGO,SAAS,CAAC,GAClE,EAAE;YACNC,IAAI,EAAER,SAAS,GAAG,CAAC,CAAC,GAAGD,IAAI,CAACU,KAAK,CAACT,SAAS,CAAC,GAAG,EAAE;SAClD,CAAA;KACF;IAED,OAAO;QAAEI,QAAQ,EAAEL,IAAI;QAAEO,KAAK,EAAE,EAAE;QAAEE,IAAI,EAAE,EAAE;KAAE,CAAA;CAC/C"}

View File

@@ -0,0 +1,24 @@
import { getLocationOrigin } from '../../utils';
import { searchParamsToUrlQuery } from './querystring';
/**
* Parses path-relative urls (e.g. `/hello/world?foo=bar`). If url isn't path-relative
* (e.g. `./hello`) then at least base must be.
* Absolute urls are rejected with one exception, in the browser, absolute urls that are on
* the current origin will be parsed as relative
*/ export function parseRelativeUrl(url, base) {
const globalBase = new URL(typeof window === 'undefined' ? 'http://n' : getLocationOrigin());
const resolvedBase = base ? new URL(base, globalBase) : url.startsWith('.') ? new URL(typeof window === 'undefined' ? 'http://n' : window.location.href) : globalBase;
const { pathname , searchParams , search , hash , href , origin } = new URL(url, resolvedBase);
if (origin !== globalBase.origin) {
throw new Error(`invariant: invalid relative URL, router received ${url}`);
}
return {
pathname,
query: searchParamsToUrlQuery(searchParams),
search,
hash,
href: href.slice(globalBase.origin.length)
};
}
//# sourceMappingURL=parse-relative-url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/parse-relative-url.ts"],"names":["getLocationOrigin","searchParamsToUrlQuery","parseRelativeUrl","url","base","globalBase","URL","window","resolvedBase","startsWith","location","href","pathname","searchParams","search","hash","origin","Error","query","slice","length"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,aAAa,CAAA;AAC/C,SAASC,sBAAsB,QAAQ,eAAe,CAAA;AAUtD;;;;;GAKG,CACH,OAAO,SAASC,gBAAgB,CAC9BC,GAAW,EACXC,IAAa,EACM;IACnB,MAAMC,UAAU,GAAG,IAAIC,GAAG,CACxB,OAAOC,MAAM,KAAK,WAAW,GAAG,UAAU,GAAGP,iBAAiB,EAAE,CACjE;IAED,MAAMQ,YAAY,GAAGJ,IAAI,GACrB,IAAIE,GAAG,CAACF,IAAI,EAAEC,UAAU,CAAC,GACzBF,GAAG,CAACM,UAAU,CAAC,GAAG,CAAC,GACnB,IAAIH,GAAG,CAAC,OAAOC,MAAM,KAAK,WAAW,GAAG,UAAU,GAAGA,MAAM,CAACG,QAAQ,CAACC,IAAI,CAAC,GAC1EN,UAAU;IAEd,MAAM,EAAEO,QAAQ,CAAA,EAAEC,YAAY,CAAA,EAAEC,MAAM,CAAA,EAAEC,IAAI,CAAA,EAAEJ,IAAI,CAAA,EAAEK,MAAM,CAAA,EAAE,GAAG,IAAIV,GAAG,CACpEH,GAAG,EACHK,YAAY,CACb;IACD,IAAIQ,MAAM,KAAKX,UAAU,CAACW,MAAM,EAAE;QAChC,MAAM,IAAIC,KAAK,CAAC,CAAC,iDAAiD,EAAEd,GAAG,CAAC,CAAC,CAAC,CAAA;KAC3E;IACD,OAAO;QACLS,QAAQ;QACRM,KAAK,EAAEjB,sBAAsB,CAACY,YAAY,CAAC;QAC3CC,MAAM;QACNC,IAAI;QACJJ,IAAI,EAAEA,IAAI,CAACQ,KAAK,CAACd,UAAU,CAACW,MAAM,CAACI,MAAM,CAAC;KAC3C,CAAA;CACF"}

View File

@@ -0,0 +1,20 @@
import { searchParamsToUrlQuery } from './querystring';
import { parseRelativeUrl } from './parse-relative-url';
export function parseUrl(url) {
if (url.startsWith('/')) {
return parseRelativeUrl(url);
}
const parsedURL = new URL(url);
return {
hash: parsedURL.hash,
hostname: parsedURL.hostname,
href: parsedURL.href,
pathname: parsedURL.pathname,
port: parsedURL.port,
protocol: parsedURL.protocol,
query: searchParamsToUrlQuery(parsedURL.searchParams),
search: parsedURL.search
};
}
//# sourceMappingURL=parse-url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/parse-url.ts"],"names":["searchParamsToUrlQuery","parseRelativeUrl","parseUrl","url","startsWith","parsedURL","URL","hash","hostname","href","pathname","port","protocol","query","searchParams","search"],"mappings":"AAEA,SAASA,sBAAsB,QAAQ,eAAe,CAAA;AACtD,SAASC,gBAAgB,QAAQ,sBAAsB,CAAA;AAavD,OAAO,SAASC,QAAQ,CAACC,GAAW,EAAa;IAC/C,IAAIA,GAAG,CAACC,UAAU,CAAC,GAAG,CAAC,EAAE;QACvB,OAAOH,gBAAgB,CAACE,GAAG,CAAC,CAAA;KAC7B;IAED,MAAME,SAAS,GAAG,IAAIC,GAAG,CAACH,GAAG,CAAC;IAC9B,OAAO;QACLI,IAAI,EAAEF,SAAS,CAACE,IAAI;QACpBC,QAAQ,EAAEH,SAAS,CAACG,QAAQ;QAC5BC,IAAI,EAAEJ,SAAS,CAACI,IAAI;QACpBC,QAAQ,EAAEL,SAAS,CAACK,QAAQ;QAC5BC,IAAI,EAAEN,SAAS,CAACM,IAAI;QACpBC,QAAQ,EAAEP,SAAS,CAACO,QAAQ;QAC5BC,KAAK,EAAEb,sBAAsB,CAACK,SAAS,CAACS,YAAY,CAAC;QACrDC,MAAM,EAAEV,SAAS,CAACU,MAAM;KACzB,CAAA;CACF"}

View File

@@ -0,0 +1,16 @@
import { parsePath } from './parse-path';
/**
* Checks if a given path starts with a given prefix. It ensures it matches
* exactly without containing extra chars. e.g. prefix /docs should replace
* for /docs, /docs/, /docs/a but not /docsss
* @param path The path to check.
* @param prefix The prefix to check against.
*/ export function pathHasPrefix(path, prefix) {
if (typeof path !== 'string') {
return false;
}
const { pathname } = parsePath(path);
return pathname === prefix || pathname.startsWith(prefix + '/');
}
//# sourceMappingURL=path-has-prefix.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/path-has-prefix.ts"],"names":["parsePath","pathHasPrefix","path","prefix","pathname","startsWith"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc,CAAA;AAExC;;;;;;GAMG,CACH,OAAO,SAASC,aAAa,CAACC,IAAY,EAAEC,MAAc,EAAE;IAC1D,IAAI,OAAOD,IAAI,KAAK,QAAQ,EAAE;QAC5B,OAAO,KAAK,CAAA;KACb;IAED,MAAM,EAAEE,QAAQ,CAAA,EAAE,GAAGJ,SAAS,CAACE,IAAI,CAAC;IACpC,OAAOE,QAAQ,KAAKD,MAAM,IAAIC,QAAQ,CAACC,UAAU,CAACF,MAAM,GAAG,GAAG,CAAC,CAAA;CAChE"}

View File

@@ -0,0 +1,41 @@
import _extends from "@swc/helpers/src/_extends.mjs";
import { pathToRegexp } from 'next/dist/compiled/path-to-regexp';
import { regexpToFunction } from 'next/dist/compiled/path-to-regexp';
/**
* Generates a path matcher function for a given path and options based on
* path-to-regexp. By default the match will be case insensitive, non strict
* and delimited by `/`.
*/ export function getPathMatch(path, options) {
const keys = [];
const regexp = pathToRegexp(path, keys, {
delimiter: '/',
sensitive: false,
strict: options == null ? void 0 : options.strict
});
const matcher = regexpToFunction((options == null ? void 0 : options.regexModifier) ? new RegExp(options.regexModifier(regexp.source), regexp.flags) : regexp, keys);
/**
* A matcher function that will check if a given pathname matches the path
* given in the builder function. When the path does not match it will return
* `false` but if it does it will return an object with the matched params
* merged with the params provided in the second argument.
*/ return (pathname, params)=>{
const res = pathname == null ? false : matcher(pathname);
if (!res) {
return false;
}
/**
* If unnamed params are not allowed they must be removed from
* the matched parameters. path-to-regexp uses "string" for named and
* "number" for unnamed parameters.
*/ if (options == null ? void 0 : options.removeUnnamedParams) {
for (const key of keys){
if (typeof key.name === 'number') {
delete res.params[key.name];
}
}
}
return _extends({}, params, res.params);
};
}
//# sourceMappingURL=path-match.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/path-match.ts"],"names":["pathToRegexp","regexpToFunction","getPathMatch","path","options","keys","regexp","delimiter","sensitive","strict","matcher","regexModifier","RegExp","source","flags","pathname","params","res","removeUnnamedParams","key","name"],"mappings":"AAAA;AACA,SAASA,YAAY,QAAQ,mCAAmC,CAAA;AAChE,SAASC,gBAAgB,QAAQ,mCAAmC,CAAA;AAoBpE;;;;GAIG,CACH,OAAO,SAASC,YAAY,CAACC,IAAY,EAAEC,OAAiB,EAAE;IAC5D,MAAMC,IAAI,GAAU,EAAE;IACtB,MAAMC,MAAM,GAAGN,YAAY,CAACG,IAAI,EAAEE,IAAI,EAAE;QACtCE,SAAS,EAAE,GAAG;QACdC,SAAS,EAAE,KAAK;QAChBC,MAAM,EAAEL,OAAO,QAAQ,GAAfA,KAAAA,CAAe,GAAfA,OAAO,CAAEK,MAAM;KACxB,CAAC;IAEF,MAAMC,OAAO,GAAGT,gBAAgB,CAC9BG,CAAAA,OAAO,QAAe,GAAtBA,KAAAA,CAAsB,GAAtBA,OAAO,CAAEO,aAAa,CAAA,GAClB,IAAIC,MAAM,CAACR,OAAO,CAACO,aAAa,CAACL,MAAM,CAACO,MAAM,CAAC,EAAEP,MAAM,CAACQ,KAAK,CAAC,GAC9DR,MAAM,EACVD,IAAI,CACL;IAED;;;;;KAKG,CACH,OAAO,CACLU,QAAwB,EACxBC,MAAY,GACE;QACd,MAAMC,GAAG,GAAGF,QAAQ,IAAI,IAAI,GAAG,KAAK,GAAGL,OAAO,CAACK,QAAQ,CAAC;QACxD,IAAI,CAACE,GAAG,EAAE;YACR,OAAO,KAAK,CAAA;SACb;QAED;;;;OAIG,CACH,IAAIb,OAAO,QAAqB,GAA5BA,KAAAA,CAA4B,GAA5BA,OAAO,CAAEc,mBAAmB,EAAE;YAChC,KAAK,MAAMC,GAAG,IAAId,IAAI,CAAE;gBACtB,IAAI,OAAOc,GAAG,CAACC,IAAI,KAAK,QAAQ,EAAE;oBAChC,OAAO,AAACH,GAAG,CAACD,MAAM,AAAQ,CAACG,GAAG,CAACC,IAAI,CAAC;iBACrC;aACF;SACF;QAED,OAAO,aAAKJ,MAAM,EAAKC,GAAG,CAACD,MAAM,CAAE,CAAA;KACpC,CAAA;CACF"}

View File

@@ -0,0 +1,181 @@
import _extends from "@swc/helpers/src/_extends.mjs";
import { compile, pathToRegexp } from 'next/dist/compiled/path-to-regexp';
import { escapeStringRegexp } from '../../escape-regexp';
import { parseUrl } from './parse-url';
/**
* Ensure only a-zA-Z are used for param names for proper interpolating
* with path-to-regexp
*/ function getSafeParamName(paramName) {
let newParamName = '';
for(let i = 0; i < paramName.length; i++){
const charCode = paramName.charCodeAt(i);
if (charCode > 64 && charCode < 91 || charCode > 96 && charCode < 123 // a-z
) {
newParamName += paramName[i];
}
}
return newParamName;
}
function escapeSegment(str, segmentName) {
return str.replace(new RegExp(`:${escapeStringRegexp(segmentName)}`, 'g'), `__ESC_COLON_${segmentName}`);
}
function unescapeSegments(str) {
return str.replace(/__ESC_COLON_/gi, ':');
}
export function matchHas(req, query, has = [], missing = []) {
const params = {};
const hasMatch = (hasItem)=>{
let value;
let key = hasItem.key;
switch(hasItem.type){
case 'header':
{
key = key.toLowerCase();
value = req.headers[key];
break;
}
case 'cookie':
{
value = req.cookies[hasItem.key];
break;
}
case 'query':
{
value = query[key];
break;
}
case 'host':
{
const { host } = (req == null ? void 0 : req.headers) || {};
// remove port from host if present
const hostname = host == null ? void 0 : host.split(':')[0].toLowerCase();
value = hostname;
break;
}
default:
{
break;
}
}
if (!hasItem.value && value) {
params[getSafeParamName(key)] = value;
return true;
} else if (value) {
const matcher = new RegExp(`^${hasItem.value}$`);
const matches = Array.isArray(value) ? value.slice(-1)[0].match(matcher) : value.match(matcher);
if (matches) {
if (Array.isArray(matches)) {
if (matches.groups) {
Object.keys(matches.groups).forEach((groupKey)=>{
params[groupKey] = matches.groups[groupKey];
});
} else if (hasItem.type === 'host' && matches[0]) {
params.host = matches[0];
}
}
return true;
}
}
return false;
};
const allMatch = has.every((item)=>hasMatch(item)) && !missing.some((item)=>hasMatch(item));
if (allMatch) {
return params;
}
return false;
}
export function compileNonPath(value, params) {
if (!value.includes(':')) {
return value;
}
for (const key of Object.keys(params)){
if (value.includes(`:${key}`)) {
value = value.replace(new RegExp(`:${key}\\*`, 'g'), `:${key}--ESCAPED_PARAM_ASTERISKS`).replace(new RegExp(`:${key}\\?`, 'g'), `:${key}--ESCAPED_PARAM_QUESTION`).replace(new RegExp(`:${key}\\+`, 'g'), `:${key}--ESCAPED_PARAM_PLUS`).replace(new RegExp(`:${key}(?!\\w)`, 'g'), `--ESCAPED_PARAM_COLON${key}`);
}
}
value = value.replace(/(:|\*|\?|\+|\(|\)|\{|\})/g, '\\$1').replace(/--ESCAPED_PARAM_PLUS/g, '+').replace(/--ESCAPED_PARAM_COLON/g, ':').replace(/--ESCAPED_PARAM_QUESTION/g, '?').replace(/--ESCAPED_PARAM_ASTERISKS/g, '*');
// the value needs to start with a forward-slash to be compiled
// correctly
return compile(`/${value}`, {
validate: false
})(params).slice(1);
}
export function prepareDestination(args) {
const query = Object.assign({}, args.query);
delete query.__nextLocale;
delete query.__nextDefaultLocale;
delete query.__nextDataReq;
let escapedDestination = args.destination;
for (const param of Object.keys(_extends({}, args.params, query))){
escapedDestination = escapeSegment(escapedDestination, param);
}
const parsedDestination = parseUrl(escapedDestination);
const destQuery = parsedDestination.query;
const destPath = unescapeSegments(`${parsedDestination.pathname}${parsedDestination.hash || ''}`);
const destHostname = unescapeSegments(parsedDestination.hostname || '');
const destPathParamKeys = [];
const destHostnameParamKeys = [];
pathToRegexp(destPath, destPathParamKeys);
pathToRegexp(destHostname, destHostnameParamKeys);
const destParams = [];
destPathParamKeys.forEach((key)=>destParams.push(key.name));
destHostnameParamKeys.forEach((key)=>destParams.push(key.name));
const destPathCompiler = compile(destPath, // we don't validate while compiling the destination since we should
// have already validated before we got to this point and validating
// breaks compiling destinations with named pattern params from the source
// e.g. /something:hello(.*) -> /another/:hello is broken with validation
// since compile validation is meant for reversing and not for inserting
// params from a separate path-regex into another
{
validate: false
});
const destHostnameCompiler = compile(destHostname, {
validate: false
});
// update any params in query values
for (const [key1, strOrArray] of Object.entries(destQuery)){
// the value needs to start with a forward-slash to be compiled
// correctly
if (Array.isArray(strOrArray)) {
destQuery[key1] = strOrArray.map((value)=>compileNonPath(unescapeSegments(value), args.params));
} else if (typeof strOrArray === 'string') {
destQuery[key1] = compileNonPath(unescapeSegments(strOrArray), args.params);
}
}
// add path params to query if it's not a redirect and not
// already defined in destination query or path
let paramKeys = Object.keys(args.params).filter((name)=>name !== 'nextInternalLocale');
if (args.appendParamsToQuery && !paramKeys.some((key)=>destParams.includes(key))) {
for (const key of paramKeys){
if (!(key in destQuery)) {
destQuery[key] = args.params[key];
}
}
}
let newUrl;
try {
newUrl = destPathCompiler(args.params);
const [pathname, hash] = newUrl.split('#');
parsedDestination.hostname = destHostnameCompiler(args.params);
parsedDestination.pathname = pathname;
parsedDestination.hash = `${hash ? '#' : ''}${hash || ''}`;
delete parsedDestination.search;
} catch (err) {
if (err.message.match(/Expected .*? to not repeat, but got an array/)) {
throw new Error(`To use a multi-match in the destination you must add \`*\` at the end of the param name to signify it should repeat. https://nextjs.org/docs/messages/invalid-multi-match`);
}
throw err;
}
// Query merge order lowest priority to highest
// 1. initial URL query values
// 2. path segment values
// 3. destination specified query values
parsedDestination.query = _extends({}, query, parsedDestination.query);
return {
newUrl,
destQuery,
parsedDestination
};
}
//# sourceMappingURL=prepare-destination.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,43 @@
export function searchParamsToUrlQuery(searchParams) {
const query = {};
searchParams.forEach((value, key)=>{
if (typeof query[key] === 'undefined') {
query[key] = value;
} else if (Array.isArray(query[key])) {
query[key].push(value);
} else {
query[key] = [
query[key],
value
];
}
});
return query;
}
function stringifyUrlQueryParam(param) {
if (typeof param === 'string' || typeof param === 'number' && !isNaN(param) || typeof param === 'boolean') {
return String(param);
} else {
return '';
}
}
export function urlQueryToSearchParams(urlQuery) {
const result = new URLSearchParams();
Object.entries(urlQuery).forEach(([key, value])=>{
if (Array.isArray(value)) {
value.forEach((item)=>result.append(key, stringifyUrlQueryParam(item)));
} else {
result.set(key, stringifyUrlQueryParam(value));
}
});
return result;
}
export function assign(target, ...searchParamsList) {
searchParamsList.forEach((searchParams)=>{
Array.from(searchParams.keys()).forEach((key)=>target.delete(key));
searchParams.forEach((value, key)=>target.append(key, value));
});
return target;
}
//# sourceMappingURL=querystring.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/querystring.ts"],"names":["searchParamsToUrlQuery","searchParams","query","forEach","value","key","Array","isArray","push","stringifyUrlQueryParam","param","isNaN","String","urlQueryToSearchParams","urlQuery","result","URLSearchParams","Object","entries","item","append","set","assign","target","searchParamsList","from","keys","delete"],"mappings":"AAEA,OAAO,SAASA,sBAAsB,CACpCC,YAA6B,EACb;IAChB,MAAMC,KAAK,GAAmB,EAAE;IAChCD,YAAY,CAACE,OAAO,CAAC,CAACC,KAAK,EAAEC,GAAG,GAAK;QACnC,IAAI,OAAOH,KAAK,CAACG,GAAG,CAAC,KAAK,WAAW,EAAE;YACrCH,KAAK,CAACG,GAAG,CAAC,GAAGD,KAAK;SACnB,MAAM,IAAIE,KAAK,CAACC,OAAO,CAACL,KAAK,CAACG,GAAG,CAAC,CAAC,EAAE;YAClCH,KAAK,CAACG,GAAG,CAAC,CAAcG,IAAI,CAACJ,KAAK,CAAC;SACtC,MAAM;YACLF,KAAK,CAACG,GAAG,CAAC,GAAG;gBAACH,KAAK,CAACG,GAAG,CAAC;gBAAYD,KAAK;aAAC;SAC3C;KACF,CAAC;IACF,OAAOF,KAAK,CAAA;CACb;AAED,SAASO,sBAAsB,CAACC,KAAc,EAAU;IACtD,IACE,OAAOA,KAAK,KAAK,QAAQ,IACxB,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACC,KAAK,CAACD,KAAK,CAAC,IAC3C,OAAOA,KAAK,KAAK,SAAS,EAC1B;QACA,OAAOE,MAAM,CAACF,KAAK,CAAC,CAAA;KACrB,MAAM;QACL,OAAO,EAAE,CAAA;KACV;CACF;AAED,OAAO,SAASG,sBAAsB,CACpCC,QAAwB,EACP;IACjB,MAAMC,MAAM,GAAG,IAAIC,eAAe,EAAE;IACpCC,MAAM,CAACC,OAAO,CAACJ,QAAQ,CAAC,CAACX,OAAO,CAAC,CAAC,CAACE,GAAG,EAAED,KAAK,CAAC,GAAK;QACjD,IAAIE,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,EAAE;YACxBA,KAAK,CAACD,OAAO,CAAC,CAACgB,IAAI,GAAKJ,MAAM,CAACK,MAAM,CAACf,GAAG,EAAEI,sBAAsB,CAACU,IAAI,CAAC,CAAC,CAAC;SAC1E,MAAM;YACLJ,MAAM,CAACM,GAAG,CAAChB,GAAG,EAAEI,sBAAsB,CAACL,KAAK,CAAC,CAAC;SAC/C;KACF,CAAC;IACF,OAAOW,MAAM,CAAA;CACd;AAED,OAAO,SAASO,MAAM,CACpBC,MAAuB,EACvB,GAAGC,gBAAgB,AAAmB,EACrB;IACjBA,gBAAgB,CAACrB,OAAO,CAAC,CAACF,YAAY,GAAK;QACzCK,KAAK,CAACmB,IAAI,CAACxB,YAAY,CAACyB,IAAI,EAAE,CAAC,CAACvB,OAAO,CAAC,CAACE,GAAG,GAAKkB,MAAM,CAACI,MAAM,CAACtB,GAAG,CAAC,CAAC;QACpEJ,YAAY,CAACE,OAAO,CAAC,CAACC,KAAK,EAAEC,GAAG,GAAKkB,MAAM,CAACH,MAAM,CAACf,GAAG,EAAED,KAAK,CAAC,CAAC;KAChE,CAAC;IACF,OAAOmB,MAAM,CAAA;CACd"}

View File

@@ -0,0 +1,12 @@
/**
* Given a URL as a string and a base URL it will make the URL relative
* if the parsed protocol and host is the same as the one in the base
* URL. Otherwise it returns the same URL string.
*/ export function relativizeURL(url, base) {
const baseURL = typeof base === 'string' ? new URL(base) : base;
const relative = new URL(url, base);
const origin = `${baseURL.protocol}//${baseURL.host}`;
return `${relative.protocol}//${relative.host}` === origin ? relative.toString().replace(origin, '') : relative.toString();
}
//# sourceMappingURL=relativize-url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/relativize-url.ts"],"names":["relativizeURL","url","base","baseURL","URL","relative","origin","protocol","host","toString","replace"],"mappings":"AAAA;;;;GAIG,CACH,OAAO,SAASA,aAAa,CAACC,GAAoB,EAAEC,IAAkB,EAAE;IACtE,MAAMC,OAAO,GAAG,OAAOD,IAAI,KAAK,QAAQ,GAAG,IAAIE,GAAG,CAACF,IAAI,CAAC,GAAGA,IAAI;IAC/D,MAAMG,QAAQ,GAAG,IAAID,GAAG,CAACH,GAAG,EAAEC,IAAI,CAAC;IACnC,MAAMI,MAAM,GAAG,CAAC,EAAEH,OAAO,CAACI,QAAQ,CAAC,EAAE,EAAEJ,OAAO,CAACK,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,EAAEH,QAAQ,CAACE,QAAQ,CAAC,EAAE,EAAEF,QAAQ,CAACG,IAAI,CAAC,CAAC,KAAKF,MAAM,GACtDD,QAAQ,CAACI,QAAQ,EAAE,CAACC,OAAO,CAACJ,MAAM,EAAE,EAAE,CAAC,GACvCD,QAAQ,CAACI,QAAQ,EAAE,CAAA;CACxB"}

View File

@@ -0,0 +1,16 @@
import { pathHasPrefix } from './path-has-prefix';
/**
* Given a path and a prefix it will remove the prefix when it exists in the
* given path. It ensures it matches exactly without containing extra chars
* and if the prefix is not there it will be noop.
* @param path The path to remove the prefix from.
* @param prefix The prefix to be removed.
*/ export function removePathPrefix(path, prefix) {
if (pathHasPrefix(path, prefix)) {
const withoutPrefix = path.slice(prefix.length);
return withoutPrefix.startsWith('/') ? withoutPrefix : `/${withoutPrefix}`;
}
return path;
}
//# sourceMappingURL=remove-path-prefix.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/remove-path-prefix.ts"],"names":["pathHasPrefix","removePathPrefix","path","prefix","withoutPrefix","slice","length","startsWith"],"mappings":"AAAA,SAASA,aAAa,QAAQ,mBAAmB,CAAA;AAEjD;;;;;;GAMG,CACH,OAAO,SAASC,gBAAgB,CAACC,IAAY,EAAEC,MAAc,EAAU;IACrE,IAAIH,aAAa,CAACE,IAAI,EAAEC,MAAM,CAAC,EAAE;QAC/B,MAAMC,aAAa,GAAGF,IAAI,CAACG,KAAK,CAACF,MAAM,CAACG,MAAM,CAAC;QAC/C,OAAOF,aAAa,CAACG,UAAU,CAAC,GAAG,CAAC,GAAGH,aAAa,GAAG,CAAC,CAAC,EAAEA,aAAa,CAAC,CAAC,CAAA;KAC3E;IACD,OAAOF,IAAI,CAAA;CACZ"}

View File

@@ -0,0 +1,11 @@
/**
* Removes the trailing slash for a given route or page path. Preserves the
* root page. Examples:
* - `/foo/bar/` -> `/foo/bar`
* - `/foo/bar` -> `/foo/bar`
* - `/` -> `/`
*/ export function removeTrailingSlash(route) {
return route.replace(/\/$/, '') || '/';
}
//# sourceMappingURL=remove-trailing-slash.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/remove-trailing-slash.ts"],"names":["removeTrailingSlash","route","replace"],"mappings":"AAAA;;;;;;GAMG,CACH,OAAO,SAASA,mBAAmB,CAACC,KAAa,EAAE;IACjD,OAAOA,KAAK,CAACC,OAAO,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAA;CACvC"}

View File

@@ -0,0 +1,107 @@
import { getPathMatch } from './path-match';
import { matchHas, prepareDestination } from './prepare-destination';
import { removeTrailingSlash } from './remove-trailing-slash';
import { normalizeLocalePath } from '../../i18n/normalize-locale-path';
import { removeBasePath } from '../../../../client/remove-base-path';
import { parseRelativeUrl } from './parse-relative-url';
export default function resolveRewrites(asPath, pages, rewrites, query, resolveHref, locales) {
let matchedPage = false;
let externalDest = false;
let parsedAs = parseRelativeUrl(asPath);
let fsPathname = removeTrailingSlash(normalizeLocalePath(removeBasePath(parsedAs.pathname), locales).pathname);
let resolvedHref;
const handleRewrite = (rewrite)=>{
const matcher = getPathMatch(rewrite.source + (process.env.__NEXT_TRAILING_SLASH ? '(/)?' : ''), {
removeUnnamedParams: true,
strict: true
});
let params = matcher(parsedAs.pathname);
if ((rewrite.has || rewrite.missing) && params) {
const hasParams = matchHas({
headers: {
host: document.location.hostname
},
cookies: document.cookie.split('; ').reduce((acc, item)=>{
const [key, ...value] = item.split('=');
acc[key] = value.join('=');
return acc;
}, {})
}, parsedAs.query, rewrite.has, rewrite.missing);
if (hasParams) {
Object.assign(params, hasParams);
} else {
params = false;
}
}
if (params) {
if (!rewrite.destination) {
// this is a proxied rewrite which isn't handled on the client
externalDest = true;
return true;
}
const destRes = prepareDestination({
appendParamsToQuery: true,
destination: rewrite.destination,
params: params,
query: query
});
parsedAs = destRes.parsedDestination;
asPath = destRes.newUrl;
Object.assign(query, destRes.parsedDestination.query);
fsPathname = removeTrailingSlash(normalizeLocalePath(removeBasePath(asPath), locales).pathname);
if (pages.includes(fsPathname)) {
// check if we now match a page as this means we are done
// resolving the rewrites
matchedPage = true;
resolvedHref = fsPathname;
return true;
}
// check if we match a dynamic-route, if so we break the rewrites chain
resolvedHref = resolveHref(fsPathname);
if (resolvedHref !== asPath && pages.includes(resolvedHref)) {
matchedPage = true;
return true;
}
}
};
let finished = false;
for(let i = 0; i < rewrites.beforeFiles.length; i++){
// we don't end after match in beforeFiles to allow
// continuing through all beforeFiles rewrites
handleRewrite(rewrites.beforeFiles[i]);
}
matchedPage = pages.includes(fsPathname);
if (!matchedPage) {
if (!finished) {
for(let i = 0; i < rewrites.afterFiles.length; i++){
if (handleRewrite(rewrites.afterFiles[i])) {
finished = true;
break;
}
}
}
// check dynamic route before processing fallback rewrites
if (!finished) {
resolvedHref = resolveHref(fsPathname);
matchedPage = pages.includes(resolvedHref);
finished = matchedPage;
}
if (!finished) {
for(let i = 0; i < rewrites.fallback.length; i++){
if (handleRewrite(rewrites.fallback[i])) {
finished = true;
break;
}
}
}
}
return {
asPath,
parsedAs,
matchedPage,
resolvedHref,
externalDest
};
};
//# sourceMappingURL=resolve-rewrites.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/resolve-rewrites.ts"],"names":["getPathMatch","matchHas","prepareDestination","removeTrailingSlash","normalizeLocalePath","removeBasePath","parseRelativeUrl","resolveRewrites","asPath","pages","rewrites","query","resolveHref","locales","matchedPage","externalDest","parsedAs","fsPathname","pathname","resolvedHref","handleRewrite","rewrite","matcher","source","process","env","__NEXT_TRAILING_SLASH","removeUnnamedParams","strict","params","has","missing","hasParams","headers","host","document","location","hostname","cookies","cookie","split","reduce","acc","item","key","value","join","Object","assign","destination","destRes","appendParamsToQuery","parsedDestination","newUrl","includes","finished","i","beforeFiles","length","afterFiles","fallback"],"mappings":"AAEA,SAASA,YAAY,QAAQ,cAAc,CAAA;AAC3C,SAASC,QAAQ,EAAEC,kBAAkB,QAAQ,uBAAuB,CAAA;AACpE,SAASC,mBAAmB,QAAQ,yBAAyB,CAAA;AAC7D,SAASC,mBAAmB,QAAQ,kCAAkC,CAAA;AACtE,SAASC,cAAc,QAAQ,qCAAqC,CAAA;AACpE,SAASC,gBAAgB,QAAQ,sBAAsB,CAAA;AAEvD,eAAe,SAASC,eAAe,CACrCC,MAAc,EACdC,KAAe,EACfC,QAIC,EACDC,KAAqB,EACrBC,WAAqC,EACrCC,OAAkB,EAOlB;IACA,IAAIC,WAAW,GAAG,KAAK;IACvB,IAAIC,YAAY,GAAG,KAAK;IACxB,IAAIC,QAAQ,GAAGV,gBAAgB,CAACE,MAAM,CAAC;IACvC,IAAIS,UAAU,GAAGd,mBAAmB,CAClCC,mBAAmB,CAACC,cAAc,CAACW,QAAQ,CAACE,QAAQ,CAAC,EAAEL,OAAO,CAAC,CAACK,QAAQ,CACzE;IACD,IAAIC,YAAY;IAEhB,MAAMC,aAAa,GAAG,CAACC,OAAgB,GAAK;QAC1C,MAAMC,OAAO,GAAGtB,YAAY,CAC1BqB,OAAO,CAACE,MAAM,GAAG,CAACC,OAAO,CAACC,GAAG,CAACC,qBAAqB,GAAG,MAAM,GAAG,EAAE,CAAC,EAClE;YACEC,mBAAmB,EAAE,IAAI;YACzBC,MAAM,EAAE,IAAI;SACb,CACF;QAED,IAAIC,MAAM,GAAGP,OAAO,CAACN,QAAQ,CAACE,QAAQ,CAAC;QAEvC,IAAI,CAACG,OAAO,CAACS,GAAG,IAAIT,OAAO,CAACU,OAAO,CAAC,IAAIF,MAAM,EAAE;YAC9C,MAAMG,SAAS,GAAG/B,QAAQ,CACxB;gBACEgC,OAAO,EAAE;oBACPC,IAAI,EAAEC,QAAQ,CAACC,QAAQ,CAACC,QAAQ;iBACjC;gBACDC,OAAO,EAAEH,QAAQ,CAACI,MAAM,CACrBC,KAAK,CAAC,IAAI,CAAC,CACXC,MAAM,CAAyB,CAACC,GAAG,EAAEC,IAAI,GAAK;oBAC7C,MAAM,CAACC,GAAG,EAAE,GAAGC,KAAK,CAAC,GAAGF,IAAI,CAACH,KAAK,CAAC,GAAG,CAAC;oBACvCE,GAAG,CAACE,GAAG,CAAC,GAAGC,KAAK,CAACC,IAAI,CAAC,GAAG,CAAC;oBAC1B,OAAOJ,GAAG,CAAA;iBACX,EAAE,EAAE,CAAC;aACT,EACD1B,QAAQ,CAACL,KAAK,EACdU,OAAO,CAACS,GAAG,EACXT,OAAO,CAACU,OAAO,CAChB;YAED,IAAIC,SAAS,EAAE;gBACbe,MAAM,CAACC,MAAM,CAACnB,MAAM,EAAEG,SAAS,CAAC;aACjC,MAAM;gBACLH,MAAM,GAAG,KAAK;aACf;SACF;QAED,IAAIA,MAAM,EAAE;YACV,IAAI,CAACR,OAAO,CAAC4B,WAAW,EAAE;gBACxB,8DAA8D;gBAC9DlC,YAAY,GAAG,IAAI;gBACnB,OAAO,IAAI,CAAA;aACZ;YACD,MAAMmC,OAAO,GAAGhD,kBAAkB,CAAC;gBACjCiD,mBAAmB,EAAE,IAAI;gBACzBF,WAAW,EAAE5B,OAAO,CAAC4B,WAAW;gBAChCpB,MAAM,EAAEA,MAAM;gBACdlB,KAAK,EAAEA,KAAK;aACb,CAAC;YACFK,QAAQ,GAAGkC,OAAO,CAACE,iBAAiB;YACpC5C,MAAM,GAAG0C,OAAO,CAACG,MAAM;YACvBN,MAAM,CAACC,MAAM,CAACrC,KAAK,EAAEuC,OAAO,CAACE,iBAAiB,CAACzC,KAAK,CAAC;YAErDM,UAAU,GAAGd,mBAAmB,CAC9BC,mBAAmB,CAACC,cAAc,CAACG,MAAM,CAAC,EAAEK,OAAO,CAAC,CAACK,QAAQ,CAC9D;YAED,IAAIT,KAAK,CAAC6C,QAAQ,CAACrC,UAAU,CAAC,EAAE;gBAC9B,yDAAyD;gBACzD,yBAAyB;gBACzBH,WAAW,GAAG,IAAI;gBAClBK,YAAY,GAAGF,UAAU;gBACzB,OAAO,IAAI,CAAA;aACZ;YAED,uEAAuE;YACvEE,YAAY,GAAGP,WAAW,CAACK,UAAU,CAAC;YAEtC,IAAIE,YAAY,KAAKX,MAAM,IAAIC,KAAK,CAAC6C,QAAQ,CAACnC,YAAY,CAAC,EAAE;gBAC3DL,WAAW,GAAG,IAAI;gBAClB,OAAO,IAAI,CAAA;aACZ;SACF;KACF;IACD,IAAIyC,QAAQ,GAAG,KAAK;IAEpB,IAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG9C,QAAQ,CAAC+C,WAAW,CAACC,MAAM,EAAEF,CAAC,EAAE,CAAE;QACpD,mDAAmD;QACnD,8CAA8C;QAC9CpC,aAAa,CAACV,QAAQ,CAAC+C,WAAW,CAACD,CAAC,CAAC,CAAC;KACvC;IACD1C,WAAW,GAAGL,KAAK,CAAC6C,QAAQ,CAACrC,UAAU,CAAC;IAExC,IAAI,CAACH,WAAW,EAAE;QAChB,IAAI,CAACyC,QAAQ,EAAE;YACb,IAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG9C,QAAQ,CAACiD,UAAU,CAACD,MAAM,EAAEF,CAAC,EAAE,CAAE;gBACnD,IAAIpC,aAAa,CAACV,QAAQ,CAACiD,UAAU,CAACH,CAAC,CAAC,CAAC,EAAE;oBACzCD,QAAQ,GAAG,IAAI;oBACf,MAAK;iBACN;aACF;SACF;QAED,0DAA0D;QAC1D,IAAI,CAACA,QAAQ,EAAE;YACbpC,YAAY,GAAGP,WAAW,CAACK,UAAU,CAAC;YACtCH,WAAW,GAAGL,KAAK,CAAC6C,QAAQ,CAACnC,YAAY,CAAC;YAC1CoC,QAAQ,GAAGzC,WAAW;SACvB;QAED,IAAI,CAACyC,QAAQ,EAAE;YACb,IAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG9C,QAAQ,CAACkD,QAAQ,CAACF,MAAM,EAAEF,CAAC,EAAE,CAAE;gBACjD,IAAIpC,aAAa,CAACV,QAAQ,CAACkD,QAAQ,CAACJ,CAAC,CAAC,CAAC,EAAE;oBACvCD,QAAQ,GAAG,IAAI;oBACf,MAAK;iBACN;aACF;SACF;KACF;IAED,OAAO;QACL/C,MAAM;QACNQ,QAAQ;QACRF,WAAW;QACXK,YAAY;QACZJ,YAAY;KACb,CAAA;CACF,CAAA"}

View File

@@ -0,0 +1,29 @@
import { DecodeError } from '../../utils';
export function getRouteMatcher({ re , groups }) {
return (pathname)=>{
const routeMatch = re.exec(pathname);
if (!routeMatch) {
return false;
}
const decode = (param)=>{
try {
return decodeURIComponent(param);
} catch (_) {
throw new DecodeError('failed to decode param');
}
};
const params = {};
Object.keys(groups).forEach((slugName)=>{
const g = groups[slugName];
const m = routeMatch[g.pos];
if (m !== undefined) {
params[slugName] = ~m.indexOf('/') ? m.split('/').map((entry)=>decode(entry)) : g.repeat ? [
decode(m)
] : decode(m);
}
});
return params;
};
}
//# sourceMappingURL=route-matcher.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/route-matcher.ts"],"names":["DecodeError","getRouteMatcher","re","groups","pathname","routeMatch","exec","decode","param","decodeURIComponent","_","params","Object","keys","forEach","slugName","g","m","pos","undefined","indexOf","split","map","entry","repeat"],"mappings":"AACA,SAASA,WAAW,QAAQ,aAAa,CAAA;AAUzC,OAAO,SAASC,eAAe,CAAC,EAAEC,EAAE,CAAA,EAAEC,MAAM,CAAA,EAAc,EAAc;IACtE,OAAO,CAACC,QAAmC,GAAK;QAC9C,MAAMC,UAAU,GAAGH,EAAE,CAACI,IAAI,CAACF,QAAQ,CAAE;QACrC,IAAI,CAACC,UAAU,EAAE;YACf,OAAO,KAAK,CAAA;SACb;QAED,MAAME,MAAM,GAAG,CAACC,KAAa,GAAK;YAChC,IAAI;gBACF,OAAOC,kBAAkB,CAACD,KAAK,CAAC,CAAA;aACjC,CAAC,OAAOE,CAAC,EAAE;gBACV,MAAM,IAAIV,WAAW,CAAC,wBAAwB,CAAC,CAAA;aAChD;SACF;QACD,MAAMW,MAAM,GAA+C,EAAE;QAE7DC,MAAM,CAACC,IAAI,CAACV,MAAM,CAAC,CAACW,OAAO,CAAC,CAACC,QAAgB,GAAK;YAChD,MAAMC,CAAC,GAAGb,MAAM,CAACY,QAAQ,CAAC;YAC1B,MAAME,CAAC,GAAGZ,UAAU,CAACW,CAAC,CAACE,GAAG,CAAC;YAC3B,IAAID,CAAC,KAAKE,SAAS,EAAE;gBACnBR,MAAM,CAACI,QAAQ,CAAC,GAAG,CAACE,CAAC,CAACG,OAAO,CAAC,GAAG,CAAC,GAC9BH,CAAC,CAACI,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAACC,KAAK,GAAKhB,MAAM,CAACgB,KAAK,CAAC,CAAC,GAC1CP,CAAC,CAACQ,MAAM,GACR;oBAACjB,MAAM,CAACU,CAAC,CAAC;iBAAC,GACXV,MAAM,CAACU,CAAC,CAAC;aACd;SACF,CAAC;QACF,OAAON,MAAM,CAAA;KACd,CAAA;CACF"}

View File

@@ -0,0 +1,138 @@
import _extends from "@swc/helpers/src/_extends.mjs";
import { escapeStringRegexp } from '../../escape-regexp';
import { removeTrailingSlash } from './remove-trailing-slash';
/**
* Parses a given parameter from a route to a data structure that can be used
* to generate the parametrized route. Examples:
* - `[...slug]` -> `{ name: 'slug', repeat: true, optional: true }`
* - `[foo]` -> `{ name: 'foo', repeat: false, optional: true }`
* - `bar` -> `{ name: 'bar', repeat: false, optional: false }`
*/ function parseParameter(param) {
const optional = param.startsWith('[') && param.endsWith(']');
if (optional) {
param = param.slice(1, -1);
}
const repeat = param.startsWith('...');
if (repeat) {
param = param.slice(3);
}
return {
key: param,
repeat,
optional
};
}
function getParametrizedRoute(route) {
const segments = removeTrailingSlash(route).slice(1).split('/');
const groups = {};
let groupIndex = 1;
return {
parameterizedRoute: segments.map((segment)=>{
if (segment.startsWith('[') && segment.endsWith(']')) {
const { key , optional , repeat } = parseParameter(segment.slice(1, -1));
groups[key] = {
pos: groupIndex++,
repeat,
optional
};
return repeat ? optional ? '(?:/(.+?))?' : '/(.+?)' : '/([^/]+?)';
} else {
return `/${escapeStringRegexp(segment)}`;
}
}).join(''),
groups
};
}
/**
* From a normalized route this function generates a regular expression and
* a corresponding groups object intended to be used to store matching groups
* from the regular expression.
*/ export function getRouteRegex(normalizedRoute) {
const { parameterizedRoute , groups } = getParametrizedRoute(normalizedRoute);
return {
re: new RegExp(`^${parameterizedRoute}(?:/)?$`),
groups: groups
};
}
/**
* Builds a function to generate a minimal routeKey using only a-z and minimal
* number of characters.
*/ function buildGetSafeRouteKey() {
let routeKeyCharCode = 97;
let routeKeyCharLength = 1;
return ()=>{
let routeKey = '';
for(let i = 0; i < routeKeyCharLength; i++){
routeKey += String.fromCharCode(routeKeyCharCode);
routeKeyCharCode++;
if (routeKeyCharCode > 122) {
routeKeyCharLength++;
routeKeyCharCode = 97;
}
}
return routeKey;
};
}
function getNamedParametrizedRoute(route) {
const segments = removeTrailingSlash(route).slice(1).split('/');
const getSafeRouteKey = buildGetSafeRouteKey();
const routeKeys = {};
return {
namedParameterizedRoute: segments.map((segment)=>{
if (segment.startsWith('[') && segment.endsWith(']')) {
const { key , optional , repeat } = parseParameter(segment.slice(1, -1));
// replace any non-word characters since they can break
// the named regex
let cleanedKey = key.replace(/\W/g, '');
let invalidKey = false;
// check if the key is still invalid and fallback to using a known
// safe key
if (cleanedKey.length === 0 || cleanedKey.length > 30) {
invalidKey = true;
}
if (!isNaN(parseInt(cleanedKey.slice(0, 1)))) {
invalidKey = true;
}
if (invalidKey) {
cleanedKey = getSafeRouteKey();
}
routeKeys[cleanedKey] = key;
return repeat ? optional ? `(?:/(?<${cleanedKey}>.+?))?` : `/(?<${cleanedKey}>.+?)` : `/(?<${cleanedKey}>[^/]+?)`;
} else {
return `/${escapeStringRegexp(segment)}`;
}
}).join(''),
routeKeys
};
}
/**
* This function extends `getRouteRegex` generating also a named regexp where
* each group is named along with a routeKeys object that indexes the assigned
* named group with its corresponding key.
*/ export function getNamedRouteRegex(normalizedRoute) {
const result = getNamedParametrizedRoute(normalizedRoute);
return _extends({}, getRouteRegex(normalizedRoute), {
namedRegex: `^${result.namedParameterizedRoute}(?:/)?$`,
routeKeys: result.routeKeys
});
}
/**
* Generates a named regexp.
* This is intended to be using for build time only.
*/ export function getNamedMiddlewareRegex(normalizedRoute, options) {
const { parameterizedRoute } = getParametrizedRoute(normalizedRoute);
const { catchAll =true } = options;
if (parameterizedRoute === '/') {
let catchAllRegex = catchAll ? '.*' : '';
return {
namedRegex: `^/${catchAllRegex}$`
};
}
const { namedParameterizedRoute } = getNamedParametrizedRoute(normalizedRoute);
let catchAllGroupedRegex = catchAll ? '(?:(/.*)?)' : '';
return {
namedRegex: `^${namedParameterizedRoute}${catchAllGroupedRegex}$`
};
}
//# sourceMappingURL=route-regex.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../shared/lib/router/utils/route-regex.ts"],"names":["escapeStringRegexp","removeTrailingSlash","parseParameter","param","optional","startsWith","endsWith","slice","repeat","key","getParametrizedRoute","route","segments","split","groups","groupIndex","parameterizedRoute","map","segment","pos","join","getRouteRegex","normalizedRoute","re","RegExp","buildGetSafeRouteKey","routeKeyCharCode","routeKeyCharLength","routeKey","i","String","fromCharCode","getNamedParametrizedRoute","getSafeRouteKey","routeKeys","namedParameterizedRoute","cleanedKey","replace","invalidKey","length","isNaN","parseInt","getNamedRouteRegex","result","namedRegex","getNamedMiddlewareRegex","options","catchAll","catchAllRegex","catchAllGroupedRegex"],"mappings":"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"}

View File

@@ -0,0 +1,159 @@
class UrlNode {
insert(urlPath) {
this._insert(urlPath.split('/').filter(Boolean), [], false);
}
smoosh() {
return this._smoosh();
}
_smoosh(prefix = '/') {
const childrenPaths = [
...this.children.keys()
].sort();
if (this.slugName !== null) {
childrenPaths.splice(childrenPaths.indexOf('[]'), 1);
}
if (this.restSlugName !== null) {
childrenPaths.splice(childrenPaths.indexOf('[...]'), 1);
}
if (this.optionalRestSlugName !== null) {
childrenPaths.splice(childrenPaths.indexOf('[[...]]'), 1);
}
const routes = childrenPaths.map((c)=>this.children.get(c)._smoosh(`${prefix}${c}/`)).reduce((prev, curr)=>[
...prev,
...curr
], []);
if (this.slugName !== null) {
routes.push(...this.children.get('[]')._smoosh(`${prefix}[${this.slugName}]/`));
}
if (!this.placeholder) {
const r = prefix === '/' ? '/' : prefix.slice(0, -1);
if (this.optionalRestSlugName != null) {
throw new Error(`You cannot define a route with the same specificity as a optional catch-all route ("${r}" and "${r}[[...${this.optionalRestSlugName}]]").`);
}
routes.unshift(r);
}
if (this.restSlugName !== null) {
routes.push(...this.children.get('[...]')._smoosh(`${prefix}[...${this.restSlugName}]/`));
}
if (this.optionalRestSlugName !== null) {
routes.push(...this.children.get('[[...]]')._smoosh(`${prefix}[[...${this.optionalRestSlugName}]]/`));
}
return routes;
}
_insert(urlPaths, slugNames, isCatchAll) {
if (urlPaths.length === 0) {
this.placeholder = false;
return;
}
if (isCatchAll) {
throw new Error(`Catch-all must be the last part of the URL.`);
}
// The next segment in the urlPaths list
let nextSegment = urlPaths[0];
// Check if the segment matches `[something]`
if (nextSegment.startsWith('[') && nextSegment.endsWith(']')) {
// Strip `[` and `]`, leaving only `something`
let segmentName = nextSegment.slice(1, -1);
let isOptional = false;
if (segmentName.startsWith('[') && segmentName.endsWith(']')) {
// Strip optional `[` and `]`, leaving only `something`
segmentName = segmentName.slice(1, -1);
isOptional = true;
}
if (segmentName.startsWith('...')) {
// Strip `...`, leaving only `something`
segmentName = segmentName.substring(3);
isCatchAll = true;
}
if (segmentName.startsWith('[') || segmentName.endsWith(']')) {
throw new Error(`Segment names may not start or end with extra brackets ('${segmentName}').`);
}
if (segmentName.startsWith('.')) {
throw new Error(`Segment names may not start with erroneous periods ('${segmentName}').`);
}
function handleSlug(previousSlug, nextSlug) {
if (previousSlug !== null) {
// If the specific segment already has a slug but the slug is not `something`
// This prevents collisions like:
// pages/[post]/index.js
// pages/[id]/index.js
// Because currently multiple dynamic params on the same segment level are not supported
if (previousSlug !== nextSlug) {
// TODO: This error seems to be confusing for users, needs an error link, the description can be based on above comment.
throw new Error(`You cannot use different slug names for the same dynamic path ('${previousSlug}' !== '${nextSlug}').`);
}
}
slugNames.forEach((slug)=>{
if (slug === nextSlug) {
throw new Error(`You cannot have the same slug name "${nextSlug}" repeat within a single dynamic path`);
}
if (slug.replace(/\W/g, '') === nextSegment.replace(/\W/g, '')) {
throw new Error(`You cannot have the slug names "${slug}" and "${nextSlug}" differ only by non-word symbols within a single dynamic path`);
}
});
slugNames.push(nextSlug);
}
if (isCatchAll) {
if (isOptional) {
if (this.restSlugName != null) {
throw new Error(`You cannot use both an required and optional catch-all route at the same level ("[...${this.restSlugName}]" and "${urlPaths[0]}" ).`);
}
handleSlug(this.optionalRestSlugName, segmentName);
// slugName is kept as it can only be one particular slugName
this.optionalRestSlugName = segmentName;
// nextSegment is overwritten to [[...]] so that it can later be sorted specifically
nextSegment = '[[...]]';
} else {
if (this.optionalRestSlugName != null) {
throw new Error(`You cannot use both an optional and required catch-all route at the same level ("[[...${this.optionalRestSlugName}]]" and "${urlPaths[0]}").`);
}
handleSlug(this.restSlugName, segmentName);
// slugName is kept as it can only be one particular slugName
this.restSlugName = segmentName;
// nextSegment is overwritten to [...] so that it can later be sorted specifically
nextSegment = '[...]';
}
} else {
if (isOptional) {
throw new Error(`Optional route parameters are not yet supported ("${urlPaths[0]}").`);
}
handleSlug(this.slugName, segmentName);
// slugName is kept as it can only be one particular slugName
this.slugName = segmentName;
// nextSegment is overwritten to [] so that it can later be sorted specifically
nextSegment = '[]';
}
}
// If this UrlNode doesn't have the nextSegment yet we create a new child UrlNode
if (!this.children.has(nextSegment)) {
this.children.set(nextSegment, new UrlNode());
}
this.children.get(nextSegment)._insert(urlPaths.slice(1), slugNames, isCatchAll);
}
constructor(){
this.placeholder = true;
this.children = new Map();
this.slugName = null;
this.restSlugName = null;
this.optionalRestSlugName = null;
}
}
export function getSortedRoutes(normalizedPages) {
// First the UrlNode is created, and every UrlNode can have only 1 dynamic segment
// Eg you can't have pages/[post]/abc.js and pages/[hello]/something-else.js
// Only 1 dynamic segment per nesting level
// So in the case that is test/integration/dynamic-routing it'll be this:
// pages/[post]/comments.js
// pages/blog/[post]/comment/[id].js
// Both are fine because `pages/[post]` and `pages/blog` are on the same level
// So in this case `UrlNode` created here has `this.slugName === 'post'`
// And since your PR passed through `slugName` as an array basically it'd including it in too many possibilities
// Instead what has to be passed through is the upwards path's dynamic names
const root = new UrlNode();
// Here the `root` gets injected multiple paths, and insert will break them up into sublevels
normalizedPages.forEach((pagePath)=>root.insert(pagePath));
// Smoosh will then sort those sublevels up to the point where you get the correct route definition priority
return root.smoosh();
}
//# sourceMappingURL=sorted-routes.js.map

File diff suppressed because one or more lines are too long