From c584277c4b25030a18bde20b2bd5ebdd254e87ae Mon Sep 17 00:00:00 2001 From: Nyoxis Date: Fri, 17 Oct 2025 10:51:03 +0300 Subject: [PATCH 1/2] feat(multipart-parser): add ReadableStream support for multipart parts --- packages/multipart-parser/src/index.ts | 3 +- .../src/lib/multipart-request.test.ts | 39 +- .../src/lib/multipart-request.ts | 4 +- .../src/lib/multipart.node.test.ts | 34 +- .../src/lib/multipart.node.ts | 61 +- .../multipart-parser/src/lib/multipart.ts | 219 ++- packages/multipart-parser/src/node.ts | 3 +- pnpm-lock.yaml | 1630 +---------------- 8 files changed, 269 insertions(+), 1724 deletions(-) diff --git a/packages/multipart-parser/src/index.ts b/packages/multipart-parser/src/index.ts index 39f0b3eaebe..be1e3c1e793 100644 --- a/packages/multipart-parser/src/index.ts +++ b/packages/multipart-parser/src/index.ts @@ -6,7 +6,8 @@ export { parseMultipart, parseMultipartStream, MultipartParser, - MultipartPart, + BufferedMultipartPart, + StreamedMultipartPart } from './lib/multipart.ts' export { diff --git a/packages/multipart-parser/src/lib/multipart-request.test.ts b/packages/multipart-parser/src/lib/multipart-request.test.ts index 17a202fe165..f53e46796fc 100644 --- a/packages/multipart-parser/src/lib/multipart-request.test.ts +++ b/packages/multipart-parser/src/lib/multipart-request.test.ts @@ -3,7 +3,6 @@ import { describe, it } from 'node:test' import { createMultipartMessage, getRandomBytes } from '../../test/utils.ts' -import type { MultipartPart } from './multipart.ts' import { MultipartParseError, MaxHeaderSizeExceededError, @@ -82,7 +81,6 @@ describe('parseMultipartRequest', async () => { for await (let part of parseMultipartRequest(request)) { parts.push(part) } - assert.equal(parts.length, 0) }) @@ -97,10 +95,11 @@ describe('parseMultipartRequest', async () => { }), }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 1) assert.equal(parts[0].name, 'field1') @@ -119,11 +118,11 @@ describe('parseMultipartRequest', async () => { }), }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } - + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 2) assert.equal(parts[0].name, 'field1') assert.equal(parts[0].text, 'value1') @@ -142,10 +141,11 @@ describe('parseMultipartRequest', async () => { }), }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 1) assert.equal(parts[0].name, 'empty') @@ -167,10 +167,11 @@ describe('parseMultipartRequest', async () => { }), }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 1) assert.equal(parts[0].name, 'file1') @@ -196,10 +197,11 @@ describe('parseMultipartRequest', async () => { }), }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 3) assert.equal(parts[0].name, 'field1') @@ -229,13 +231,13 @@ describe('parseMultipartRequest', async () => { }), }) - let parts: { name?: string; filename?: string; mediaType?: string; content: Uint8Array }[] = [] + let parts: { name?: string; filename?: string; mediaType?: string; content: Promise }[] = [] for await (let part of parseMultipartRequest(request, { maxFileSize })) { parts.push({ name: part.name, filename: part.filename, mediaType: part.mediaType, - content: part.bytes, + content: part.toBuffered().then(b => b.bytes), }) } @@ -243,7 +245,7 @@ describe('parseMultipartRequest', async () => { assert.equal(parts[0].name, 'file1') assert.equal(parts[0].filename, 'random.dat') assert.equal(parts[0].mediaType, 'application/octet-stream') - assert.deepEqual(parts[0].content, content) + assert.deepEqual(await parts[0].content, content) }) it('throws when Content-Type is not multipart/form-data', async () => { @@ -331,10 +333,11 @@ describe('parseMultipartRequest', async () => { body: [`--${boundary}`, 'Invalid-Header', '', 'Some content', `--${boundary}--`].join(CRLF), }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 1) assert.equal(parts[0].headers.get('Invalid-Header'), null) diff --git a/packages/multipart-parser/src/lib/multipart-request.ts b/packages/multipart-parser/src/lib/multipart-request.ts index d69ec38c754..600272ae2af 100644 --- a/packages/multipart-parser/src/lib/multipart-request.ts +++ b/packages/multipart-parser/src/lib/multipart-request.ts @@ -1,4 +1,4 @@ -import type { MultipartParserOptions, MultipartPart } from './multipart.ts' +import type { MultipartParserOptions, StreamedMultipartPart } from './multipart.ts' import { MultipartParseError, parseMultipartStream } from './multipart.ts' /** @@ -34,7 +34,7 @@ export function isMultipartRequest(request: Request): boolean { export async function* parseMultipartRequest( request: Request, options?: MultipartParserOptions, -): AsyncGenerator { +): AsyncGenerator { if (!isMultipartRequest(request)) { throw new MultipartParseError('Request is not a multipart request') } diff --git a/packages/multipart-parser/src/lib/multipart.node.test.ts b/packages/multipart-parser/src/lib/multipart.node.test.ts index 310d294eae3..3f910561dea 100644 --- a/packages/multipart-parser/src/lib/multipart.node.test.ts +++ b/packages/multipart-parser/src/lib/multipart.node.test.ts @@ -1,11 +1,10 @@ import * as assert from 'node:assert/strict' import { describe, it } from 'node:test' -import { getRandomBytes } from '../../test/utils.ts' +import { createMultipartMessage, getRandomBytes } from '../../test/utils.ts' import { createMultipartRequest } from '../../test/utils.node.ts' -import type { MultipartPart } from './multipart.ts' -import { parseMultipartRequest } from './multipart.node.ts' +import { parseMultipartRequest, parseMultipart } from './multipart.node.ts' describe('parseMultipartRequest (node)', () => { let boundary = '----WebKitFormBoundaryzv5f5B2cY6tjQ0Rn' @@ -26,10 +25,11 @@ describe('parseMultipartRequest (node)', () => { field1: 'value1', }) - let parts: MultipartPart[] = [] + let buffering_parts = [] for await (let part of parseMultipartRequest(request)) { - parts.push(part) + buffering_parts.push(part.toBuffered()) } + let parts = await Promise.all(buffering_parts) assert.equal(parts.length, 1) assert.equal(parts[0].name, 'field1') @@ -47,13 +47,13 @@ describe('parseMultipartRequest (node)', () => { }, }) - let parts: { name?: string; filename?: string; mediaType?: string; content: Uint8Array }[] = [] + let parts: { name?: string; filename?: string; mediaType?: string; content: Promise }[] = [] for await (let part of parseMultipartRequest(request, { maxFileSize })) { parts.push({ name: part.name, filename: part.filename, mediaType: part.mediaType, - content: part.bytes, + content: part.toBuffered().then((b) => b.bytes), }) } @@ -61,6 +61,24 @@ describe('parseMultipartRequest (node)', () => { assert.equal(parts[0].name, 'file1') assert.equal(parts[0].filename, 'tesla.jpg') assert.equal(parts[0].mediaType, 'image/jpeg') - assert.deepEqual(parts[0].content, content) + assert.deepEqual(await parts[0].content, content) + }) + + it('parses multiple parts correctly', async () => { + let message = Buffer.from(createMultipartMessage(boundary, { + field1: 'value1', + field2: 'value2', + })) + + let parts = [] + for await (let part of parseMultipart(message, {boundary})) { + parts.push(part) + } + + assert.equal(parts.length, 2) + assert.equal(parts[0].name, 'field1') + assert.equal(parts[0].text, 'value1') + assert.equal(parts[1].name, 'field2') + assert.equal(parts[1].text, 'value2') }) }) diff --git a/packages/multipart-parser/src/lib/multipart.node.ts b/packages/multipart-parser/src/lib/multipart.node.ts index a90b6c65396..d3cdf67c65d 100644 --- a/packages/multipart-parser/src/lib/multipart.node.ts +++ b/packages/multipart-parser/src/lib/multipart.node.ts @@ -1,46 +1,83 @@ import type * as http from 'node:http' import { Readable } from 'node:stream' +import type { ReadableStream as NodeReadableStream } from 'node:stream/web' -import type { ParseMultipartOptions, MultipartParserOptions, MultipartPart } from './multipart.ts' +import type { + ParseMultipartOptions, + MultipartParserOptions, + BufferedMultipartPart, + StreamedMultipartPart as StreamedMultipartPartWeb +} from './multipart.ts' import { MultipartParseError, parseMultipart as parseMultipartWeb, parseMultipartStream as parseMultipartStreamWeb, + MultipartPart } from './multipart.ts' import { getMultipartBoundary } from './multipart-request.ts' +/** + * A part of a `multipart/*` HTTP message with content as Readable. + */ +export class StreamedMultipartPart extends MultipartPart { + #webMultipartPart: StreamedMultipartPartWeb + /** + * Readable of raw content of this part. + */ + readonly contentReadable: Readable + + constructor(webMultipartPart: StreamedMultipartPartWeb) { + super(webMultipartPart.rawHeader) + this.contentReadable = Readable.fromWeb(webMultipartPart.content as NodeReadableStream) + this.#webMultipartPart = webMultipartPart + } + async toBuffered(): Promise { + return this.#webMultipartPart.toBufferedFromIterator(this.contentReadable) + } + /** + * Signal end-of-stream + */ + finish() { + this.#webMultipartPart.finish() + } +} /** - * Parse a `multipart/*` Node.js `Buffer` and yield each part as a `MultipartPart` object. + * Parse a `multipart/*` Node.js `Buffer` and yield each part as a `BufferedMultipartPart` object. * * Note: This is a low-level API that requires manual handling of the content and boundary. If you're * building a web server, consider using `parseMultipartRequest(request)` instead. * * @param message The multipart message as a `Buffer` or an iterable of `Buffer` chunks * @param options Options for the parser - * @return A generator yielding `MultipartPart` objects + * @return A generator yielding `BufferedMultipartPart` objects */ -export function* parseMultipart( +export async function* parseMultipart( message: Buffer | Iterable, options: ParseMultipartOptions, -): Generator { +): AsyncGenerator { yield* parseMultipartWeb(message as Uint8Array | Iterable, options) } /** - * Parse a `multipart/*` Node.js `Readable` stream and yield each part as a `MultipartPart` object. + * Parse a `multipart/*` Node.js `Readable` stream and yield each part as a `StreamedMultipartPart` object. * * Note: This is a low-level API that requires manual handling of the stream and boundary. If you're * building a web server, consider using `parseMultipartRequest(request)` instead. * * @param stream A Node.js `Readable` stream containing multipart data * @param options Options for the parser - * @return An async generator yielding `MultipartPart` objects + * @return An async generator yielding `StreamedMultipartPart` objects */ export async function* parseMultipartStream( stream: Readable, options: ParseMultipartOptions, -): AsyncGenerator { - yield* parseMultipartStreamWeb(Readable.toWeb(stream) as ReadableStream, options) +): AsyncGenerator { + let asyncParser = parseMultipartStreamWeb(Readable.toWeb(stream) as ReadableStream, options) + while (true) { + let {value, done} = await asyncParser.next() + if (done) break + if (value) yield new StreamedMultipartPart(value) + } } /** @@ -55,16 +92,16 @@ export function isMultipartRequest(req: http.IncomingMessage): boolean { } /** - * Parse a multipart Node.js request and yield each part as a `MultipartPart` object. + * Parse a multipart Node.js request and yield each part as a `StreamedMultipartPart` object. * * @param req The Node.js `http.IncomingMessage` object containing multipart data * @param options Options for the parser - * @return An async generator yielding `MultipartPart` objects + * @return An async generator yielding `StreamedMultipartPart` objects */ export async function* parseMultipartRequest( req: http.IncomingMessage, options?: MultipartParserOptions, -): AsyncGenerator { +): AsyncGenerator { if (!isMultipartRequest(req)) { throw new MultipartParseError('Request is not a multipart request') } diff --git a/packages/multipart-parser/src/lib/multipart.ts b/packages/multipart-parser/src/lib/multipart.ts index ec3b4b5ec5a..ce317a9a99c 100644 --- a/packages/multipart-parser/src/lib/multipart.ts +++ b/packages/multipart-parser/src/lib/multipart.ts @@ -57,19 +57,19 @@ export interface ParseMultipartOptions { } /** - * Parse a `multipart/*` message from a buffer/iterable and yield each part as a `MultipartPart` object. + * Parse a `multipart/*` message from a buffer/iterable and yield each part as a `BufferedMultipartPart` object. * * Note: This is a low-level API that requires manual handling of the content and boundary. If you're * building a web server, consider using `parseMultipartRequest(request)` instead. * * @param message The multipart message as a `Uint8Array` or an iterable of `Uint8Array` chunks * @param options Options for the parser - * @return A generator that yields `MultipartPart` objects + * @return A generator that yields `BufferedMultipartPart` objects */ -export function* parseMultipart( +export async function* parseMultipart( message: Uint8Array | Iterable, options: ParseMultipartOptions, -): Generator { +): AsyncGenerator { let parser = new MultipartParser(options.boundary, { maxHeaderSize: options.maxHeaderSize, maxFileSize: options.maxFileSize, @@ -79,31 +79,46 @@ export function* parseMultipart( if (message.length === 0) { return // No data to parse } - - yield* parser.write(message) + yield* bufferMultipart(parser.write(message)) } else { for (let chunk of message) { - yield* parser.write(chunk) + yield* bufferMultipart(parser.write(chunk)) } } parser.finish() } +/** + * Simple Transformer that collects streamed data into buffered one + */ +async function* bufferMultipart( + asyncParser: AsyncGenerator , +): AsyncGenerator { + let {value, done} = await asyncParser.next() + while (!done) { + let next = asyncParser.next() + if (value) { + let [iterator, buffered] = await Promise.all([next, value.toBuffered()]); + ({value, done} = iterator) + yield buffered + } + } +} /** - * Parse a `multipart/*` message stream and yield each part as a `MultipartPart` object. + * Parse a `multipart/*` message stream and yield each part as a `StreamedMultipartPart` object. * * Note: This is a low-level API that requires manual handling of the content and boundary. If you're * building a web server, consider using `parseMultipartRequest(request)` instead. * * @param stream A stream containing multipart data as a `ReadableStream` * @param options Options for the parser - * @return An async generator that yields `MultipartPart` objects + * @return An async generator that yields `StreamedMultipartPart` objects */ export async function* parseMultipartStream( stream: ReadableStream, options: ParseMultipartOptions, -): AsyncGenerator { +): AsyncGenerator { let parser = new MultipartParser(options.boundary, { maxHeaderSize: options.maxHeaderSize, maxFileSize: options.maxFileSize, @@ -149,8 +164,7 @@ export class MultipartParser { #state = MultipartParserStateStart #buffer: Uint8Array | null = null - #currentPart: MultipartPart | null = null - #contentLength = 0 + #currentPart: StreamedMultipartPart | null = null constructor(boundary: string, options?: MultipartParserOptions) { this.boundary = boundary @@ -168,9 +182,9 @@ export class MultipartParser { * Write a chunk of data to the parser. * * @param chunk A chunk of data to write to the parser - * @return A generator yielding `MultipartPart` objects as they are parsed + * @return A generator yielding `StreamedMultipartPart` objects as they are parsed */ - *write(chunk: Uint8Array): Generator { + async *write(chunk: Uint8Array): AsyncGenerator { if (this.#state === MultipartParserStateDone) { throw new MultipartParseError('Unexpected data after end of stream') } @@ -201,18 +215,18 @@ export class MultipartParser { let partialTailIndex = this.#findPartialTailBoundary(chunk) if (partialTailIndex === -1) { - this.#append(index === 0 ? chunk : chunk.subarray(index)) + await this.#append(index === 0 ? chunk : chunk.subarray(index)) } else { - this.#append(chunk.subarray(index, partialTailIndex)) + await this.#append(chunk.subarray(index, partialTailIndex)) this.#buffer = chunk.subarray(partialTailIndex) } break } - this.#append(chunk.subarray(index, boundaryIndex)) + await this.#append(chunk.subarray(index, boundaryIndex)) - yield this.#currentPart! + this.#currentPart!.finish() index = boundaryIndex + this.#boundaryLength @@ -256,8 +270,7 @@ export class MultipartParser { throw new MaxHeaderSizeExceededError(this.maxHeaderSize) } - this.#currentPart = new MultipartPart(chunk.subarray(index, headerEndIndex), []) - this.#contentLength = 0 + yield this.#currentPart = new StreamedMultipartPart(chunk.subarray(index, headerEndIndex)) index = headerEndIndex + 4 // Skip header + \r\n\r\n @@ -283,13 +296,12 @@ export class MultipartParser { } } - #append(chunk: Uint8Array): void { - if (this.#contentLength + chunk.length > this.maxFileSize) { + async #append(chunk: Uint8Array): Promise { + if (this.#currentPart!.contentLength + chunk.length > this.maxFileSize) { throw new MaxFileSizeExceededError(this.maxFileSize) } - this.#currentPart!.content.push(chunk) - this.#contentLength += chunk.length + await this.#currentPart!.appendChunk(chunk) } /** @@ -310,43 +322,14 @@ export class MultipartParser { const decoder = new TextDecoder('utf-8', { fatal: true }) /** - * A part of a `multipart/*` HTTP message. + * A part of a `multipart/*` HTTP message without content. */ export class MultipartPart { - /** - * The raw content of this part as an array of `Uint8Array` chunks. - */ - readonly content: Uint8Array[] - - #header: Uint8Array + readonly rawHeader: Uint8Array #headers?: Headers - constructor(header: Uint8Array, content: Uint8Array[]) { - this.#header = header - this.content = content - } - - /** - * The content of this part as an `ArrayBuffer`. - */ - get arrayBuffer(): ArrayBuffer { - return this.bytes.buffer as ArrayBuffer - } - - /** - * The content of this part as a single `Uint8Array`. In `multipart/form-data` messages, this is useful - * for reading the value of files that were uploaded using `` fields. - */ - get bytes(): Uint8Array { - let buffer = new Uint8Array(this.size) - - let offset = 0 - for (let chunk of this.content) { - buffer.set(chunk, offset) - offset += chunk.length - } - - return buffer + constructor(header: Uint8Array) { + this.rawHeader = header } /** @@ -354,7 +337,7 @@ export class MultipartPart { */ get headers(): Headers { if (!this.#headers) { - this.#headers = new Headers(decoder.decode(this.#header)) + this.#headers = new Headers(decoder.decode(this.rawHeader)) } return this.#headers @@ -395,6 +378,126 @@ export class MultipartPart { return this.headers.contentDisposition.name } +} +/** + * A part of a `multipart/*` HTTP message with content as ReadableStream. + */ +export class StreamedMultipartPart extends MultipartPart { + #controller: ReadableStreamDefaultController | null = null + #continue: (() => void) | null = null; + #contentLength = 0 + /** + * ReadableStream of raw content of this part. + */ + readonly content: ReadableStream + + + constructor(rawHeader: Uint8Array) { + super(rawHeader); + this.content = new ReadableStream({ + start: (controller) => { + // Save controller so we can enqueue chunks later + this.#controller = controller + }, + pull: () => { + if (this.#continue) { + this.#continue(); + this.#continue = null; + } + } + }) + } + /** + * Expected length of full-length streamed content + */ + get contentLength(): number { + return this.#contentLength + } + /** + * Appends chunk to the stream + */ + async appendChunk(chunk: Uint8Array) { + if (!this.#controller) { + throw new MultipartParseError('Cannot enqueue in part content stream'); + } + while (this.#controller.desiredSize && this.#controller.desiredSize <= 0) { + await new Promise((resolve) => { + this.#continue = () => resolve(true); + }); + } + this.#controller.enqueue(chunk) + this.#contentLength += chunk.length + } + /** + * Signal end-of-stream + */ + finish() { + if (this.#controller) { + this.#controller.close() + } + } + /** + * Consumes stream of content into buffered content, + * that could be used to create Blob + * + * Note: This will throw if strem is started thus buffered can't be complete + * check if content is consumed + */ + async toBuffered(): Promise { + return this.toBufferedFromIterator(readStream(this.content)) + } + /** + * Bufferization abstraction for Node compatibility + */ + async toBufferedFromIterator(iterator: AsyncIterable): Promise { + let chunks: Uint8Array[] = []; + for await (let value of iterator) { + this.#contentLength -= value.length + if (value) chunks.push(value); + } + if (this.#contentLength !== 0) { + throw new MultipartParseError("Streaming part content is disturbed and buffer cannot be complete") + } + + return new BufferedMultipartPart(this.rawHeader, chunks); + } +} +/** + * A part of a `multipart/*` HTTP message with buffered content. + */ +export class BufferedMultipartPart extends MultipartPart { + /** + * The raw content of this part as an array of `Uint8Array` chunks. + */ + readonly content: Uint8Array[] + + constructor(rawHeader: Uint8Array, content: Uint8Array[]) { + super(rawHeader); + this.content = content; + } + /** + * The content of this part as an `ArrayBuffer`. + */ + get arrayBuffer(): ArrayBuffer { + return this.bytes.buffer as ArrayBuffer + } + + /** + * The content of this part as a single `Uint8Array`. In `multipart/form-data` messages, this is useful + * for reading the value of files that were uploaded using `` fields. + */ + get bytes(): Uint8Array { + let buffer = new Uint8Array(this.size) + + let offset = 0 + for (let chunk of this.content) { + buffer.set(chunk, offset) + offset += chunk.length + } + + return buffer + } + /** * The size of the content in bytes. */ diff --git a/packages/multipart-parser/src/node.ts b/packages/multipart-parser/src/node.ts index 556c39e0a83..74b7742f969 100644 --- a/packages/multipart-parser/src/node.ts +++ b/packages/multipart-parser/src/node.ts @@ -5,7 +5,8 @@ export { MaxHeaderSizeExceededError, MaxFileSizeExceededError, MultipartParser, - MultipartPart, + StreamedMultipartPart, + BufferedMultipartPart } from './lib/multipart.ts' export { getMultipartBoundary } from './lib/multipart-request.ts' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 544cca22c87..741655f61ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,123 +27,6 @@ importers: specifier: ^8.40.0 version: 8.40.0(eslint@9.33.0)(typescript@5.7.2) - demos/bookstore: - dependencies: - '@remix-run/dom': - specifier: jam - version: 0.0.0-experimental-remix-jam.6 - '@remix-run/events': - specifier: jam - version: 0.0.0-experimental-remix-jam.5 - '@remix-run/fetch-router': - specifier: workspace:* - version: link:../../packages/fetch-router - '@remix-run/file-storage': - specifier: workspace:* - version: link:../../packages/file-storage - '@remix-run/headers': - specifier: workspace:* - version: link:../../packages/headers - '@remix-run/lazy-file': - specifier: workspace:* - version: link:../../packages/lazy-file - '@remix-run/node-fetch-server': - specifier: workspace:* - version: link:../../packages/node-fetch-server - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - tsx: - specifier: ^4.20.6 - version: 4.20.6 - - packages/fetch-proxy: - dependencies: - '@remix-run/headers': - specifier: workspace:^ - version: link:../headers - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/fetch-router: - dependencies: - '@remix-run/form-data-parser': - specifier: workspace:* - version: link:../form-data-parser - '@remix-run/headers': - specifier: workspace:* - version: link:../headers - '@remix-run/route-pattern': - specifier: workspace:* - version: link:../route-pattern - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/file-storage: - dependencies: - '@remix-run/lazy-file': - specifier: workspace:^ - version: link:../lazy-file - devDependencies: - '@remix-run/form-data-parser': - specifier: workspace:^ - version: link:../form-data-parser - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/form-data-parser: - dependencies: - '@remix-run/multipart-parser': - specifier: workspace:^ - version: link:../multipart-parser - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/form-data-parser/demos/node: - dependencies: - '@remix-run/file-storage': - specifier: workspace:* - version: link:../../../file-storage - '@remix-run/form-data-parser': - specifier: workspace:* - version: link:../.. - '@remix-run/multipart-parser': - specifier: workspace:* - version: link:../../../multipart-parser - '@remix-run/node-fetch-server': - specifier: workspace:* - version: link:../../../node-fetch-server - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - typescript: - specifier: ^5.7.2 - version: 5.7.2 - packages/headers: devDependencies: '@types/node': @@ -153,19 +36,6 @@ importers: specifier: ^0.25.10 version: 0.25.10 - packages/lazy-file: - dependencies: - mrmime: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - packages/multipart-parser: dependencies: '@remix-run/headers': @@ -271,130 +141,8 @@ importers: specifier: ^5.7.2 version: 5.7.2 - packages/node-fetch-server: - devDependencies: - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/node-fetch-server/bench: - dependencies: - '@remix-run/node-fetch-server': - specifier: workspace:* - version: link:.. - express: - specifier: ^4.19.2 - version: 4.19.2 - devDependencies: - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 - - packages/node-fetch-server/demos/http2: - dependencies: - '@remix-run/node-fetch-server': - specifier: workspace:* - version: link:../.. - - packages/route-pattern: - devDependencies: - '@ark/attest': - specifier: ^0.49.0 - version: 0.49.0(typescript@5.7.2) - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/route-pattern/bench: - dependencies: - '@remix-run/route-pattern': - specifier: workspace:* - version: link:.. - find-my-way: - specifier: ^9.1.0 - version: 9.3.0 - path-to-regexp: - specifier: ^8.2.0 - version: 8.3.0 - - packages/tar-parser: - devDependencies: - '@remix-run/lazy-file': - specifier: workspace:^ - version: link:../lazy-file - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - esbuild: - specifier: ^0.25.10 - version: 0.25.10 - - packages/tar-parser/bench: - dependencies: - '@remix-run/lazy-file': - specifier: workspace:* - version: link:../../lazy-file - '@remix-run/tar-parser': - specifier: workspace:* - version: link:.. - gunzip-maybe: - specifier: ^1.4.2 - version: 1.4.2 - tar: - specifier: ^7.4.3 - version: 7.4.3 - tar-stream: - specifier: ^3.1.7 - version: 3.1.7 - devDependencies: - '@types/gunzip-maybe': - specifier: ^1.4.2 - version: 1.4.2 - '@types/tar': - specifier: ^6.1.13 - version: 6.1.13 - '@types/tar-stream': - specifier: ^3.1.3 - version: 3.1.3 - - scripts: - dependencies: - '@octokit/request': - specifier: ^9.1.3 - version: 9.1.3 - '@types/node': - specifier: ^24.6.0 - version: 24.6.0 - '@types/semver': - specifier: ^7.5.8 - version: 7.5.8 - semver: - specifier: ^7.6.3 - version: 7.6.3 - packages: - '@ark/attest@0.49.0': - resolution: {integrity: sha512-LYAJe4iwgA4GY+WLcSZ2ObTgr7F9lSwoQm4hR+B5ko0TfB3gqolXv04hA+7UtoP5HrGR1lVS+0DdwtWNnaSGnQ==} - hasBin: true - peerDependencies: - typescript: '*' - - '@ark/fs@0.49.0': - resolution: {integrity: sha512-AEjAQS/bu1CGIRiKK/XLaQ73cSJHixfexq28wNt+kBpQ0h1RwVIVzaGsn/+5IWw6DEbR7LB+3hil5gzrzEeyZQ==} - - '@ark/schema@0.49.0': - resolution: {integrity: sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw==} - - '@ark/util@0.49.0': - resolution: {integrity: sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==} - '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -924,14 +672,6 @@ packages: cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -954,102 +694,24 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@octokit/endpoint@10.1.1': - resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} - engines: {node: '>= 18'} - - '@octokit/openapi-types@22.2.0': - resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} - - '@octokit/request-error@6.1.5': - resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} - engines: {node: '>= 18'} - - '@octokit/request@9.1.3': - resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} - engines: {node: '>= 18'} - - '@octokit/types@13.6.2': - resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@prettier/sync@0.5.5': - resolution: {integrity: sha512-6BMtNr7aQhyNcGzmumkL0tgr1YQGfm9d7ZdmRpWqWuqpc9vZBind4xMe5NMiRECOhjuSiWHfBWLBnXkpeE90bw==} - peerDependencies: - prettier: '*' - - '@remix-run/dom@0.0.0-experimental-remix-jam.6': - resolution: {integrity: sha512-eQguiFB+Qm0EAA1xK1jLew2M9jp2rGcN+tknPv9gQd5nhT+eetwt3BHaYt9UcJWd3+p0g0cBt23CJrQOK2WStQ==} - - '@remix-run/events@0.0.0-experimental-remix-jam.5': - resolution: {integrity: sha512-rbKP27/YkLZq0gbCy3QpwaHQzJg41IgbC//8SggPgMtWxZdxkcnkWmQGMLH0xwQcBlZ3yLtZRDQvL+ir4GAA6g==} - - '@remix-run/style@0.0.0-experimental-remix-jam.5': - resolution: {integrity: sha512-XXCOWiY6lGqeJrGQ47JP5fFFuZXbBsFjBbTu46FNxsox1cny8ZPyZ7C674kX92UimGpOU+zv/lPOoU+ZWGim+w==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - '@types/bun@1.1.8': resolution: {integrity: sha512-PIwVFQKPviksiibobyvcWtMvMFMTj91T8dQEh9l1P3Ypr3ZuVn9w7HSr+5mTNrPqD1xpdDLEErzZPU8gqHBu6g==} '@types/busboy@1.5.4': resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.5': - resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/gunzip-maybe@1.4.2': - resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/node@20.12.14': resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} '@types/node@24.6.0': resolution: {integrity: sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - - '@types/tar-stream@3.1.3': - resolution: {integrity: sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==} - - '@types/tar@6.1.13': - resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} - '@types/tmp@0.2.6': resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} @@ -1115,19 +777,6 @@ packages: resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/analyze-trace@0.10.1': - resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} - hasBin: true - - '@typescript/vfs@1.6.1': - resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} - peerDependencies: - typescript: '*' - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1150,50 +799,22 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arktype@2.1.22: - resolution: {integrity: sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ==} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} - blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -1204,12 +825,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bun-types@1.1.26: resolution: {integrity: sha512-n7jDe62LsB2+WE8Q8/mT3azkPaatKlj/2MyP6hi3mKvPz9oPpB6JW/Ll6JHtNLudasFFuvfgklYSE+rreGvBjw==} @@ -1217,14 +832,6 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1233,13 +840,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1257,32 +857,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cross-spawn@7.0.5: - resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1290,14 +868,6 @@ packages: data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1310,55 +880,13 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - esbuild@0.25.10: resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} @@ -1369,13 +897,6 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1426,34 +947,16 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - exsolve@1.0.5: resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} - fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -1464,9 +967,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1478,14 +978,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - - find-my-way@9.3.0: - resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==} - engines: {node: '>=20'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1497,34 +989,11 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} @@ -1542,58 +1011,24 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -1603,48 +1038,24 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1658,15 +1069,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - jsonstream-next@3.0.0: - resolution: {integrity: sha512-aAi6oPhdt7BKyQn1SrIIGZBt0ukKuOUE1qV6kJ3GgioSOYzsRc8z9Hfr1BVmacA/jLe9nARfmgMGgn68BqIAgg==} - engines: {node: '>=10'} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1681,44 +1083,14 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - make-synchronized@0.4.2: - resolution: {integrity: sha512-EwEJSg8gSGLicKXp/VzNi1tvzhdmNBxOzslkkJSoNUCQFZKH/NIUIp7xlfN+noaHrz4BJDN73gne8IHnjl/F/A==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -1736,30 +1108,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} - engines: {node: '>= 18'} - - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1773,24 +1121,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1803,20 +1136,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1825,25 +1148,12 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -1857,60 +1167,16 @@ packages: engines: {node: '>=14'} hasBin: true - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} - hasBin: true - printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -1922,53 +1188,18 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - ret@0.5.0: - resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} - engines: {node: '>=10'} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex2@5.0.0: - resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1981,14 +1212,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -1996,49 +1219,17 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.20.1: - resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2047,22 +1238,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} - - text-decoder@1.2.1: - resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} - - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -2071,14 +1246,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -2097,10 +1264,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - typescript-eslint@8.40.0: resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2129,27 +1292,9 @@ packages: unenv@2.0.0-rc.17: resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} - universal-user-agent@7.0.2: - resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2174,17 +1319,6 @@ packages: '@cloudflare/workers-types': optional: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -2197,26 +1331,6 @@ packages: utf-8-validate: optional: true - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2229,27 +1343,6 @@ packages: snapshots: - '@ark/attest@0.49.0(typescript@5.7.2)': - dependencies: - '@ark/fs': 0.49.0 - '@ark/util': 0.49.0 - '@prettier/sync': 0.5.5(prettier@3.5.3) - '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(typescript@5.7.2) - arktype: 2.1.22 - prettier: 3.5.3 - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - '@ark/fs@0.49.0': {} - - '@ark/schema@0.49.0': - dependencies: - '@ark/util': 0.49.0 - - '@ark/util@0.49.0': {} - '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 @@ -2575,19 +1668,6 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.0': {} @@ -2609,50 +1689,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@octokit/endpoint@10.1.1': - dependencies: - '@octokit/types': 13.6.2 - universal-user-agent: 7.0.2 - - '@octokit/openapi-types@22.2.0': {} - - '@octokit/request-error@6.1.5': - dependencies: - '@octokit/types': 13.6.2 - - '@octokit/request@9.1.3': - dependencies: - '@octokit/endpoint': 10.1.1 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.2 - universal-user-agent: 7.0.2 - - '@octokit/types@13.6.2': - dependencies: - '@octokit/openapi-types': 22.2.0 - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@prettier/sync@0.5.5(prettier@3.5.3)': - dependencies: - make-synchronized: 0.4.2 - prettier: 3.5.3 - - '@remix-run/dom@0.0.0-experimental-remix-jam.6': - dependencies: - '@remix-run/events': 0.0.0-experimental-remix-jam.5 - '@remix-run/style': 0.0.0-experimental-remix-jam.5 - - '@remix-run/events@0.0.0-experimental-remix-jam.5': {} - - '@remix-run/style@0.0.0-experimental-remix-jam.5': {} - - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 24.6.0 - '@types/bun@1.1.8': dependencies: bun-types: 1.1.26 @@ -2661,36 +1697,10 @@ snapshots: dependencies: '@types/node': 24.6.0 - '@types/connect@3.4.38': - dependencies: - '@types/node': 24.6.0 - '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.5': - dependencies: - '@types/node': 24.6.0 - '@types/qs': 6.9.15 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.5 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 - - '@types/gunzip-maybe@1.4.2': - dependencies: - '@types/node': 24.6.0 - - '@types/http-errors@2.0.4': {} - '@types/json-schema@7.0.15': {} - '@types/mime@1.3.5': {} - '@types/node@20.12.14': dependencies: undici-types: 5.26.5 @@ -2699,32 +1709,6 @@ snapshots: dependencies: undici-types: 7.13.0 - '@types/qs@6.9.15': {} - - '@types/range-parser@1.2.7': {} - - '@types/semver@7.5.8': {} - - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 24.6.0 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 24.6.0 - '@types/send': 0.17.4 - - '@types/tar-stream@3.1.3': - dependencies: - '@types/node': 24.6.0 - - '@types/tar@6.1.13': - dependencies: - '@types/node': 24.6.0 - minipass: 4.2.8 - '@types/tmp@0.2.6': {} '@types/ws@8.5.12': @@ -2824,29 +1808,6 @@ snapshots: '@typescript-eslint/types': 8.40.0 eslint-visitor-keys: 4.2.1 - '@typescript/analyze-trace@0.10.1': - dependencies: - chalk: 4.1.2 - exit: 0.1.2 - jsonparse: 1.3.1 - jsonstream-next: 3.0.0 - p-limit: 3.1.0 - split2: 3.2.2 - treeify: 1.1.0 - yargs: 16.2.0 - - '@typescript/vfs@1.6.1(typescript@5.7.2)': - dependencies: - debug: 4.4.1 - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -2864,55 +1825,20 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - argparse@2.0.1: {} - arktype@2.1.22: - dependencies: - '@ark/schema': 0.49.0 - '@ark/util': 0.49.0 - - array-flatten@1.1.1: {} - as-table@1.0.55: dependencies: printable-characters: 1.0.42 - b4a@1.6.7: {} - balanced-match@1.0.2: {} - bare-events@2.5.0: - optional: true - blake3-wasm@2.1.5: {} - body-parser@1.20.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -2926,12 +1852,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - - buffer-from@1.1.2: {} - bun-types@1.1.26: dependencies: '@types/node': 20.12.14 @@ -2941,16 +1861,6 @@ snapshots: dependencies: streamsearch: 1.1.0 - bytes@3.1.2: {} - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - callsites@3.1.0: {} chalk@4.1.2: @@ -2958,14 +1868,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chownr@3.0.0: {} - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2984,26 +1886,8 @@ snapshots: concat-map@0.0.1: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.0.6: {} - - cookie@0.6.0: {} - cookie@0.7.2: {} - core-util-is@1.0.3: {} - - cross-spawn@7.0.5: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3012,57 +1896,16 @@ snapshots: data-uri-to-buffer@2.0.2: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@4.4.1: dependencies: ms: 2.1.3 deep-is@0.1.4: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - defu@6.1.4: {} - depd@2.0.0: {} - - destroy@1.2.0: {} - detect-libc@2.0.4: {} - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - - eastasianwidth@0.2.0: {} - - ee-first@1.1.1: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encodeurl@1.0.2: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - esbuild@0.25.10: optionalDependencies: '@esbuild/aix-ppc64': 0.25.10 @@ -3120,10 +1963,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 - escalade@3.2.0: {} - - escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} eslint-plugin-prefer-let@4.0.0: @@ -3197,56 +2036,12 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} - exit-hook@2.2.1: {} - exit@0.1.2: {} - - express@4.19.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - exsolve@1.0.5: {} - fast-decode-uri-component@1.0.1: {} - fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3259,10 +2054,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-querystring@1.1.2: - dependencies: - fast-decode-uri-component: 1.0.1 - fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -3275,24 +2066,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-my-way@9.3.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-querystring: 1.1.2 - safe-regex2: 5.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -3305,30 +2078,9 @@ snapshots: flatted@3.3.3: {} - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.5 - signal-exit: 4.1.0 - - forwarded@0.2.0: {} - - fresh@0.5.2: {} - fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-source@2.0.12: dependencies: data-uri-to-buffer: 2.0.2 @@ -3348,58 +2100,12 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - globals@14.0.0: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - graphemer@1.4.0: {} - gunzip-maybe@1.4.2: - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.2: {} ignore@7.0.5: {} @@ -3411,36 +2117,18 @@ snapshots: imurmurhash@0.1.4: {} - inherits@2.0.4: {} - - ipaddr.js@1.9.1: {} - is-arrayish@0.3.2: {} - is-deflate@1.0.0: {} - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-gzip@1.0.0: {} - is-number@7.0.0: {} - isarray@1.0.0: {} - isexe@2.0.0: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -3451,13 +2139,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jsonparse@1.3.1: {} - - jsonstream-next@3.0.0: - dependencies: - jsonparse: 1.3.1 - through2: 4.0.2 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -3473,31 +2154,13 @@ snapshots: lodash.merge@4.6.2: {} - lru-cache@10.4.3: {} - - make-synchronized@0.4.2: {} - - media-typer@0.3.0: {} - - merge-descriptors@1.0.1: {} - merge2@1.4.1: {} - methods@1.1.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - mime@3.0.0: {} miniflare@4.20250604.1: @@ -3526,21 +2189,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minipass@4.2.8: {} - - minipass@7.1.2: {} - - minizlib@3.0.1: - dependencies: - minipass: 7.1.2 - rimraf: 5.0.10 - - mkdirp@3.0.1: {} - - mrmime@2.0.0: {} - - ms@2.0.0: {} - ms@2.1.3: {} multipasta@0.2.5: {} @@ -3549,20 +2197,8 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: {} - - object-inspect@1.13.2: {} - ohash@2.0.11: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -3580,172 +2216,44 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} - - pako@0.2.9: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 - parseurl@1.3.3: {} - path-exists@4.0.0: {} path-key@3.1.1: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@0.1.7: {} - path-to-regexp@6.3.0: {} - path-to-regexp@8.3.0: {} - pathe@2.0.3: {} - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - picomatch@2.3.1: {} prelude-ls@1.2.1: {} prettier@3.3.3: {} - prettier@3.5.3: {} - printable-characters@1.0.42: {} - process-nextick-args@2.0.1: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - pump@2.0.1: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - punycode@2.3.1: {} - qs@6.11.0: - dependencies: - side-channel: 1.0.6 - queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - require-directory@2.1.1: {} - requireindex@1.2.0: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - ret@0.5.0: {} - reusify@1.1.0: {} - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safe-regex2@5.0.0: - dependencies: - ret: 0.5.0 - - safer-buffer@2.1.2: {} - semver@7.6.3: {} - send@0.18.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serve-static@1.15.0: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - setprototypeof@1.2.0: {} - sharp@0.33.5: dependencies: color: 4.2.3 @@ -3778,112 +2286,33 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - - signal-exit@4.1.0: {} - simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 source-map@0.6.1: {} - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 - stacktracey@2.1.8: dependencies: as-table: 1.0.55 get-source: 2.0.12 - statuses@2.0.1: {} - stoppable@1.1.0: {} - stream-shift@1.0.3: {} - streamsearch@1.1.0: {} - streamx@2.20.1: - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.1 - optionalDependencies: - bare-events: 2.5.0 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-json-comments@3.1.1: {} supports-color@7.2.0: dependencies: has-flag: 4.0.0 - tar-stream@3.1.7: - dependencies: - b4a: 1.6.7 - fast-fifo: 1.3.2 - streamx: 2.20.1 - - tar@7.4.3: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 - yallist: 5.0.0 - - text-decoder@1.2.1: {} - - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 - tmp@0.2.3: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - - treeify@1.1.0: {} - ts-api-utils@2.1.0(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -3902,11 +2331,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - typescript-eslint@8.40.0(eslint@9.33.0)(typescript@5.7.2): dependencies: '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0)(typescript@5.7.2))(eslint@9.33.0)(typescript@5.7.2) @@ -3938,20 +2362,10 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 - universal-user-agent@7.0.2: {} - - unpipe@1.0.0: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 - util-deprecate@1.0.2: {} - - utils-merge@1.0.1: {} - - vary@1.1.2: {} - which@2.0.2: dependencies: isexe: 2.0.0 @@ -3983,40 +2397,8 @@ snapshots: - bufferutil - utf-8-validate - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - ws@8.18.0: {} - xtend@4.0.2: {} - - y18n@5.0.8: {} - - yallist@5.0.0: {} - - yargs-parser@20.2.9: {} - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yocto-queue@0.1.0: {} youch@3.3.4: From 9cea56dcdc7596f706248e8492d9361282b4e20c Mon Sep 17 00:00:00 2001 From: Nyoxis Date: Sun, 19 Oct 2025 23:04:10 +0300 Subject: [PATCH 2/2] fix: prevent throwing error when stream is dropped or closed --- packages/multipart-parser/src/lib/multipart.node.ts | 12 +++++++++--- packages/multipart-parser/src/lib/multipart.ts | 12 ++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/multipart-parser/src/lib/multipart.node.ts b/packages/multipart-parser/src/lib/multipart.node.ts index d3cdf67c65d..6430a4c4ab2 100644 --- a/packages/multipart-parser/src/lib/multipart.node.ts +++ b/packages/multipart-parser/src/lib/multipart.node.ts @@ -30,15 +30,21 @@ export class StreamedMultipartPart extends MultipartPart { this.contentReadable = Readable.fromWeb(webMultipartPart.content as NodeReadableStream) this.#webMultipartPart = webMultipartPart } - + /** + * Consumes stream of content into buffered content, + * that could be used to create Blob + * + * Note: This will throw if stream is started thus buffered can't be complete + * check if content is consumed + */ async toBuffered(): Promise { return this.#webMultipartPart.toBufferedFromIterator(this.contentReadable) } /** * Signal end-of-stream */ - finish() { - this.#webMultipartPart.finish() + close() { + this.#webMultipartPart.close() } } /** diff --git a/packages/multipart-parser/src/lib/multipart.ts b/packages/multipart-parser/src/lib/multipart.ts index ce317a9a99c..1cf89f2f7e8 100644 --- a/packages/multipart-parser/src/lib/multipart.ts +++ b/packages/multipart-parser/src/lib/multipart.ts @@ -226,7 +226,7 @@ export class MultipartParser { await this.#append(chunk.subarray(index, boundaryIndex)) - this.#currentPart!.finish() + this.#currentPart!.close() index = boundaryIndex + this.#boundaryLength @@ -417,10 +417,10 @@ export class StreamedMultipartPart extends MultipartPart { * Appends chunk to the stream */ async appendChunk(chunk: Uint8Array) { - if (!this.#controller) { - throw new MultipartParseError('Cannot enqueue in part content stream'); + if (!this.#controller || !this.#controller.desiredSize) { + return // skip appending chunks if stream is closed or dropped } - while (this.#controller.desiredSize && this.#controller.desiredSize <= 0) { + while (this.#controller.desiredSize <= 0) { await new Promise((resolve) => { this.#continue = () => resolve(true); }); @@ -431,7 +431,7 @@ export class StreamedMultipartPart extends MultipartPart { /** * Signal end-of-stream */ - finish() { + close() { if (this.#controller) { this.#controller.close() } @@ -440,7 +440,7 @@ export class StreamedMultipartPart extends MultipartPart { * Consumes stream of content into buffered content, * that could be used to create Blob * - * Note: This will throw if strem is started thus buffered can't be complete + * Note: This will throw if stream is started thus buffered can't be complete * check if content is consumed */ async toBuffered(): Promise {