@reckona/mreact-router 0.0.187 → 0.0.189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"multipart.js","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Configures multipart stream parsing limits and field handling.\n */\nexport interface MultipartStreamParseOptions {\n fields?: Readonly<Record<string, MultipartStreamFieldOptions>>;\n maxParts?: number;\n maxBytes?: number;\n}\n\n/**\n * Configures parsing behavior for a named multipart field.\n */\nexport interface MultipartStreamFieldOptions {\n type?: \"stream\" | \"text\";\n maxBytes?: number;\n}\n\n/**\n * Represents one parsed multipart field or file part.\n */\nexport interface MultipartStreamPart {\n name: string;\n filename?: string;\n safeFilename?: string;\n contentType?: string;\n headers: Headers;\n body: ReadableStream<Uint8Array<ArrayBufferLike>>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n fixedLengthStream(length?: number | bigint): MultipartFixedLengthStream;\n}\n\n/**\n * Couples a readable multipart part stream with a completion signal.\n */\nexport interface MultipartFixedLengthStream {\n readable: ReadableStream<Uint8Array<ArrayBufferLike>>;\n done: Promise<void>;\n}\n\ninterface PartWriter {\n name: string;\n maxBytes: number | undefined;\n bytes: number;\n writer: WritableStreamDefaultWriter<Uint8Array<ArrayBufferLike>>;\n}\n\nconst crlf = \"\\r\\n\";\nconst headerSeparator = \"\\r\\n\\r\\n\";\nconst maxHeaderBytes = 64 * 1024;\nexport const defaultMultipartMaxBytes = 10 * 1024 * 1024;\nexport const defaultMultipartMaxParts = 1_000;\n\n/**\n * Parses a multipart request body as an async iterable of streamable parts.\n */\nexport function parseMultipartStream(\n request: Request,\n options: MultipartStreamParseOptions = {},\n): AsyncIterable<MultipartStreamPart> {\n return {\n [Symbol.asyncIterator]() {\n const queue = new AsyncQueue<MultipartStreamPart>();\n void parseMultipartRequest(request, options, queue);\n return queue;\n },\n };\n}\n\nasync function parseMultipartRequest(\n request: Request,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): Promise<void> {\n const boundary = parseMultipartBoundary(request.headers.get(\"content-type\"));\n\n if (boundary === undefined) {\n queue.fail(new Error(\"Multipart request content-type must include a boundary.\"));\n return;\n }\n\n if (request.body === null) {\n queue.fail(new Error(\"Multipart request body is not readable.\"));\n return;\n }\n\n const reader = request.body.getReader();\n const delimiter = encodeAscii(`${crlf}--${boundary}`);\n const firstBoundary = encodeAscii(`--${boundary}`);\n const closeSuffix = encodeAscii(\"--\");\n const lineSuffix = encodeAscii(crlf);\n const keepTailBytes = delimiter.length + 4;\n let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array();\n let totalBytes = 0;\n let totalParts = 0;\n let started = false;\n let currentPart: PartWriter | undefined;\n\n queue.setCancel(() => {\n void currentPart?.writer.abort(new Error(\"Multipart stream iteration was cancelled.\"));\n void reader.cancel();\n });\n\n try {\n while (true) {\n const next = await reader.read();\n\n if (!next.done) {\n totalBytes += next.value.byteLength;\n enforceByteLimit(\"multipart request\", totalBytes, options.maxBytes ?? defaultMultipartMaxBytes);\n buffer = concatBytes(buffer, next.value);\n }\n\n while (true) {\n if (!started) {\n const firstBoundaryIndex = indexOfBytes(buffer, firstBoundary);\n\n if (firstBoundaryIndex < 0) {\n if (next.done) {\n throw new Error(\"Multipart request body does not contain the opening boundary.\");\n }\n\n trimBufferToTail(0);\n break;\n }\n\n buffer = buffer.slice(firstBoundaryIndex + firstBoundary.length);\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (!startsWithBytes(buffer, lineSuffix)) {\n if (next.done) {\n throw new Error(\"Malformed multipart opening boundary.\");\n }\n break;\n }\n\n buffer = buffer.slice(lineSuffix.length);\n started = true;\n }\n\n if (currentPart === undefined) {\n const headerEnd = indexOfAscii(buffer, headerSeparator);\n\n if (headerEnd < 0) {\n if (next.done) {\n throw new Error(\"Multipart part ended before headers completed.\");\n }\n\n if (buffer.length > maxHeaderBytes) {\n throw new Error(`Multipart part headers exceeded ${maxHeaderBytes} bytes.`);\n }\n break;\n }\n\n totalParts += 1;\n enforcePartLimit(totalParts, options.maxParts ?? defaultMultipartMaxParts);\n currentPart = createPartWriter(\n decodeAscii(buffer.slice(0, headerEnd)),\n options,\n queue,\n );\n buffer = buffer.slice(headerEnd + headerSeparator.length);\n }\n\n const delimiterIndex = indexOfBytes(buffer, delimiter);\n\n if (delimiterIndex < 0) {\n if (next.done) {\n throw new Error(`Multipart part \"${currentPart.name}\" ended before the closing boundary.`);\n }\n\n const writableLength = Math.max(0, buffer.length - keepTailBytes);\n\n if (writableLength === 0) {\n break;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, writableLength));\n buffer = buffer.slice(writableLength);\n continue;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, delimiterIndex));\n await currentPart.writer.close();\n buffer = buffer.slice(delimiterIndex + delimiter.length);\n currentPart = undefined;\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (startsWithBytes(buffer, lineSuffix)) {\n buffer = buffer.slice(lineSuffix.length);\n continue;\n }\n\n if (next.done) {\n throw new Error(\"Malformed multipart boundary delimiter.\");\n }\n\n break;\n }\n\n if (next.done) {\n break;\n }\n }\n\n queue.close();\n } catch (error) {\n await currentPart?.writer.abort(error);\n queue.fail(error);\n } finally {\n queue.setCancel(undefined);\n reader.releaseLock();\n }\n\n function trimBufferToTail(prefixLength: number): void {\n if (buffer.length <= keepTailBytes + prefixLength) {\n return;\n }\n\n buffer = buffer.slice(buffer.length - keepTailBytes - prefixLength);\n }\n}\n\nfunction createPartWriter(\n rawHeaders: string,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): PartWriter {\n const headers = parsePartHeaders(rawHeaders);\n const disposition = parseContentDisposition(headers.get(\"content-disposition\"));\n\n if (disposition.name === undefined) {\n throw new Error(\"Multipart part is missing a form-data name.\");\n }\n\n const stream = new TransformStream<Uint8Array, Uint8Array>();\n const part = createPart({\n name: disposition.name,\n filename: disposition.filename,\n headers,\n body: stream.readable,\n });\n\n queue.push(part);\n\n return {\n name: disposition.name,\n maxBytes: options.fields?.[disposition.name]?.maxBytes,\n bytes: 0,\n writer: stream.writable.getWriter(),\n };\n}\n\nfunction createPart(options: {\n name: string;\n filename: string | undefined;\n headers: Headers;\n body: ReadableStream<Uint8Array>;\n}): MultipartStreamPart {\n const part: MultipartStreamPart = {\n name: options.name,\n headers: options.headers,\n body: options.body,\n text() {\n return new Response(options.body).text();\n },\n arrayBuffer() {\n return new Response(options.body).arrayBuffer();\n },\n fixedLengthStream(length) {\n const expectedLength = length ?? contentLengthFromHeaders(options.headers);\n const stream = createFixedLengthStream(expectedLength);\n\n return {\n readable: stream.readable,\n done: options.body.pipeTo(stream.writable),\n };\n },\n };\n\n if (options.filename !== undefined) {\n part.filename = options.filename;\n part.safeFilename = sanitizeMultipartFilename(options.filename);\n }\n\n const contentType = options.headers.get(\"content-type\");\n\n if (contentType !== null) {\n part.contentType = contentType;\n }\n\n return part;\n}\n\nfunction contentLengthFromHeaders(headers: Headers): number | bigint {\n const raw = headers.get(\"content-length\");\n\n if (raw === null || raw.trim() === \"\") {\n throw new Error(\n \"Multipart part fixedLengthStream() requires a byte length. Pass an explicit length or include a Content-Length part header.\",\n );\n }\n\n const parsed = Number(raw);\n\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new Error(`Multipart part Content-Length must be a non-negative safe integer. Received ${JSON.stringify(raw)}.`);\n }\n\n return parsed;\n}\n\nfunction createFixedLengthStream(length: number | bigint): TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>> {\n const FixedLengthStream = (globalThis as {\n FixedLengthStream?: new (\n length: number | bigint,\n ) => TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>>;\n }).FixedLengthStream;\n\n if (FixedLengthStream === undefined) {\n throw new Error(\n \"FixedLengthStream is not available in this runtime. Use arrayBuffer() or pass the part body to a destination that accepts unknown-length streams.\",\n );\n }\n\n return new FixedLengthStream(length);\n}\n\nasync function writePartChunk(\n part: PartWriter,\n chunk: Uint8Array<ArrayBufferLike>,\n): Promise<void> {\n if (chunk.byteLength === 0) {\n return;\n }\n\n part.bytes += chunk.byteLength;\n enforceByteLimit(`multipart field \"${part.name}\"`, part.bytes, part.maxBytes);\n await part.writer.write(chunk);\n}\n\nfunction enforceByteLimit(label: string, bytes: number, maxBytes: number | undefined): void {\n if (maxBytes !== undefined && bytes > maxBytes) {\n throw new Error(`${label} exceeded ${maxBytes} bytes.`);\n }\n}\n\nfunction enforcePartLimit(parts: number, maxParts: number | undefined): void {\n if (maxParts !== undefined && parts > maxParts) {\n throw new Error(`multipart request exceeded ${maxParts} parts.`);\n }\n}\n\nexport function sanitizeMultipartFilename(filename: string): string {\n const leaf = filename.split(/[\\\\/]/u).at(-1) ?? \"\";\n let sanitized = \"\";\n\n for (const char of leaf) {\n sanitized += isControlCharacter(char) ? \"_\" : char;\n }\n\n return sanitized === \"\" || sanitized === \".\" || sanitized === \"..\" ? \"upload.bin\" : sanitized;\n}\n\nfunction isControlCharacter(char: string): boolean {\n const code = char.charCodeAt(0);\n\n return code < 0x20 || code === 0x7f;\n}\n\nfunction parseMultipartBoundary(contentType: string | null): string | undefined {\n if (contentType === null) {\n return undefined;\n }\n\n const [mediaType, ...parameters] = contentType.split(\";\").map((part) => part.trim());\n\n if (mediaType?.toLowerCase() !== \"multipart/form-data\") {\n return undefined;\n }\n\n for (const parameter of parameters) {\n const [rawName, ...rawValue] = parameter.split(\"=\");\n\n if (rawName?.trim().toLowerCase() !== \"boundary\") {\n continue;\n }\n\n const value = rawValue.join(\"=\").trim();\n const unquoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")\n ? value.slice(1, -1)\n : value;\n\n return unquoted === \"\" ? undefined : unquoted;\n }\n\n return undefined;\n}\n\nfunction parsePartHeaders(rawHeaders: string): Headers {\n const headers = new Headers();\n\n for (const line of rawHeaders.split(crlf)) {\n if (line.trim() === \"\") {\n continue;\n }\n\n const separator = line.indexOf(\":\");\n\n if (separator < 0) {\n throw new Error(`Malformed multipart header: ${line}`);\n }\n\n headers.append(\n line.slice(0, separator).trim().toLowerCase(),\n line.slice(separator + 1).trim(),\n );\n }\n\n return headers;\n}\n\nfunction parseContentDisposition(value: string | null): {\n name: string | undefined;\n filename: string | undefined;\n} {\n if (value === null) {\n return { name: undefined, filename: undefined };\n }\n\n const parameters = value.split(\";\").map((part) => part.trim());\n const disposition = parameters.shift()?.toLowerCase();\n\n if (disposition !== \"form-data\") {\n return { name: undefined, filename: undefined };\n }\n\n let name: string | undefined;\n let filename: string | undefined;\n\n for (const parameter of parameters) {\n const separator = parameter.indexOf(\"=\");\n\n if (separator < 0) {\n continue;\n }\n\n const key = parameter.slice(0, separator).trim().toLowerCase();\n const value = unquoteHeaderParameter(parameter.slice(separator + 1).trim());\n\n if (key === \"name\") {\n name = value;\n } else if (key === \"filename\") {\n filename = value;\n }\n }\n\n return { name, filename };\n}\n\nfunction unquoteHeaderParameter(value: string): string {\n if (!value.startsWith(\"\\\"\") || !value.endsWith(\"\\\"\")) {\n return value;\n }\n\n return value.slice(1, -1).replaceAll(/\\\\\"/g, \"\\\"\").replaceAll(/\\\\\\\\/g, \"\\\\\");\n}\n\nfunction concatBytes(\n left: Uint8Array<ArrayBufferLike>,\n right: Uint8Array<ArrayBufferLike>,\n): Uint8Array<ArrayBufferLike> {\n if (left.length === 0) {\n return right;\n }\n\n const next = new Uint8Array(left.length + right.length);\n next.set(left);\n next.set(right, left.length);\n return next;\n}\n\nfunction indexOfAscii(bytes: Uint8Array<ArrayBufferLike>, needle: string): number {\n return indexOfBytes(bytes, encodeAscii(needle));\n}\n\nfunction indexOfBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n needle: Uint8Array<ArrayBufferLike>,\n): number {\n if (needle.length === 0 || bytes.length < needle.length) {\n return -1;\n }\n\n const first = needle[0];\n\n for (let index = 0; index <= bytes.length - needle.length; index += 1) {\n if (bytes[index] !== first) {\n continue;\n }\n\n let matched = true;\n\n for (let offset = 1; offset < needle.length; offset += 1) {\n if (bytes[index + offset] !== needle[offset]) {\n matched = false;\n break;\n }\n }\n\n if (matched) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction startsWithBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n prefix: Uint8Array<ArrayBufferLike>,\n): boolean {\n if (bytes.length < prefix.length) {\n return false;\n }\n\n for (let index = 0; index < prefix.length; index += 1) {\n if (bytes[index] !== prefix[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction encodeAscii(value: string): Uint8Array<ArrayBufferLike> {\n return new TextEncoder().encode(value);\n}\n\nfunction decodeAscii(value: Uint8Array<ArrayBufferLike>): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n}\n\nclass AsyncQueue<T> implements AsyncIterator<T> {\n private readonly values: T[] = [];\n private readonly waits: Array<{\n resolve(result: IteratorResult<T>): void;\n reject(error: unknown): void;\n }> = [];\n private done = false;\n private error: unknown;\n private onCancel: (() => void) | undefined;\n\n setCancel(onCancel: (() => void) | undefined): void {\n this.onCancel = onCancel;\n }\n\n push(value: T): void {\n const wait = this.waits.shift();\n\n if (wait !== undefined) {\n wait.resolve({ done: false, value });\n return;\n }\n\n this.values.push(value);\n }\n\n close(): void {\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n }\n\n fail(error: unknown): void {\n this.error = error;\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.reject(error);\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.values.length > 0) {\n return Promise.resolve({ done: false, value: this.values.shift() as T });\n }\n\n if (this.error !== undefined) {\n return Promise.reject(this.error);\n }\n\n if (this.done) {\n return Promise.resolve({ done: true, value: undefined });\n }\n\n return new Promise((resolve, reject) => {\n this.waits.push({ resolve, reject });\n });\n }\n\n return(): Promise<IteratorResult<T>> {\n this.done = true;\n this.values.splice(0);\n this.onCancel?.();\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n\n return Promise.resolve({ done: true, value: undefined });\n }\n}\n"]}
1
+ {"version":3,"file":"multipart.js","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Configures multipart stream parsing limits and field handling.\n */\nexport interface MultipartStreamParseOptions {\n fields?: Readonly<Record<string, MultipartStreamFieldOptions>>;\n maxParts?: number;\n maxBytes?: number;\n}\n\n/**\n * Configures parsing behavior for a named multipart field.\n */\nexport interface MultipartStreamFieldOptions {\n type?: \"stream\" | \"text\";\n maxBytes?: number;\n}\n\n/**\n * Represents one parsed multipart field or file part.\n */\nexport interface MultipartStreamPart {\n name: string;\n filename?: string;\n safeFilename?: string;\n contentType?: string;\n headers: Headers;\n body: ReadableStream<Uint8Array<ArrayBufferLike>>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n fixedLengthStream(length?: number | bigint): MultipartFixedLengthStream;\n}\n\n/**\n * Couples a readable multipart part stream with a completion signal.\n */\nexport interface MultipartFixedLengthStream {\n readable: ReadableStream<Uint8Array<ArrayBufferLike>>;\n done: Promise<void>;\n}\n\ninterface PartWriter {\n name: string;\n maxBytes: number | undefined;\n bytes: number;\n writer: WritableStreamDefaultWriter<Uint8Array<ArrayBufferLike>>;\n}\n\nconst crlf = \"\\r\\n\";\nconst headerSeparator = \"\\r\\n\\r\\n\";\nconst maxHeaderBytes = 64 * 1024;\nexport const defaultMultipartMaxBytes = 10 * 1024 * 1024;\nexport const defaultMultipartMaxParts = 1_000;\n\n/**\n * Parses a multipart request body as an async iterable of streamable parts.\n */\nexport function parseMultipartStream(\n request: Request,\n options: MultipartStreamParseOptions = {},\n): AsyncIterable<MultipartStreamPart> {\n return {\n [Symbol.asyncIterator]() {\n const queue = new AsyncQueue<MultipartStreamPart>();\n void parseMultipartRequest(request, options, queue);\n return queue;\n },\n };\n}\n\nasync function parseMultipartRequest(\n request: Request,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): Promise<void> {\n const boundary = parseMultipartBoundary(request.headers.get(\"content-type\"));\n\n if (boundary === undefined) {\n queue.fail(new Error(\"Multipart request content-type must include a boundary.\"));\n return;\n }\n\n if (request.body === null) {\n queue.fail(new Error(\"Multipart request body is not readable.\"));\n return;\n }\n\n const reader = request.body.getReader();\n const delimiter = encodeAscii(`${crlf}--${boundary}`);\n const firstBoundary = encodeAscii(`--${boundary}`);\n const closeSuffix = encodeAscii(\"--\");\n const lineSuffix = encodeAscii(crlf);\n const keepTailBytes = delimiter.length + 4;\n let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array();\n let totalBytes = 0;\n let totalParts = 0;\n let started = false;\n let currentPart: PartWriter | undefined;\n\n queue.setCancel(() => {\n void currentPart?.writer.abort(new Error(\"Multipart stream iteration was cancelled.\"));\n void reader.cancel();\n });\n\n try {\n while (true) {\n const next = await reader.read();\n\n if (!next.done) {\n totalBytes += next.value.byteLength;\n enforceByteLimit(\"multipart request\", totalBytes, options.maxBytes ?? defaultMultipartMaxBytes);\n buffer = concatBytes(buffer, next.value);\n }\n\n while (true) {\n if (!started) {\n const firstBoundaryIndex = indexOfBytes(buffer, firstBoundary);\n\n if (firstBoundaryIndex < 0) {\n if (next.done) {\n throw new Error(\"Multipart request body does not contain the opening boundary.\");\n }\n\n trimBufferToTail(0);\n break;\n }\n\n buffer = buffer.slice(firstBoundaryIndex + firstBoundary.length);\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (!startsWithBytes(buffer, lineSuffix)) {\n if (next.done) {\n throw new Error(\"Malformed multipart opening boundary.\");\n }\n break;\n }\n\n buffer = buffer.slice(lineSuffix.length);\n started = true;\n }\n\n if (currentPart === undefined) {\n const headerEnd = indexOfAscii(buffer, headerSeparator);\n\n if (headerEnd < 0) {\n if (next.done) {\n throw new Error(\"Multipart part ended before headers completed.\");\n }\n\n if (buffer.length > maxHeaderBytes) {\n throw new Error(`Multipart part headers exceeded ${maxHeaderBytes} bytes.`);\n }\n break;\n }\n\n totalParts += 1;\n enforcePartLimit(totalParts, options.maxParts ?? defaultMultipartMaxParts);\n currentPart = createPartWriter(\n decodeAscii(buffer.slice(0, headerEnd)),\n options,\n queue,\n );\n buffer = buffer.slice(headerEnd + headerSeparator.length);\n }\n\n const delimiterIndex = indexOfBytes(buffer, delimiter);\n\n if (delimiterIndex < 0) {\n if (next.done) {\n throw new Error(`Multipart part \"${currentPart.name}\" ended before the closing boundary.`);\n }\n\n const writableLength = Math.max(0, buffer.length - keepTailBytes);\n\n if (writableLength === 0) {\n break;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, writableLength));\n buffer = buffer.slice(writableLength);\n continue;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, delimiterIndex));\n await currentPart.writer.close();\n buffer = buffer.slice(delimiterIndex + delimiter.length);\n currentPart = undefined;\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (startsWithBytes(buffer, lineSuffix)) {\n buffer = buffer.slice(lineSuffix.length);\n continue;\n }\n\n if (next.done) {\n throw new Error(\"Malformed multipart boundary delimiter.\");\n }\n\n break;\n }\n\n if (next.done) {\n break;\n }\n }\n\n queue.close();\n } catch (error) {\n await currentPart?.writer.abort(error);\n queue.fail(error);\n } finally {\n queue.setCancel(undefined);\n reader.releaseLock();\n }\n\n function trimBufferToTail(prefixLength: number): void {\n if (buffer.length <= keepTailBytes + prefixLength) {\n return;\n }\n\n buffer = buffer.slice(buffer.length - keepTailBytes - prefixLength);\n }\n}\n\nfunction createPartWriter(\n rawHeaders: string,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): PartWriter {\n const headers = parsePartHeaders(rawHeaders);\n const disposition = parseContentDisposition(headers.get(\"content-disposition\"));\n\n if (disposition.name === undefined) {\n throw new Error(\"Multipart part is missing a form-data name.\");\n }\n\n const stream = new TransformStream<Uint8Array, Uint8Array>();\n const part = createPart({\n name: disposition.name,\n filename: disposition.filename,\n headers,\n body: stream.readable,\n });\n\n queue.push(part);\n\n return {\n name: disposition.name,\n maxBytes: options.fields?.[disposition.name]?.maxBytes,\n bytes: 0,\n writer: stream.writable.getWriter(),\n };\n}\n\nfunction createPart(options: {\n name: string;\n filename: string | undefined;\n headers: Headers;\n body: ReadableStream<Uint8Array>;\n}): MultipartStreamPart {\n const part: MultipartStreamPart = {\n name: options.name,\n headers: options.headers,\n body: options.body,\n text() {\n return new Response(options.body).text();\n },\n arrayBuffer() {\n return new Response(options.body).arrayBuffer();\n },\n fixedLengthStream(length) {\n const expectedLength = length ?? contentLengthFromHeaders(options.headers);\n const stream = createFixedLengthStream(expectedLength);\n\n return {\n readable: stream.readable,\n done: options.body.pipeTo(stream.writable),\n };\n },\n };\n\n if (options.filename !== undefined) {\n part.filename = options.filename;\n part.safeFilename = sanitizeMultipartFilename(options.filename);\n }\n\n const contentType = options.headers.get(\"content-type\");\n\n if (contentType !== null) {\n part.contentType = contentType;\n }\n\n return part;\n}\n\nfunction contentLengthFromHeaders(headers: Headers): number | bigint {\n const raw = headers.get(\"content-length\");\n\n if (raw === null || raw.trim() === \"\") {\n throw new Error(\n \"Multipart part fixedLengthStream() requires a byte length. Pass an explicit length or include a Content-Length part header.\",\n );\n }\n\n const parsed = Number(raw);\n\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new Error(`Multipart part Content-Length must be a non-negative safe integer. Received ${JSON.stringify(raw)}.`);\n }\n\n return parsed;\n}\n\nfunction createFixedLengthStream(length: number | bigint): TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>> {\n const FixedLengthStream = (globalThis as {\n FixedLengthStream?: new (\n length: number | bigint,\n ) => TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>>;\n }).FixedLengthStream;\n\n if (FixedLengthStream === undefined) {\n throw new Error(\n \"FixedLengthStream is not available in this runtime. Use arrayBuffer() or pass the part body to a destination that accepts unknown-length streams.\",\n );\n }\n\n return new FixedLengthStream(length);\n}\n\nasync function writePartChunk(\n part: PartWriter,\n chunk: Uint8Array<ArrayBufferLike>,\n): Promise<void> {\n if (chunk.byteLength === 0) {\n return;\n }\n\n part.bytes += chunk.byteLength;\n enforceByteLimit(`multipart field \"${part.name}\"`, part.bytes, part.maxBytes);\n await part.writer.write(chunk);\n}\n\nfunction enforceByteLimit(label: string, bytes: number, maxBytes: number | undefined): void {\n if (maxBytes !== undefined && bytes > maxBytes) {\n throw new Error(`${label} exceeded ${maxBytes} bytes.`);\n }\n}\n\nfunction enforcePartLimit(parts: number, maxParts: number | undefined): void {\n if (maxParts !== undefined && parts > maxParts) {\n throw new Error(`multipart request exceeded ${maxParts} parts.`);\n }\n}\n\nexport function sanitizeMultipartFilename(filename: string): string {\n const leaf = filename.split(/[\\\\/]/u).at(-1) ?? \"\";\n let sanitized = \"\";\n\n for (const char of leaf) {\n sanitized += isControlCharacter(char) ? \"_\" : char;\n }\n\n return sanitized === \"\" || sanitized === \".\" || sanitized === \"..\" ? \"upload.bin\" : sanitized;\n}\n\nfunction isControlCharacter(char: string): boolean {\n const code = char.charCodeAt(0);\n\n return code < 0x20 || code === 0x7f;\n}\n\nfunction parseMultipartBoundary(contentType: string | null): string | undefined {\n if (contentType === null) {\n return undefined;\n }\n\n const [mediaType, ...parameters] = contentType.split(\";\").map((part) => part.trim());\n\n if (mediaType?.toLowerCase() !== \"multipart/form-data\") {\n return undefined;\n }\n\n for (const parameter of parameters) {\n const [rawName, ...rawValue] = parameter.split(\"=\");\n\n if (rawName?.trim().toLowerCase() !== \"boundary\") {\n continue;\n }\n\n const value = rawValue.join(\"=\").trim();\n const unquoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")\n ? value.slice(1, -1)\n : value;\n\n return unquoted === \"\" ? undefined : unquoted;\n }\n\n return undefined;\n}\n\nfunction parsePartHeaders(rawHeaders: string): Headers {\n const headers = new Headers();\n\n for (const line of rawHeaders.split(crlf)) {\n if (line.trim() === \"\") {\n continue;\n }\n\n const separator = line.indexOf(\":\");\n\n if (separator < 0) {\n throw new Error(`Malformed multipart header: ${line}`);\n }\n\n headers.append(\n line.slice(0, separator).trim().toLowerCase(),\n line.slice(separator + 1).trim(),\n );\n }\n\n return headers;\n}\n\nfunction parseContentDisposition(value: string | null): {\n name: string | undefined;\n filename: string | undefined;\n} {\n if (value === null) {\n return { name: undefined, filename: undefined };\n }\n\n const parameters = value.split(\";\").map((part) => part.trim());\n const disposition = parameters.shift()?.toLowerCase();\n\n if (disposition !== \"form-data\") {\n return { name: undefined, filename: undefined };\n }\n\n let name: string | undefined;\n let filename: string | undefined;\n\n for (const parameter of parameters) {\n const separator = parameter.indexOf(\"=\");\n\n if (separator < 0) {\n continue;\n }\n\n const key = parameter.slice(0, separator).trim().toLowerCase();\n const value = unquoteHeaderParameter(parameter.slice(separator + 1).trim());\n\n if (key === \"name\") {\n name = value;\n } else if (key === \"filename\") {\n filename = value;\n }\n }\n\n return { name, filename };\n}\n\nfunction unquoteHeaderParameter(value: string): string {\n if (!value.startsWith(\"\\\"\") || !value.endsWith(\"\\\"\")) {\n return value;\n }\n\n return value.slice(1, -1).replaceAll(/\\\\\"/g, \"\\\"\").replaceAll(/\\\\\\\\/g, \"\\\\\");\n}\n\nfunction concatBytes(\n left: Uint8Array<ArrayBufferLike>,\n right: Uint8Array<ArrayBufferLike>,\n): Uint8Array<ArrayBufferLike> {\n if (left.length === 0) {\n return right;\n }\n\n const next = new Uint8Array(left.length + right.length);\n next.set(left);\n next.set(right, left.length);\n return next;\n}\n\nfunction indexOfAscii(bytes: Uint8Array<ArrayBufferLike>, needle: string): number {\n return indexOfBytes(bytes, encodeAscii(needle));\n}\n\nfunction indexOfBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n needle: Uint8Array<ArrayBufferLike>,\n): number {\n if (needle.length === 0 || bytes.length < needle.length) {\n return -1;\n }\n\n const first = needle[0];\n\n for (let index = 0; index <= bytes.length - needle.length; index += 1) {\n if (bytes[index] !== first) {\n continue;\n }\n\n let matched = true;\n\n for (let offset = 1; offset < needle.length; offset += 1) {\n if (bytes[index + offset] !== needle[offset]) {\n matched = false;\n break;\n }\n }\n\n if (matched) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction startsWithBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n prefix: Uint8Array<ArrayBufferLike>,\n): boolean {\n if (bytes.length < prefix.length) {\n return false;\n }\n\n for (let index = 0; index < prefix.length; index += 1) {\n if (bytes[index] !== prefix[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction encodeAscii(value: string): Uint8Array<ArrayBufferLike> {\n return new TextEncoder().encode(value);\n}\n\nfunction decodeAscii(value: Uint8Array<ArrayBufferLike>): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n}\n\nclass AsyncQueue<T> implements AsyncIterator<T> {\n private readonly values: T[] = [];\n private readonly waits: Array<{\n resolve(result: IteratorResult<T>): void;\n reject(error: unknown): void;\n }> = [];\n private done = false;\n private error: unknown;\n private onCancel: (() => void) | undefined;\n\n setCancel(onCancel: (() => void) | undefined): void {\n this.onCancel = onCancel;\n }\n\n push(value: T): void {\n const wait = this.waits.shift();\n\n if (wait !== undefined) {\n wait.resolve({ done: false, value });\n return;\n }\n\n this.values.push(value);\n }\n\n close(): void {\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n }\n\n fail(error: unknown): void {\n this.error = error;\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.reject(error);\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.values.length > 0) {\n return Promise.resolve({ done: false, value: this.values.shift() as T });\n }\n\n if (this.error !== undefined) {\n return Promise.reject(this.error);\n }\n\n if (this.done) {\n return Promise.resolve({ done: true, value: undefined });\n }\n\n return new Promise((resolve, reject) => {\n this.waits.push({ resolve, reject });\n });\n }\n\n return(): Promise<IteratorResult<T>> {\n this.done = true;\n this.values.splice(0);\n this.onCancel?.();\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n\n return Promise.resolve({ done: true, value: undefined });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"native-escape.js","sourceRoot":"","sources":["../src/native-escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAMvF,IAAI,YAAoD,CAAC;AACzD,IAAI,aAAmE,CAAC;AAExE;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IAExC,OAAO,MAAM,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,sBAAsB;IAC7B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;QAEvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,YAAY,GAAG,KAAK,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,6BAA6B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtF,IAAI,CAAC;gBACH,YAAY,GAAG,OAAO,CAAC,SAAS,CAAuB,CAAC;gBACxD,MAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;YAC3E,CAAC;QACH,CAAC;QACD,YAAY,KAAK,KAAK,CAAC;IACzB,CAAC;IAED,OAAO,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAC3D,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,aAAa;gBACX,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;AAC7D,CAAC","sourcesContent":["import { createRequire } from \"node:module\";\nimport { nativeModulePackageCandidates } from \"./native-route-matcher.js\";\nimport { escapeHtmlAttribute as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\n\ninterface NativeEscapeModule {\n escapeHtmlBatch?: (values: string[]) => string[];\n}\n\nlet nativeModule: NativeEscapeModule | false | undefined;\nlet nativeRequire: ReturnType<typeof createRequire> | false | undefined;\n\n/**\n * Escapes a batch of values as HTML text using the native helper when available.\n */\nexport function escapeHtmlBatch(values: readonly unknown[]): string[] {\n const strings = values.map((value) => String(value ?? \"\"));\n const native = loadNativeEscapeModule();\n\n return native?.escapeHtmlBatch?.(strings) ?? strings.map(escapeHtml);\n}\n\nfunction loadNativeEscapeModule(): NativeEscapeModule | undefined {\n if (nativeModule === undefined) {\n const require = nativePackageRequire();\n\n if (require === undefined) {\n nativeModule = false;\n return undefined;\n }\n\n for (const candidate of nativeModulePackageCandidates(process.platform, process.arch)) {\n try {\n nativeModule = require(candidate) as NativeEscapeModule;\n break;\n } catch {\n // Native package is optional. JS escaping remains the portable fallback.\n }\n }\n nativeModule ??= false;\n }\n\n return nativeModule === false ? undefined : nativeModule;\n}\n\nfunction nativePackageRequire(): ReturnType<typeof createRequire> | undefined {\n if (nativeRequire === undefined) {\n try {\n nativeRequire =\n new URL(import.meta.url).protocol === \"file:\" ? createRequire(import.meta.url) : false;\n } catch {\n nativeRequire = false;\n }\n }\n\n return nativeRequire === false ? undefined : nativeRequire;\n}\n"]}
1
+ {"version":3,"file":"native-escape.js","sourceRoot":"","sources":["../src/native-escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAMvF,IAAI,YAAoD,CAAC;AACzD,IAAI,aAAmE,CAAC;AAExE;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IAExC,OAAO,MAAM,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,sBAAsB;IAC7B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;QAEvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,YAAY,GAAG,KAAK,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,6BAA6B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtF,IAAI,CAAC;gBACH,YAAY,GAAG,OAAO,CAAC,SAAS,CAAuB,CAAC;gBACxD,MAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;YAC3E,CAAC;QACH,CAAC;QACD,YAAY,KAAK,KAAK,CAAC;IACzB,CAAC;IAED,OAAO,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAC3D,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,aAAa;gBACX,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;AAC7D,CAAC","sourcesContent":["import { createRequire } from \"node:module\";\nimport { nativeModulePackageCandidates } from \"./native-route-matcher.js\";\nimport { escapeHtmlAttribute as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\n\ninterface NativeEscapeModule {\n escapeHtmlBatch?: (values: string[]) => string[];\n}\n\nlet nativeModule: NativeEscapeModule | false | undefined;\nlet nativeRequire: ReturnType<typeof createRequire> | false | undefined;\n\n/**\n * Escapes a batch of values as HTML text using the native helper when available.\n */\nexport function escapeHtmlBatch(values: readonly unknown[]): string[] {\n const strings = values.map((value) => String(value ?? \"\"));\n const native = loadNativeEscapeModule();\n\n return native?.escapeHtmlBatch?.(strings) ?? strings.map(escapeHtml);\n}\n\nfunction loadNativeEscapeModule(): NativeEscapeModule | undefined {\n if (nativeModule === undefined) {\n const require = nativePackageRequire();\n\n if (require === undefined) {\n nativeModule = false;\n return undefined;\n }\n\n for (const candidate of nativeModulePackageCandidates(process.platform, process.arch)) {\n try {\n nativeModule = require(candidate) as NativeEscapeModule;\n break;\n } catch {\n // Native package is optional. JS escaping remains the portable fallback.\n }\n }\n nativeModule ??= false;\n }\n\n return nativeModule === false ? undefined : nativeModule;\n}\n\nfunction nativePackageRequire(): ReturnType<typeof createRequire> | undefined {\n if (nativeRequire === undefined) {\n try {\n nativeRequire =\n new URL(import.meta.url).protocol === \"file:\" ? createRequire(import.meta.url) : false;\n } catch {\n nativeRequire = false;\n }\n }\n\n return nativeRequire === false ? undefined : nativeRequire;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"native-route-matcher.js","sourceRoot":"","sources":["../src/native-route-matcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AppRoute, MatchedRoute, RouteMatcher } from \"./routes.js\";\n\ninterface NativeRouteMatcherInstance {\n matchRoute(pathname: string): NativeMatchOutput | null | undefined;\n}\n\ninterface NativeRouteMatcherConstructor {\n new (routesJson: string): NativeRouteMatcherInstance;\n}\n\ninterface NativeRouteMatcherModule {\n NativeRouteMatcher?: NativeRouteMatcherConstructor | undefined;\n}\n\ninterface NativeMatchOutput {\n index: number;\n params: Record<string, string>;\n catchAllParams?: Record<string, string[]> | undefined;\n}\n\nlet loadedNativeModule: NativeRouteMatcherModule | false | undefined;\nconst nativeRouteMatcherAutoThreshold = 100;\n\nexport function createNativeRouteMatcher(\n sortedRoutes: readonly AppRoute[],\n): RouteMatcher | undefined {\n if (\n !shouldUseNativeRouteMatcher(\n sortedRoutes.length,\n process.env.MREACT_APP_ROUTER_NATIVE_ROUTE_MATCHER,\n )\n ) {\n return undefined;\n }\n\n const nativeModule = loadNativeRouteMatcherModule();\n const NativeRouteMatcher = nativeModule === false\n ? undefined\n : nativeModule.NativeRouteMatcher;\n\n if (NativeRouteMatcher === undefined) {\n return undefined;\n }\n\n const nativeRoutes = sortedRoutes.map((route, index) => ({\n index,\n segments: route.segments,\n }));\n const matcher = new NativeRouteMatcher(JSON.stringify(nativeRoutes));\n\n return {\n match(pathname): MatchedRoute | undefined {\n return matchNativeRoute(matcher, sortedRoutes, pathname);\n },\n };\n}\n\nexport function __matchNativeRouteForTesting(\n matcher: NativeRouteMatcherInstance,\n sortedRoutes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n return matchNativeRoute(matcher, sortedRoutes, pathname);\n}\n\nfunction matchNativeRoute(\n matcher: NativeRouteMatcherInstance,\n sortedRoutes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n let output: NativeMatchOutput | null | undefined;\n try {\n output = matcher.matchRoute(pathname);\n } catch {\n return undefined;\n }\n\n if (output == null) {\n return undefined;\n }\n\n const route = sortedRoutes[output.index];\n\n return route === undefined\n ? undefined\n : {\n route,\n params: normalizeNativeParams(route, output.params, output.catchAllParams),\n };\n}\n\nexport function normalizeNativeParams(\n route: AppRoute,\n params: Record<string, string>,\n catchAllParams: Record<string, string[]> = {},\n): MatchedRoute[\"params\"] {\n const normalized: MatchedRoute[\"params\"] = { ...params };\n\n for (const segment of route.segments) {\n if (segment.kind !== \"catch-all\") {\n continue;\n }\n const catchAllValue = catchAllParams[segment.name];\n if (catchAllValue !== undefined) {\n normalized[segment.name] = catchAllValue;\n continue;\n }\n\n const value = normalized[segment.name];\n if (typeof value === \"string\") {\n normalized[segment.name] = value\n .split(\"/\")\n .filter((part: string) => part !== \"\")\n .map((part: string) => part);\n }\n }\n\n return normalized;\n}\n\nexport function shouldUseNativeRouteMatcher(\n routeCount: number,\n mode: string | undefined,\n): boolean {\n if (mode === \"1\" || mode === \"true\") {\n return true;\n }\n\n if (mode === \"0\" || mode === \"false\") {\n return false;\n }\n\n return routeCount >= nativeRouteMatcherAutoThreshold;\n}\n\nfunction loadNativeRouteMatcherModule(): NativeRouteMatcherModule | false {\n if (loadedNativeModule !== undefined) {\n return loadedNativeModule;\n }\n\n const require = nativePackageRequire();\n\n if (require === undefined) {\n loadedNativeModule = false;\n return loadedNativeModule;\n }\n\n for (const candidate of nativeModuleCandidates()) {\n try {\n loadedNativeModule = require(candidate) as NativeRouteMatcherModule;\n return loadedNativeModule;\n } catch {\n // Native package is optional. The JS matcher remains the portable fallback.\n }\n }\n\n loadedNativeModule = false;\n return false;\n}\n\nfunction nativePackageRequire(): ReturnType<typeof createRequire> | undefined {\n try {\n return new URL(import.meta.url).protocol === \"file:\" ? createRequire(import.meta.url) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nativeModuleCandidates(): string[] {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const workspaceNativePackage = join(currentDir, \"..\", \"..\", \"router-native\");\n\n return [\n ...nativeModulePackageCandidates(process.platform, process.arch),\n workspaceNativePackage,\n ];\n}\n\nexport function nativeModulePackageCandidates(platform: NodeJS.Platform, arch: string): string[] {\n const platformPackage = nativePlatformPackageName(platform, arch);\n\n return [\n ...(platformPackage === undefined ? [] : [platformPackage]),\n \"@reckona/mreact-router-native\",\n ];\n}\n\nfunction nativePlatformPackageName(platform: NodeJS.Platform, arch: string): string | undefined {\n if (platform === \"linux\" && arch === \"x64\") {\n return \"@reckona/mreact-router-native-linux-x64-gnu\";\n }\n\n if (platform === \"darwin\" && arch === \"arm64\") {\n return \"@reckona/mreact-router-native-darwin-arm64\";\n }\n\n if (platform === \"win32\" && arch === \"x64\") {\n return \"@reckona/mreact-router-native-win32-x64-msvc\";\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"native-route-matcher.js","sourceRoot":"","sources":["../src/native-route-matcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AppRoute, MatchedRoute, RouteMatcher } from \"./routes.js\";\n\ninterface NativeRouteMatcherInstance {\n matchRoute(pathname: string): NativeMatchOutput | null | undefined;\n}\n\ninterface NativeRouteMatcherConstructor {\n new (routesJson: string): NativeRouteMatcherInstance;\n}\n\ninterface NativeRouteMatcherModule {\n NativeRouteMatcher?: NativeRouteMatcherConstructor | undefined;\n}\n\ninterface NativeMatchOutput {\n index: number;\n params: Record<string, string>;\n catchAllParams?: Record<string, string[]> | undefined;\n}\n\nlet loadedNativeModule: NativeRouteMatcherModule | false | undefined;\nconst nativeRouteMatcherAutoThreshold = 100;\n\nexport function createNativeRouteMatcher(\n sortedRoutes: readonly AppRoute[],\n): RouteMatcher | undefined {\n if (\n !shouldUseNativeRouteMatcher(\n sortedRoutes.length,\n process.env.MREACT_APP_ROUTER_NATIVE_ROUTE_MATCHER,\n )\n ) {\n return undefined;\n }\n\n const nativeModule = loadNativeRouteMatcherModule();\n const NativeRouteMatcher = nativeModule === false\n ? undefined\n : nativeModule.NativeRouteMatcher;\n\n if (NativeRouteMatcher === undefined) {\n return undefined;\n }\n\n const nativeRoutes = sortedRoutes.map((route, index) => ({\n index,\n segments: route.segments,\n }));\n const matcher = new NativeRouteMatcher(JSON.stringify(nativeRoutes));\n\n return {\n match(pathname): MatchedRoute | undefined {\n return matchNativeRoute(matcher, sortedRoutes, pathname);\n },\n };\n}\n\nexport function __matchNativeRouteForTesting(\n matcher: NativeRouteMatcherInstance,\n sortedRoutes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n return matchNativeRoute(matcher, sortedRoutes, pathname);\n}\n\nfunction matchNativeRoute(\n matcher: NativeRouteMatcherInstance,\n sortedRoutes: readonly AppRoute[],\n pathname: string,\n): MatchedRoute | undefined {\n let output: NativeMatchOutput | null | undefined;\n try {\n output = matcher.matchRoute(pathname);\n } catch {\n return undefined;\n }\n\n if (output == null) {\n return undefined;\n }\n\n const route = sortedRoutes[output.index];\n\n return route === undefined\n ? undefined\n : {\n route,\n params: normalizeNativeParams(route, output.params, output.catchAllParams),\n };\n}\n\nexport function normalizeNativeParams(\n route: AppRoute,\n params: Record<string, string>,\n catchAllParams: Record<string, string[]> = {},\n): MatchedRoute[\"params\"] {\n const normalized: MatchedRoute[\"params\"] = { ...params };\n\n for (const segment of route.segments) {\n if (segment.kind !== \"catch-all\") {\n continue;\n }\n const catchAllValue = catchAllParams[segment.name];\n if (catchAllValue !== undefined) {\n normalized[segment.name] = catchAllValue;\n continue;\n }\n\n const value = normalized[segment.name];\n if (typeof value === \"string\") {\n normalized[segment.name] = value\n .split(\"/\")\n .filter((part: string) => part !== \"\")\n .map((part: string) => part);\n }\n }\n\n return normalized;\n}\n\nexport function shouldUseNativeRouteMatcher(\n routeCount: number,\n mode: string | undefined,\n): boolean {\n if (mode === \"1\" || mode === \"true\") {\n return true;\n }\n\n if (mode === \"0\" || mode === \"false\") {\n return false;\n }\n\n return routeCount >= nativeRouteMatcherAutoThreshold;\n}\n\nfunction loadNativeRouteMatcherModule(): NativeRouteMatcherModule | false {\n if (loadedNativeModule !== undefined) {\n return loadedNativeModule;\n }\n\n const require = nativePackageRequire();\n\n if (require === undefined) {\n loadedNativeModule = false;\n return loadedNativeModule;\n }\n\n for (const candidate of nativeModuleCandidates()) {\n try {\n loadedNativeModule = require(candidate) as NativeRouteMatcherModule;\n return loadedNativeModule;\n } catch {\n // Native package is optional. The JS matcher remains the portable fallback.\n }\n }\n\n loadedNativeModule = false;\n return false;\n}\n\nfunction nativePackageRequire(): ReturnType<typeof createRequire> | undefined {\n try {\n return new URL(import.meta.url).protocol === \"file:\" ? createRequire(import.meta.url) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nativeModuleCandidates(): string[] {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const workspaceNativePackage = join(currentDir, \"..\", \"..\", \"router-native\");\n\n return [\n ...nativeModulePackageCandidates(process.platform, process.arch),\n workspaceNativePackage,\n ];\n}\n\nexport function nativeModulePackageCandidates(platform: NodeJS.Platform, arch: string): string[] {\n const platformPackage = nativePlatformPackageName(platform, arch);\n\n return [\n ...(platformPackage === undefined ? [] : [platformPackage]),\n \"@reckona/mreact-router-native\",\n ];\n}\n\nfunction nativePlatformPackageName(platform: NodeJS.Platform, arch: string): string | undefined {\n if (platform === \"linux\" && arch === \"x64\") {\n return \"@reckona/mreact-router-native-linux-x64-gnu\";\n }\n\n if (platform === \"darwin\" && arch === \"arm64\") {\n return \"@reckona/mreact-router-native-darwin-arm64\";\n }\n\n if (platform === \"win32\" && arch === \"x64\") {\n return \"@reckona/mreact-router-native-win32-x64-msvc\";\n }\n\n return undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseCookieHeader } from \"./cookies.js\";\n\nconst redirectErrorName = \"MReactRedirect\";\nconst notFoundErrorName = \"MReactNotFound\";\nconst rewriteHeaderName = \"x-mreact-rewrite\";\nconst rewriteLocationSymbol = Symbol.for(\"mreact.router.rewriteLocation\");\n\nexport interface RedirectOptions {\n status?: 301 | 302 | 303 | 307 | 308;\n}\n\nexport type MiddlewareNext = undefined;\n\n/**\n * Describes a parser used by `parseForm()` to validate submitted form data.\n */\nexport interface ParseSchema<T> {\n parse(value: FormData): T;\n}\n\n// Strip leading C0 controls + ASCII whitespace per WHATWG URL parsing.\n// Browsers ignore these characters when resolving the Location header,\n// so attacker payloads must be rejected after the same normalization.\nfunction stripLeadingControlOrWhitespace(value: string): string {\n let start = 0;\n\n while (start < value.length && value.charCodeAt(start) <= 0x20) {\n start += 1;\n }\n\n return value.slice(start);\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) {\n return true;\n }\n }\n\n return false;\n}\n\n// Returns true if `location` is safe to use as a same-origin Location header.\n// Allowed: path-absolute (`/foo`), query-only (`?x=1`), hash-only (`#x`),\n// relative (`foo`). Rejected: protocol-relative (`//evil`), backslash variants\n// (`/\\evil`, `\\\\evil`), and anything with a scheme like `javascript:`.\nfunction isSafeInternalRedirect(location: string): boolean {\n if (containsControlCharacter(location)) return false;\n const trimmed = stripLeadingControlOrWhitespace(location);\n if (trimmed === \"\") return false;\n if (trimmed.startsWith(\"//\")) return false;\n if (trimmed.startsWith(\"/\\\\\")) return false;\n if (trimmed.startsWith(\"\\\\\")) return false;\n // Reject anything that parses as a URL with a scheme.\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return false;\n return true;\n}\n\nfunction isSafeExternalRedirect(location: string): boolean {\n if (containsControlCharacter(location)) return false;\n const trimmed = stripLeadingControlOrWhitespace(location);\n const match = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(trimmed);\n if (match === null || match[1] === undefined) return false;\n const scheme = match[1].toLowerCase();\n return scheme === \"http\" || scheme === \"https\";\n}\n\nfunction throwUnsafeRedirect(location: string): never {\n throw new TypeError(\n `unsafe redirect target: ${JSON.stringify(location)} - use redirectExternal() for off-site destinations and ensure the URL is http(s)`,\n );\n}\n\nfunction throwUnsafeRewrite(location: string): never {\n throw new TypeError(\n `unsafe rewrite target: ${JSON.stringify(location)} - rewrite() only accepts same-origin paths, query strings, or hashes; external, protocol-relative, backslash, and control-character targets are rejected`,\n );\n}\n\n/**\n * Throws an internal redirect for loaders, middleware, route handlers, or server actions.\n *\n * The target must be same-origin or relative; use `redirectExternal()` for trusted `http` or `https` destinations. The default status is `303`.\n */\nexport function redirect(location: string, options: RedirectOptions = {}): never {\n if (!isSafeInternalRedirect(location)) {\n throwUnsafeRedirect(location);\n }\n throw Object.assign(new Error(`Redirect to ${location}`), {\n location,\n name: redirectErrorName,\n status: options.status ?? 303,\n });\n}\n\n/**\n * Throws an external redirect for trusted `http` or `https` destinations.\n *\n * This helper is intentionally separate from `redirect()` so off-site navigation is explicit. The default status is `307`.\n */\nexport function redirectExternal(\n location: string,\n options: RedirectOptions = {},\n): never {\n if (!isSafeExternalRedirect(location)) {\n throwUnsafeRedirect(location);\n }\n throw Object.assign(new Error(`Redirect to ${location}`), {\n location,\n name: redirectErrorName,\n status: options.status ?? 307,\n });\n}\n\n/**\n * Creates a same-origin `303 See Other` redirect response.\n *\n * Use this from route handlers when returning a `Response` is more convenient than throwing through the app-router control flow.\n */\nexport function redirect303(location: string, init: ResponseInit = {}): Response {\n if (!isSafeInternalRedirect(location)) {\n throwUnsafeRedirect(location);\n }\n\n const headers = new Headers(init.headers);\n headers.set(\"location\", location);\n\n return new Response(null, {\n ...init,\n headers,\n status: 303,\n });\n}\n\n/**\n * Creates a plain-text error response with a default `text/plain` content type.\n */\nexport function textError(message: string, status = 400, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/plain; charset=utf-8\");\n }\n\n return new Response(message, {\n ...init,\n headers,\n status,\n });\n}\n\n/**\n * Reads `request.formData()` and optionally validates it with a schema-like parser.\n *\n * Pass a schema object with `parse(FormData)` when a route handler or server action should receive typed form data.\n */\nexport async function parseForm(request: Request): Promise<FormData>;\nexport async function parseForm<T>(request: Request, schema: ParseSchema<T>): Promise<T>;\nexport async function parseForm<T>(\n request: Request,\n schema?: ParseSchema<T>,\n): Promise<FormData | T> {\n const form = await request.formData();\n\n return schema === undefined ? form : schema.parse(form);\n}\n\n/**\n * Throws a route-level 404 control error.\n *\n * Use this from loaders, metadata, middleware, or route handlers when the matched route is valid but the requested resource is absent.\n */\nexport function notFound(): never {\n throw Object.assign(new Error(\"Not Found\"), {\n name: notFoundErrorName,\n status: 404,\n });\n}\n\n/**\n * Alias for `notFound()` for codebases that prefer an explicit throwing helper name.\n */\nexport function throwNotFound(): never {\n return notFound();\n}\n\n/**\n * Continues middleware processing without changing the request.\n */\nexport function next(): MiddlewareNext {\n return undefined;\n}\n\n/**\n * Creates an internal rewrite response consumed by app-router middleware.\n *\n * The target must be a same-origin route path, query, hash, or relative URL; protocol-relative, external, and control-character targets are rejected.\n */\nexport function rewrite(location: string, init: ResponseInit = {}): Response {\n if (!isSafeInternalRedirect(location)) {\n throwUnsafeRewrite(location);\n }\n\n const response = new Response(null, {\n ...init,\n status: init.status ?? 200,\n });\n\n Object.defineProperty(response, rewriteLocationSymbol, {\n configurable: false,\n enumerable: false,\n value: location,\n });\n\n return response;\n}\n\n/**\n * Creates a JSON response using the platform `Response.json()` implementation.\n */\nexport function json(value: unknown, init?: ResponseInit): Response {\n return Response.json(value, init);\n}\n\n/**\n * Creates an HTML response and defaults the content type to `text/html; charset=utf-8`.\n */\nexport function html(value: string, init: ResponseInit = {}): Response {\n if (init.headers === undefined) {\n return new Response(value, {\n ...init,\n headers: { \"content-type\": \"text/html; charset=utf-8\" },\n });\n }\n\n const headers = new Headers(init.headers);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n }\n\n return new Response(value, {\n ...init,\n headers,\n });\n}\n\n/**\n * Returns the request headers object for route code that follows app-router helper naming.\n */\nexport function headers(request: Request): Headers {\n return request.headers;\n}\n\nexport interface RequestCookies {\n entries(): IterableIterator<[string, string]>;\n get(name: string): string | undefined;\n has(name: string): boolean;\n}\n\n/**\n * Parses request cookies into a small read-only helper.\n *\n * Values are decoded with `decodeURIComponent`; malformed encoded values are ignored rather than throwing during request handling.\n */\nexport function cookies(request: Request): RequestCookies {\n let values: ReadonlyMap<string, string> | undefined;\n const cookieValues = () => {\n values ??= parseCookieHeader(request.headers.get(\"cookie\"));\n return values;\n };\n\n return {\n entries: () => cookieValues().entries(),\n get: (name) => cookieValues().get(name),\n has: (name) => cookieValues().has(name),\n };\n}\n\nexport function rewriteLocation(response: Response): string | undefined {\n const marked = (response as { [rewriteLocationSymbol]?: unknown })[rewriteLocationSymbol];\n const candidate = typeof marked === \"string\"\n ? marked\n : response.headers.get(rewriteHeaderName) ?? undefined;\n\n return candidate !== undefined && isSafeInternalRedirect(candidate) ? candidate : undefined;\n}\n\n/**\n * Checks whether an unknown error is an app-router redirect signal.\n */\nexport function isRedirectError(error: unknown): error is Error & { location: string; status: number } {\n return error instanceof Error &&\n error.name === redirectErrorName &&\n typeof (error as { location?: unknown }).location === \"string\";\n}\n\n/**\n * Checks whether an unknown error is an app-router not-found signal.\n */\nexport function isNotFoundError(error: unknown): boolean {\n return error instanceof Error && error.name === notFoundErrorName;\n}\n"]}
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseCookieHeader } from \"./cookies.js\";\n\nconst redirectErrorName = \"MReactRedirect\";\nconst notFoundErrorName = \"MReactNotFound\";\nconst rewriteHeaderName = \"x-mreact-rewrite\";\nconst rewriteLocationSymbol = Symbol.for(\"mreact.router.rewriteLocation\");\n\nexport interface RedirectOptions {\n status?: 301 | 302 | 303 | 307 | 308;\n}\n\nexport type MiddlewareNext = undefined;\n\n/**\n * Describes a parser used by `parseForm()` to validate submitted form data.\n */\nexport interface ParseSchema<T> {\n parse(value: FormData): T;\n}\n\n// Strip leading C0 controls + ASCII whitespace per WHATWG URL parsing.\n// Browsers ignore these characters when resolving the Location header,\n// so attacker payloads must be rejected after the same normalization.\nfunction stripLeadingControlOrWhitespace(value: string): string {\n let start = 0;\n\n while (start < value.length && value.charCodeAt(start) <= 0x20) {\n start += 1;\n }\n\n return value.slice(start);\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) {\n return true;\n }\n }\n\n return false;\n}\n\n// Returns true if `location` is safe to use as a same-origin Location header.\n// Allowed: path-absolute (`/foo`), query-only (`?x=1`), hash-only (`#x`),\n// relative (`foo`). Rejected: protocol-relative (`//evil`), backslash variants\n// (`/\\evil`, `\\\\evil`), and anything with a scheme like `javascript:`.\nfunction isSafeInternalRedirect(location: string): boolean {\n if (containsControlCharacter(location)) return false;\n const trimmed = stripLeadingControlOrWhitespace(location);\n if (trimmed === \"\") return false;\n if (trimmed.startsWith(\"//\")) return false;\n if (trimmed.startsWith(\"/\\\\\")) return false;\n if (trimmed.startsWith(\"\\\\\")) return false;\n // Reject anything that parses as a URL with a scheme.\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return false;\n return true;\n}\n\nfunction isSafeExternalRedirect(location: string): boolean {\n if (containsControlCharacter(location)) return false;\n const trimmed = stripLeadingControlOrWhitespace(location);\n const match = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(trimmed);\n if (match === null || match[1] === undefined) return false;\n const scheme = match[1].toLowerCase();\n return scheme === \"http\" || scheme === \"https\";\n}\n\nfunction throwUnsafeRedirect(location: string): never {\n throw new TypeError(\n `unsafe redirect target: ${JSON.stringify(location)} - use redirectExternal() for off-site destinations and ensure the URL is http(s)`,\n );\n}\n\nfunction throwUnsafeRewrite(location: string): never {\n throw new TypeError(\n `unsafe rewrite target: ${JSON.stringify(location)} - rewrite() only accepts same-origin paths, query strings, or hashes; external, protocol-relative, backslash, and control-character targets are rejected`,\n );\n}\n\n/**\n * Throws an internal redirect for loaders, middleware, route handlers, or server actions.\n *\n * The target must be same-origin or relative; use `redirectExternal()` for trusted `http` or `https` destinations. The default status is `303`.\n */\nexport function redirect(location: string, options: RedirectOptions = {}): never {\n if (!isSafeInternalRedirect(location)) {\n throwUnsafeRedirect(location);\n }\n throw Object.assign(new Error(`Redirect to ${location}`), {\n location,\n name: redirectErrorName,\n status: options.status ?? 303,\n });\n}\n\n/**\n * Throws an external redirect for trusted `http` or `https` destinations.\n *\n * This helper is intentionally separate from `redirect()` so off-site navigation is explicit. The default status is `307`.\n */\nexport function redirectExternal(\n location: string,\n options: RedirectOptions = {},\n): never {\n if (!isSafeExternalRedirect(location)) {\n throwUnsafeRedirect(location);\n }\n throw Object.assign(new Error(`Redirect to ${location}`), {\n location,\n name: redirectErrorName,\n status: options.status ?? 307,\n });\n}\n\n/**\n * Creates a same-origin `303 See Other` redirect response.\n *\n * Use this from route handlers when returning a `Response` is more convenient than throwing through the app-router control flow.\n */\nexport function redirect303(location: string, init: ResponseInit = {}): Response {\n if (!isSafeInternalRedirect(location)) {\n throwUnsafeRedirect(location);\n }\n\n const headers = new Headers(init.headers);\n headers.set(\"location\", location);\n\n return new Response(null, {\n ...init,\n headers,\n status: 303,\n });\n}\n\n/**\n * Creates a plain-text error response with a default `text/plain` content type.\n */\nexport function textError(message: string, status = 400, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/plain; charset=utf-8\");\n }\n\n return new Response(message, {\n ...init,\n headers,\n status,\n });\n}\n\n/**\n * Reads `request.formData()` and optionally validates it with a schema-like parser.\n *\n * Pass a schema object with `parse(FormData)` when a route handler or server action should receive typed form data.\n */\nexport async function parseForm(request: Request): Promise<FormData>;\nexport async function parseForm<T>(request: Request, schema: ParseSchema<T>): Promise<T>;\nexport async function parseForm<T>(\n request: Request,\n schema?: ParseSchema<T>,\n): Promise<FormData | T> {\n const form = await request.formData();\n\n return schema === undefined ? form : schema.parse(form);\n}\n\n/**\n * Throws a route-level 404 control error.\n *\n * Use this from loaders, metadata, middleware, or route handlers when the matched route is valid but the requested resource is absent.\n */\nexport function notFound(): never {\n throw Object.assign(new Error(\"Not Found\"), {\n name: notFoundErrorName,\n status: 404,\n });\n}\n\n/**\n * Alias for `notFound()` for codebases that prefer an explicit throwing helper name.\n */\nexport function throwNotFound(): never {\n return notFound();\n}\n\n/**\n * Continues middleware processing without changing the request.\n */\nexport function next(): MiddlewareNext {\n return undefined;\n}\n\n/**\n * Creates an internal rewrite response consumed by app-router middleware.\n *\n * The target must be a same-origin route path, query, hash, or relative URL; protocol-relative, external, and control-character targets are rejected.\n */\nexport function rewrite(location: string, init: ResponseInit = {}): Response {\n if (!isSafeInternalRedirect(location)) {\n throwUnsafeRewrite(location);\n }\n\n const response = new Response(null, {\n ...init,\n status: init.status ?? 200,\n });\n\n Object.defineProperty(response, rewriteLocationSymbol, {\n configurable: false,\n enumerable: false,\n value: location,\n });\n\n return response;\n}\n\n/**\n * Creates a JSON response using the platform `Response.json()` implementation.\n */\nexport function json(value: unknown, init?: ResponseInit): Response {\n return Response.json(value, init);\n}\n\n/**\n * Creates an HTML response and defaults the content type to `text/html; charset=utf-8`.\n */\nexport function html(value: string, init: ResponseInit = {}): Response {\n if (init.headers === undefined) {\n return new Response(value, {\n ...init,\n headers: { \"content-type\": \"text/html; charset=utf-8\" },\n });\n }\n\n const headers = new Headers(init.headers);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n }\n\n return new Response(value, {\n ...init,\n headers,\n });\n}\n\n/**\n * Returns the request headers object for route code that follows app-router helper naming.\n */\nexport function headers(request: Request): Headers {\n return request.headers;\n}\n\nexport interface RequestCookies {\n entries(): IterableIterator<[string, string]>;\n get(name: string): string | undefined;\n has(name: string): boolean;\n}\n\n/**\n * Parses request cookies into a small read-only helper.\n *\n * Values are decoded with `decodeURIComponent`; malformed encoded values are ignored rather than throwing during request handling.\n */\nexport function cookies(request: Request): RequestCookies {\n let values: ReadonlyMap<string, string> | undefined;\n const cookieValues = () => {\n values ??= parseCookieHeader(request.headers.get(\"cookie\"));\n return values;\n };\n\n return {\n entries: () => cookieValues().entries(),\n get: (name) => cookieValues().get(name),\n has: (name) => cookieValues().has(name),\n };\n}\n\nexport function rewriteLocation(response: Response): string | undefined {\n const marked = (response as { [rewriteLocationSymbol]?: unknown })[rewriteLocationSymbol];\n const candidate = typeof marked === \"string\"\n ? marked\n : response.headers.get(rewriteHeaderName) ?? undefined;\n\n return candidate !== undefined && isSafeInternalRedirect(candidate) ? candidate : undefined;\n}\n\n/**\n * Checks whether an unknown error is an app-router redirect signal.\n */\nexport function isRedirectError(error: unknown): error is Error & { location: string; status: number } {\n return error instanceof Error &&\n error.name === redirectErrorName &&\n typeof (error as { location?: unknown }).location === \"string\";\n}\n\n/**\n * Checks whether an unknown error is an app-router not-found signal.\n */\nexport function isNotFoundError(error: unknown): boolean {\n return error instanceof Error && error.name === notFoundErrorName;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"preload-policy.js","sourceRoot":"","sources":["../src/preload-policy.ts"],"names":[],"mappings":"AAgCA,MAAM,UAAU,uCAAuC,CACrD,QAAqC,EACrC,cAAiD,KAAK;IAEtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAChD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrE,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,YAAY;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAqC,EACrC,cAAiD,KAAK;IAEtD,MAAM,UAAU,GAAG,uCAAuC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAElF,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,UAAU;YACb,oBAAoB,EAAE,KAAK;YAC3B,gBAAgB,EAAE,KAAK;YACvB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,UAAU;YACb,oBAAoB,EAAE,IAAI;YAC1B,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,KAAK,oBAAoB,CAAC;IAE7D,OAAO;QACL,GAAG,UAAU;QACb,oBAAoB,EAAE,CAAC,WAAW;QAClC,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE;QACpD,cAAc,EAAE;YACd,aAAa,EAAE,CAAC,WAAW;YAC3B,aAAa,EAAE,CAAC,WAAW;SAC5B;QACD,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC","sourcesContent":["import type {\n BuiltAppRuntimePreloadMode,\n BuiltAppRuntimePreloadStrategy,\n} from \"./serve.js\";\n\nexport type BuiltAppRuntimePreloadWait =\n | \"background\"\n | \"before-render\"\n | \"first-request\";\n\nexport type BuiltAppRuntimeDefaultPreloadMode = \"all\" | \"middleware\";\n\nexport type BuiltAppRuntimePreloadInput =\n | BuiltAppRuntimePreloadMode\n | (BuiltAppRuntimePreloadStrategy & {\n wait?: BuiltAppRuntimePreloadWait | undefined;\n })\n | undefined;\n\nexport type NormalizedBuiltAppRuntimePreloadStrategy = BuiltAppRuntimePreloadStrategy & {\n wait: BuiltAppRuntimePreloadWait;\n};\n\nexport interface BuiltAppRuntimePreloadArtifactPlan\n extends NormalizedBuiltAppRuntimePreloadStrategy {\n includeRenderModules: boolean;\n loadAllArtifacts: boolean;\n middlewareArtifacts?: { includeRender: boolean } | undefined;\n routeArtifacts?: { includeRender: boolean; includeShells: boolean } | undefined;\n shouldPreload: boolean;\n}\n\nexport function normalizeBuiltAppRuntimePreloadStrategy(\n strategy: BuiltAppRuntimePreloadInput,\n defaultMode: BuiltAppRuntimeDefaultPreloadMode = \"all\",\n): NormalizedBuiltAppRuntimePreloadStrategy {\n if (strategy === undefined) {\n return { mode: defaultMode, wait: \"background\" };\n }\n\n if (typeof strategy === \"string\") {\n return { mode: strategy, wait: \"background\" };\n }\n\n return {\n mode: strategy.mode,\n ...(strategy.routes === undefined ? {} : { routes: strategy.routes }),\n wait: strategy.wait ?? \"background\",\n };\n}\n\nexport function builtAppRuntimePreloadPlan(\n strategy: BuiltAppRuntimePreloadInput,\n defaultMode: BuiltAppRuntimeDefaultPreloadMode = \"all\",\n): BuiltAppRuntimePreloadArtifactPlan {\n const normalized = normalizeBuiltAppRuntimePreloadStrategy(strategy, defaultMode);\n\n if (normalized.mode === \"none\") {\n return {\n ...normalized,\n includeRenderModules: false,\n loadAllArtifacts: false,\n shouldPreload: false,\n };\n }\n\n if (normalized.mode === \"all\") {\n return {\n ...normalized,\n includeRenderModules: true,\n loadAllArtifacts: true,\n shouldPreload: true,\n };\n }\n\n const requestOnly = normalized.mode === \"hot-route-requests\";\n\n return {\n ...normalized,\n includeRenderModules: !requestOnly,\n loadAllArtifacts: false,\n middlewareArtifacts: { includeRender: !requestOnly },\n routeArtifacts: {\n includeRender: !requestOnly,\n includeShells: !requestOnly,\n },\n shouldPreload: true,\n };\n}\n"]}
1
+ {"version":3,"file":"preload-policy.js","sourceRoot":"","sources":["../src/preload-policy.ts"],"names":[],"mappings":"AAgCA,MAAM,UAAU,uCAAuC,CACrD,QAAqC,EACrC,WAAW,GAAsC,KAAK;IAEtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAChD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrE,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,YAAY;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAqC,EACrC,WAAW,GAAsC,KAAK;IAEtD,MAAM,UAAU,GAAG,uCAAuC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAElF,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,UAAU;YACb,oBAAoB,EAAE,KAAK;YAC3B,gBAAgB,EAAE,KAAK;YACvB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,UAAU;YACb,oBAAoB,EAAE,IAAI;YAC1B,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,KAAK,oBAAoB,CAAC;IAE7D,OAAO;QACL,GAAG,UAAU;QACb,oBAAoB,EAAE,CAAC,WAAW;QAClC,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE;QACpD,cAAc,EAAE;YACd,aAAa,EAAE,CAAC,WAAW;YAC3B,aAAa,EAAE,CAAC,WAAW;SAC5B;QACD,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC","sourcesContent":["import type {\n BuiltAppRuntimePreloadMode,\n BuiltAppRuntimePreloadStrategy,\n} from \"./serve.js\";\n\nexport type BuiltAppRuntimePreloadWait =\n | \"background\"\n | \"before-render\"\n | \"first-request\";\n\nexport type BuiltAppRuntimeDefaultPreloadMode = \"all\" | \"middleware\";\n\nexport type BuiltAppRuntimePreloadInput =\n | BuiltAppRuntimePreloadMode\n | (BuiltAppRuntimePreloadStrategy & {\n wait?: BuiltAppRuntimePreloadWait | undefined;\n })\n | undefined;\n\nexport type NormalizedBuiltAppRuntimePreloadStrategy = BuiltAppRuntimePreloadStrategy & {\n wait: BuiltAppRuntimePreloadWait;\n};\n\nexport interface BuiltAppRuntimePreloadArtifactPlan\n extends NormalizedBuiltAppRuntimePreloadStrategy {\n includeRenderModules: boolean;\n loadAllArtifacts: boolean;\n middlewareArtifacts?: { includeRender: boolean } | undefined;\n routeArtifacts?: { includeRender: boolean; includeShells: boolean } | undefined;\n shouldPreload: boolean;\n}\n\nexport function normalizeBuiltAppRuntimePreloadStrategy(\n strategy: BuiltAppRuntimePreloadInput,\n defaultMode: BuiltAppRuntimeDefaultPreloadMode = \"all\",\n): NormalizedBuiltAppRuntimePreloadStrategy {\n if (strategy === undefined) {\n return { mode: defaultMode, wait: \"background\" };\n }\n\n if (typeof strategy === \"string\") {\n return { mode: strategy, wait: \"background\" };\n }\n\n return {\n mode: strategy.mode,\n ...(strategy.routes === undefined ? {} : { routes: strategy.routes }),\n wait: strategy.wait ?? \"background\",\n };\n}\n\nexport function builtAppRuntimePreloadPlan(\n strategy: BuiltAppRuntimePreloadInput,\n defaultMode: BuiltAppRuntimeDefaultPreloadMode = \"all\",\n): BuiltAppRuntimePreloadArtifactPlan {\n const normalized = normalizeBuiltAppRuntimePreloadStrategy(strategy, defaultMode);\n\n if (normalized.mode === \"none\") {\n return {\n ...normalized,\n includeRenderModules: false,\n loadAllArtifacts: false,\n shouldPreload: false,\n };\n }\n\n if (normalized.mode === \"all\") {\n return {\n ...normalized,\n includeRenderModules: true,\n loadAllArtifacts: true,\n shouldPreload: true,\n };\n }\n\n const requestOnly = normalized.mode === \"hot-route-requests\";\n\n return {\n ...normalized,\n includeRenderModules: !requestOnly,\n loadAllArtifacts: false,\n middlewareArtifacts: { includeRender: !requestOnly },\n routeArtifacts: {\n includeRender: !requestOnly,\n includeShells: !requestOnly,\n },\n shouldPreload: true,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"prerender-store.js","sourceRoot":"","sources":["../src/prerender-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { BuiltPrerenderedRoute } from \"./build.js\";\nimport type { AppRouterPrerenderStore } from \"./serve.js\";\n\n/**\n * Configures the process-local prerender store used for cached prerendered routes.\n */\nexport interface MemoryPrerenderStoreOptions {\n backing?: Map<string, MemoryPrerenderStoreEntry>;\n maxEntries?: number;\n namespace?: string;\n now?: () => number;\n ttlMs?: number;\n}\n\nexport interface MemoryPrerenderStoreEntry {\n entry: BuiltPrerenderedRoute;\n expiresAt: number;\n lastAccessedAt: number;\n}\n\n/**\n * Configures a filesystem-backed prerender store.\n */\nexport interface FileSystemPrerenderStoreOptions {\n directory: string;\n lockPollMs?: number;\n lockTimeoutMs?: number;\n namespace?: string;\n}\n\n/**\n * Defines the adapter API used by key-value prerender stores.\n */\nexport interface KeyValuePrerenderStoreAdapter {\n delete(key: string): void | Promise<void>;\n get(key: string): string | undefined | Promise<string | undefined>;\n set(key: string, value: string, options?: { ttlMs?: number | undefined }): void | Promise<void>;\n withLock?<T>(key: string, task: (token: string) => Promise<T>): Promise<T>;\n}\n\n/**\n * Configures a key-value-backed prerender store.\n */\nexport interface KeyValuePrerenderStoreOptions {\n adapter: KeyValuePrerenderStoreAdapter;\n namespace?: string;\n ttlMs?: number;\n}\n\n/**\n * Creates an in-memory prerender store with optional TTL and LRU eviction.\n */\nexport function createMemoryPrerenderStore(\n options: MemoryPrerenderStoreOptions = {},\n): AppRouterPrerenderStore {\n const backing = options.backing ?? new Map<string, MemoryPrerenderStoreEntry>();\n const locks = new Map<string, Promise<void>>();\n const namespace = options.namespace ?? \"default\";\n const now = options.now ?? Date.now;\n const maxEntries = options.maxEntries ?? Number.POSITIVE_INFINITY;\n const ttlMs = options.ttlMs ?? Number.POSITIVE_INFINITY;\n\n return {\n delete(path) {\n backing.delete(storeKey(namespace, path));\n },\n get(path) {\n const key = storeKey(namespace, path);\n const current = backing.get(key);\n\n if (current === undefined) {\n return undefined;\n }\n\n if (current.expiresAt <= now()) {\n backing.delete(key);\n return undefined;\n }\n\n current.lastAccessedAt = now();\n return current.entry;\n },\n set(path, entry) {\n backing.set(storeKey(namespace, path), {\n entry,\n expiresAt: now() + ttlMs,\n lastAccessedAt: now(),\n });\n evictLeastRecentlyUsed(backing, namespace, maxEntries);\n },\n async withLock(path, task) {\n const key = storeKey(namespace, path);\n const previous = locks.get(key) ?? Promise.resolve();\n let release: () => void = () => undefined;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.then(() => current, () => current);\n locks.set(key, queued);\n\n await previous.catch(() => undefined);\n\n try {\n return await task();\n } finally {\n release();\n if (locks.get(key) === queued) {\n locks.delete(key);\n }\n }\n },\n };\n}\n\n/**\n * Creates a prerender store that persists entries as JSON files.\n */\nexport function createFileSystemPrerenderStore(\n options: FileSystemPrerenderStoreOptions,\n): AppRouterPrerenderStore {\n const namespace = options.namespace ?? \"default\";\n const lockPollMs = options.lockPollMs ?? 5;\n const lockTimeoutMs = options.lockTimeoutMs ?? 5_000;\n\n return {\n async delete(path) {\n await rm(filePath(options.directory, namespace, path), { force: true });\n },\n async get(path) {\n try {\n return JSON.parse(\n await readFile(filePath(options.directory, namespace, path), \"utf8\"),\n ) as BuiltPrerenderedRoute;\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return undefined;\n }\n\n throw error;\n }\n },\n async set(path, entry) {\n const target = filePath(options.directory, namespace, path);\n const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`;\n\n await mkdir(dirname(target), { recursive: true });\n await writeFile(temporary, JSON.stringify(entry), \"utf8\");\n await rename(temporary, target);\n },\n async withLock(path, task) {\n const lock = `${filePath(options.directory, namespace, path)}.lock`;\n const startedAt = Date.now();\n\n while (true) {\n try {\n await mkdir(lock, { recursive: false });\n break;\n } catch (error) {\n if (!isNodeError(error, \"EEXIST\")) {\n throw error;\n }\n\n if (Date.now() - startedAt > lockTimeoutMs) {\n throw new Error(`Timed out acquiring prerender lock for ${path}.`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, lockPollMs));\n }\n }\n\n try {\n return await task();\n } finally {\n await rm(lock, { force: true, recursive: true });\n }\n },\n };\n}\n\n/**\n * Creates a prerender store backed by a caller-provided key-value adapter.\n */\nexport function createKeyValuePrerenderStore(\n options: KeyValuePrerenderStoreOptions,\n): AppRouterPrerenderStore {\n const namespace = options.namespace ?? \"default\";\n const store: AppRouterPrerenderStore = {\n delete(path) {\n return options.adapter.delete(keyValueStoreKey(namespace, path));\n },\n async get(path) {\n const value = await options.adapter.get(keyValueStoreKey(namespace, path));\n\n return value === undefined ? undefined : JSON.parse(value) as BuiltPrerenderedRoute;\n },\n set(path, entry) {\n return options.adapter.set(\n keyValueStoreKey(namespace, path),\n JSON.stringify(entry),\n { ttlMs: options.ttlMs },\n );\n },\n };\n\n if (options.adapter.withLock !== undefined) {\n store.withLock = (path, task) =>\n options.adapter.withLock?.(keyValueStoreKey(namespace, path), async () => await task()) ??\n task();\n }\n\n return store;\n}\n\nfunction storeKey(namespace: string, path: string): string {\n return `${namespace}\\0${path}`;\n}\n\nfunction keyValueStoreKey(namespace: string, path: string): string {\n return `${namespace}:${path}`;\n}\n\nfunction filePath(directory: string, namespace: string, path: string): string {\n const digest = createHash(\"sha256\")\n .update(storeKey(namespace, path))\n .digest(\"hex\");\n\n return join(directory, namespace, `${digest}.json`);\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return error instanceof Error && (error as NodeJS.ErrnoException).code === code;\n}\n\nfunction evictLeastRecentlyUsed(\n backing: Map<string, MemoryPrerenderStoreEntry>,\n namespace: string,\n maxEntries: number,\n): void {\n if (!Number.isFinite(maxEntries) || maxEntries < 0) {\n return;\n }\n\n const prefix = `${namespace}\\0`;\n const entries = Array.from(backing.entries())\n .filter(([key]) => key.startsWith(prefix))\n .sort(([, left], [, right]) => left.lastAccessedAt - right.lastAccessedAt);\n\n for (const [key] of entries.slice(0, Math.max(0, entries.length - maxEntries))) {\n backing.delete(key);\n }\n}\n"]}
1
+ {"version":3,"file":"prerender-store.js","sourceRoot":"","sources":["../src/prerender-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { BuiltPrerenderedRoute } from \"./build.js\";\nimport type { AppRouterPrerenderStore } from \"./serve.js\";\n\n/**\n * Configures the process-local prerender store used for cached prerendered routes.\n */\nexport interface MemoryPrerenderStoreOptions {\n backing?: Map<string, MemoryPrerenderStoreEntry>;\n maxEntries?: number;\n namespace?: string;\n now?: () => number;\n ttlMs?: number;\n}\n\nexport interface MemoryPrerenderStoreEntry {\n entry: BuiltPrerenderedRoute;\n expiresAt: number;\n lastAccessedAt: number;\n}\n\n/**\n * Configures a filesystem-backed prerender store.\n */\nexport interface FileSystemPrerenderStoreOptions {\n directory: string;\n lockPollMs?: number;\n lockTimeoutMs?: number;\n namespace?: string;\n}\n\n/**\n * Defines the adapter API used by key-value prerender stores.\n */\nexport interface KeyValuePrerenderStoreAdapter {\n delete(key: string): void | Promise<void>;\n get(key: string): string | undefined | Promise<string | undefined>;\n set(key: string, value: string, options?: { ttlMs?: number | undefined }): void | Promise<void>;\n withLock?<T>(key: string, task: (token: string) => Promise<T>): Promise<T>;\n}\n\n/**\n * Configures a key-value-backed prerender store.\n */\nexport interface KeyValuePrerenderStoreOptions {\n adapter: KeyValuePrerenderStoreAdapter;\n namespace?: string;\n ttlMs?: number;\n}\n\n/**\n * Creates an in-memory prerender store with optional TTL and LRU eviction.\n */\nexport function createMemoryPrerenderStore(\n options: MemoryPrerenderStoreOptions = {},\n): AppRouterPrerenderStore {\n const backing = options.backing ?? new Map<string, MemoryPrerenderStoreEntry>();\n const locks = new Map<string, Promise<void>>();\n const namespace = options.namespace ?? \"default\";\n const now = options.now ?? Date.now;\n const maxEntries = options.maxEntries ?? Number.POSITIVE_INFINITY;\n const ttlMs = options.ttlMs ?? Number.POSITIVE_INFINITY;\n\n return {\n delete(path) {\n backing.delete(storeKey(namespace, path));\n },\n get(path) {\n const key = storeKey(namespace, path);\n const current = backing.get(key);\n\n if (current === undefined) {\n return undefined;\n }\n\n if (current.expiresAt <= now()) {\n backing.delete(key);\n return undefined;\n }\n\n current.lastAccessedAt = now();\n return current.entry;\n },\n set(path, entry) {\n backing.set(storeKey(namespace, path), {\n entry,\n expiresAt: now() + ttlMs,\n lastAccessedAt: now(),\n });\n evictLeastRecentlyUsed(backing, namespace, maxEntries);\n },\n async withLock(path, task) {\n const key = storeKey(namespace, path);\n const previous = locks.get(key) ?? Promise.resolve();\n let release: () => void = () => undefined;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.then(() => current, () => current);\n locks.set(key, queued);\n\n await previous.catch(() => undefined);\n\n try {\n return await task();\n } finally {\n release();\n if (locks.get(key) === queued) {\n locks.delete(key);\n }\n }\n },\n };\n}\n\n/**\n * Creates a prerender store that persists entries as JSON files.\n */\nexport function createFileSystemPrerenderStore(\n options: FileSystemPrerenderStoreOptions,\n): AppRouterPrerenderStore {\n const namespace = options.namespace ?? \"default\";\n const lockPollMs = options.lockPollMs ?? 5;\n const lockTimeoutMs = options.lockTimeoutMs ?? 5_000;\n\n return {\n async delete(path) {\n await rm(filePath(options.directory, namespace, path), { force: true });\n },\n async get(path) {\n try {\n return JSON.parse(\n await readFile(filePath(options.directory, namespace, path), \"utf8\"),\n ) as BuiltPrerenderedRoute;\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return undefined;\n }\n\n throw error;\n }\n },\n async set(path, entry) {\n const target = filePath(options.directory, namespace, path);\n const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`;\n\n await mkdir(dirname(target), { recursive: true });\n await writeFile(temporary, JSON.stringify(entry), \"utf8\");\n await rename(temporary, target);\n },\n async withLock(path, task) {\n const lock = `${filePath(options.directory, namespace, path)}.lock`;\n const startedAt = Date.now();\n\n while (true) {\n try {\n await mkdir(lock, { recursive: false });\n break;\n } catch (error) {\n if (!isNodeError(error, \"EEXIST\")) {\n throw error;\n }\n\n if (Date.now() - startedAt > lockTimeoutMs) {\n throw new Error(`Timed out acquiring prerender lock for ${path}.`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, lockPollMs));\n }\n }\n\n try {\n return await task();\n } finally {\n await rm(lock, { force: true, recursive: true });\n }\n },\n };\n}\n\n/**\n * Creates a prerender store backed by a caller-provided key-value adapter.\n */\nexport function createKeyValuePrerenderStore(\n options: KeyValuePrerenderStoreOptions,\n): AppRouterPrerenderStore {\n const namespace = options.namespace ?? \"default\";\n const store: AppRouterPrerenderStore = {\n delete(path) {\n return options.adapter.delete(keyValueStoreKey(namespace, path));\n },\n async get(path) {\n const value = await options.adapter.get(keyValueStoreKey(namespace, path));\n\n return value === undefined ? undefined : JSON.parse(value) as BuiltPrerenderedRoute;\n },\n set(path, entry) {\n return options.adapter.set(\n keyValueStoreKey(namespace, path),\n JSON.stringify(entry),\n { ttlMs: options.ttlMs },\n );\n },\n };\n\n if (options.adapter.withLock !== undefined) {\n store.withLock = (path, task) =>\n options.adapter.withLock?.(keyValueStoreKey(namespace, path), async () => await task()) ??\n task();\n }\n\n return store;\n}\n\nfunction storeKey(namespace: string, path: string): string {\n return `${namespace}\\0${path}`;\n}\n\nfunction keyValueStoreKey(namespace: string, path: string): string {\n return `${namespace}:${path}`;\n}\n\nfunction filePath(directory: string, namespace: string, path: string): string {\n const digest = createHash(\"sha256\")\n .update(storeKey(namespace, path))\n .digest(\"hex\");\n\n return join(directory, namespace, `${digest}.json`);\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return error instanceof Error && (error as NodeJS.ErrnoException).code === code;\n}\n\nfunction evictLeastRecentlyUsed(\n backing: Map<string, MemoryPrerenderStoreEntry>,\n namespace: string,\n maxEntries: number,\n): void {\n if (!Number.isFinite(maxEntries) || maxEntries < 0) {\n return;\n }\n\n const prefix = `${namespace}\\0`;\n const entries = Array.from(backing.entries())\n .filter(([key]) => key.startsWith(prefix))\n .sort(([, left], [, right]) => left.lastAccessedAt - right.lastAccessedAt);\n\n for (const [key] of entries.slice(0, Math.max(0, entries.length - maxEntries))) {\n backing.delete(key);\n }\n}\n"]}