UNPKG

next

Version:

The React Framework

86 lines (85 loc) • 3.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { HEAD_REQUEST_KEY: null, ROOT_SEGMENT_REQUEST_KEY: null, appendSegmentRequestKeyPart: null, convertSegmentPathToStaticExportFilename: null, createSegmentRequestKeyPart: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { HEAD_REQUEST_KEY: function() { return HEAD_REQUEST_KEY; }, ROOT_SEGMENT_REQUEST_KEY: function() { return ROOT_SEGMENT_REQUEST_KEY; }, appendSegmentRequestKeyPart: function() { return appendSegmentRequestKeyPart; }, convertSegmentPathToStaticExportFilename: function() { return convertSegmentPathToStaticExportFilename; }, createSegmentRequestKeyPart: function() { return createSegmentRequestKeyPart; } }); const ROOT_SEGMENT_REQUEST_KEY = ''; const HEAD_REQUEST_KEY = '/_head'; function createSegmentRequestKeyPart(segment) { if (typeof segment === 'string') { const safeName = // TODO: FlightRouterState encodes Not Found routes as "/_not-found". // But params typically don't include the leading slash. We should use // a different encoding to avoid this special case. segment === '/_not-found' ? '_not-found' : encodeToFilesystemAndURLSafeString(segment); // Since this is not a dynamic segment, it's fully encoded. It does not // need to be "hydrated" with a param value. return safeName; } const name = segment[0]; const paramType = segment[2]; const safeName = encodeToFilesystemAndURLSafeString(name); const encodedName = '$' + paramType + '$' + safeName; return encodedName; } function appendSegmentRequestKeyPart(parentRequestKey, parallelRouteKey, childRequestKeyPart) { // Aside from being filesystem safe, segment keys are also designed so that // each segment and parallel route creates its own subdirectory. Roughly in // the same shape as the source app directory. This is mostly just for easier // debugging (you can open up the build folder and navigate the output); if // we wanted to do we could just use a flat structure. // Omit the parallel route key for children, since this is the most // common case. Saves some bytes (and it's what the app directory does). const slotKey = parallelRouteKey === 'children' ? childRequestKeyPart : `@${encodeToFilesystemAndURLSafeString(parallelRouteKey)}/${childRequestKeyPart}`; return parentRequestKey + '/' + slotKey; } // Define a regex pattern to match the most common characters found in a route // param. It excludes anything that might not be cross-platform filesystem // compatible, like |. It does not need to be precise because the fallback is to // just base64url-encode the whole parameter, which is fine; we just don't do it // by default for compactness, and for easier debugging. const simpleParamValueRegex = /^[a-zA-Z0-9\-_@]+$/; function encodeToFilesystemAndURLSafeString(value) { if (simpleParamValueRegex.test(value)) { return value; } // If there are any unsafe characters, base64url-encode the entire value. // We also add a ! prefix so it doesn't collide with the simple case. const base64url = btoa(value).replace(/\+/g, '-') // Replace '+' with '-' .replace(/\//g, '_') // Replace '/' with '_' .replace(/=+$/, '') // Remove trailing '=' ; return '!' + base64url; } function convertSegmentPathToStaticExportFilename(segmentPath) { return `__next${segmentPath.replace(/\//g, '.')}.txt`; } //# sourceMappingURL=segment-value-encoding.js.map