/opt/canhelp/node_modules/next/dist/shared/lib/router/utils
NameSizeModeActions
add-locale.d.ts3650644editdlrm
add-locale.js10490644editdlrm
add-locale.js.map17150644editdlrm
add-path-prefix.d.ts2000644editdlrm
add-path-prefix.js5360644editdlrm
add-path-prefix.js.map8850644editdlrm
add-path-suffix.d.ts2580644editdlrm
add-path-suffix.js5360644editdlrm
add-path-suffix.js.map9440644editdlrm
app-paths.d.ts9000644editdlrm
app-paths.js15040644editdlrm
app-paths.js.map27120644editdlrm
as-path-to-search-params.d.ts790644editdlrm
as-path-to-search-params.js4840644editdlrm
as-path-to-search-params.js.map5650644editdlrm
cache-busting-search-param.d.ts2570644editdlrm
cache-busting-search-param.js8320644editdlrm
cache-busting-search-param.js.map13150644editdlrm
compare-states.d.ts1460644editdlrm
compare-states.js10700644editdlrm
compare-states.js.map19310644editdlrm
disable-smooth-scroll.d.ts3040644editdlrm
disable-smooth-scroll.js25150644editdlrm
disable-smooth-scroll.js.map36210644editdlrm
escape-path-delimiters.d.ts960644editdlrm
escape-path-delimiters.js5080644editdlrm
escape-path-delimiters.js.map7530644editdlrm
format-next-pathname-info.d.ts2610644editdlrm
format-next-pathname-info.js12900644editdlrm
format-next-pathname-info.js.map20900644editdlrm
format-url.d.ts2160644editdlrm
format-url.js39550644editdlrm
format-url.js.map57390644editdlrm
get-asset-path-from-route.d.ts840644editdlrm
get-asset-path-from-route.js6390644editdlrm
get-asset-path-from-route.js.map8460644editdlrm
get-dynamic-param.d.ts27750644editdlrm
get-dynamic-param.js39760644editdlrm
get-dynamic-param.js.map74420644editdlrm
get-next-pathname-info.d.ts14500644editdlrm
get-next-pathname-info.js24790644editdlrm
get-next-pathname-info.js.map51780644editdlrm
get-route-from-asset-path.d.ts880644editdlrm
get-route-from-asset-path.js9310644editdlrm
get-route-from-asset-path.js.map13240644editdlrm
html-bots.d.ts530644editdlrm
html-bots.js11350644editdlrm
html-bots.js.map11450644editdlrm
index.d.ts1210644editdlrm
index.js7660644editdlrm
index.js.map4300644editdlrm
interception-routes.d.ts3120644editdlrm
interception-routes.js43540644editdlrm
interception-routes.js.map50540644editdlrm
interpolate-as.d.ts1950644editdlrm
interpolate-as.js22420644editdlrm
interpolate-as.js.map38010644editdlrm
is-bot.d.ts2910644editdlrm
is-bot.js17640644editdlrm
is-bot.js.map19980644editdlrm
is-dynamic.d.ts3160644editdlrm
is-dynamic.js8670644editdlrm
is-dynamic.js.map14890644editdlrm
is-local-url.d.ts1470644editdlrm
is-local-url.js8540644editdlrm
is-local-url.js.map12710644editdlrm
middleware-route-matcher.d.ts4630644editdlrm
middleware-route-matcher.js9470644editdlrm
middleware-route-matcher.js.map17620644editdlrm
omit.d.ts1260644editdlrm
omit.js4400644editdlrm
omit.js.map7780644editdlrm
parse-path.d.ts3200644editdlrm
parse-path.js10410644editdlrm
parse-path.js.map15100644editdlrm
parse-relative-url.d.ts7450644editdlrm
parse-relative-url.js14760644editdlrm
parse-relative-url.js.map30150644editdlrm
parse-url.d.ts3650644editdlrm
parse-url.js9540644editdlrm
parse-url.js.map18430644editdlrm
path-has-prefix.d.ts3640644editdlrm
path-has-prefix.js5350644editdlrm
path-has-prefix.js.map9960644editdlrm
path-match.d.ts9890644editdlrm
path-match.js19610644editdlrm
path-match.js.map37730644editdlrm
prepare-destination.d.ts15270644editdlrm
prepare-destination.js106370644editdlrm
prepare-destination.js.map171870644editdlrm
querystring.d.ts3480644editdlrm
querystring.js22810644editdlrm
querystring.js.map32870644editdlrm
relativize-url.d.ts6790644editdlrm
relativize-url.js11210644editdlrm
relativize-url.js.map18720644editdlrm
remove-path-prefix.d.ts3890644editdlrm
remove-path-prefix.js12610644editdlrm
remove-path-prefix.js.map20000644editdlrm
remove-trailing-slash.d.ts2590644editdlrm
remove-trailing-slash.js5520644editdlrm
remove-trailing-slash.js.map5980644editdlrm
resolve-rewrites.d.ts6820644editdlrm
resolve-rewrites.js46700644editdlrm
resolve-rewrites.js.map77810644editdlrm
route-match-utils.d.ts15130644editdlrm
route-match-utils.js36750644editdlrm
route-match-utils.js.map57540644editdlrm
route-matcher.d.ts3840644editdlrm
route-matcher.js15090644editdlrm
route-matcher.js.map25580644editdlrm
route-regex.d.ts34920644editdlrm
route-regex.js94980644editdlrm
route-regex.js.map175770644editdlrm
sortable-routes.d.ts42490644editdlrm
sortable-routes.js63210644editdlrm
sortable-routes.js.map125300644editdlrm
sorted-routes.d.ts3440644editdlrm
sorted-routes.js116640644editdlrm
sorted-routes.js.map147880644editdlrm
Edit: /opt/canhelp/node_modules/next/dist/shared/lib/router/utils/sortable-routes.js (6321B)
/** * A route that can be sorted by specificity. */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { compareRouteSegments: null, getSegmentSpecificity: null, sortPageObjects: null, sortPages: null, sortSortableRouteObjects: null, sortSortableRoutes: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { compareRouteSegments: function() { return compareRouteSegments; }, getSegmentSpecificity: function() { return getSegmentSpecificity; }, sortPageObjects: function() { return sortPageObjects; }, sortPages: function() { return sortPages; }, sortSortableRouteObjects: function() { return sortSortableRouteObjects; }, sortSortableRoutes: function() { return sortSortableRoutes; } }); function getSegmentSpecificity(segment) { // Static segments are most specific - they match exactly one path if (!segment.includes('[')) { return 0; } // Optional catch-all [[...param]] is least specific - matches zero or more segments if (segment.startsWith('[[...') && segment.endsWith(']]')) { return 3; } // Catch-all [...param] is less specific - matches one or more segments if (segment.startsWith('[...') && segment.endsWith(']')) { return 2; } // Regular dynamic [param] is more specific than catch-all - matches exactly one segment if (segment.startsWith('[') && segment.endsWith(']')) { return 1; } // Default to static (fallback case) return 0; } function compareRouteSegments(pathA, pathB) { // Split paths into segments, removing empty strings from leading/trailing slashes const segmentsA = pathA.split('/').filter(Boolean); const segmentsB = pathB.split('/').filter(Boolean); // Compare segment by segment up to the length of the longer path const maxLength = Math.max(segmentsA.length, segmentsB.length); for(let i = 0; i < maxLength; i++){ const segA = segmentsA[i] || ''; const segB = segmentsB[i] || ''; // Handle length differences: shorter routes are MORE specific // Example: "/api" is more specific than "/api/users" if (!segA && segB) return -1 // pathA is shorter, so more specific ; if (segA && !segB) return 1 // pathB is shorter, so more specific ; if (!segA && !segB) return 0 // Both paths ended, they're equal ; // Compare segment specificity using our specificity scoring const specificityA = getSegmentSpecificity(segA); const specificityB = getSegmentSpecificity(segB); // Lower specificity number = more specific route // Example: "api" (0) vs "[slug]" (1) - "api" wins if (specificityA !== specificityB) { return specificityA - specificityB; } // If segments have same specificity, compare lexicographically for determinism // Example: "[id]" vs "[slug]" - "[id]" comes first alphabetically if (segA !== segB) { return segA.localeCompare(segB); } // Segments are identical, continue to next segment } // All segments compared equally return 0; } /** * Compares two complete routes for sorting purposes. * * Routes are compared with a two-tier priority system: * 1. Primary: Compare by source path specificity * 2. Secondary: If sources are equal, compare by page path specificity * * This ensures that routes are primarily organized by their source patterns, * with page-specific variations grouped together. * * @param a - First route to compare * @param b - Second route to compare * @returns Negative if route a should come first, positive if route b should come first, 0 if equal */ function compareSortableRoutes(a, b) { // First compare by source specificity - this is the primary sorting criterion // Source represents the original route pattern and takes precedence const sourceResult = compareRouteSegments(a.sourcePage, b.sourcePage); if (sourceResult !== 0) return sourceResult; // If sources are identical, compare by page specificity as a tiebreaker // Page represents the final rendered route and provides secondary ordering return compareRouteSegments(a.page, b.page); } function sortSortableRoutes(routes) { // Because sort is always in-place, we need to create a shallow copy to avoid // mutating the input array. return [ ...routes ].sort(compareSortableRoutes); } function sortPages(pages) { // Because sort is always in-place, we need to create a shallow copy to avoid // mutating the input array. return [ ...pages ].sort(compareRouteSegments); } function sortSortableRouteObjects(objects, getter) { // Create a SortableRoute for each object. const routes = []; for (const object of objects){ const route = getter(object); routes.push({ ...route, object }); } // In-place sort the SortableRoutes. routes.sort(compareSortableRoutes); // Map the sorted SortableRoutes back to the original objects. return routes.map((param)=>{ let { object } = param; return object; }); } function sortPageObjects(objects, getter) { const indexes = {}; const pages = new Set(); for(let i = 0; i < objects.length; i++){ var _indexes_page; const object = objects[i]; const page = getter(object); ((_indexes_page = indexes[page]) == null ? void 0 : _indexes_page.push(i)) || (indexes[page] = [ i ]); pages.add(page); } // Sort the unique pages. const sortedPages = Array.from(pages).sort(compareRouteSegments); // Map the sorted pages back to the original objects. return sortedPages.reduce((sortedObjects, page)=>{ // Add all objects for this page to the sorted array. for (const i of indexes[page]){ sortedObjects.push(objects[i]); } // Return the sorted array. return sortedObjects; }, []); } //# sourceMappingURL=sortable-routes.js.map