From 20eb627b892ca132ea24e2c0fa7b841b5017f87a Mon Sep 17 00:00:00 2001 From: Caitlin Pinn Date: Tue, 18 Nov 2025 17:19:14 -0800 Subject: [PATCH] upgrade typescript --- packages/proxy/package.json | 4 +- packages/proxy/scripts/sync_models.ts | 9 +- packages/proxy/src/PrometheusSerializer.ts | 27 +-- packages/proxy/src/providers/google.test.ts | 12 +- packages/proxy/src/proxy.ts | 72 +++++--- packages/proxy/src/util.ts | 1 + packages/proxy/tsconfig.json | 7 +- packages/proxy/utils/audioEncoder.ts | 14 +- packages/proxy/utils/encrypt.ts | 3 +- packages/proxy/utils/tempCredentials.ts | 5 +- packages/proxy/utils/tests.ts | 6 +- pnpm-lock.yaml | 193 ++++++++++---------- 12 files changed, 201 insertions(+), 152 deletions(-) diff --git a/packages/proxy/package.json b/packages/proxy/package.json index 19a599df..db99edb1 100644 --- a/packages/proxy/package.json +++ b/packages/proxy/package.json @@ -83,7 +83,7 @@ "devDependencies": { "@types/content-disposition": "^0.5.8", "@types/jsonwebtoken": "^9.0.7", - "@types/node": "^20.10.5", + "@types/node": "^20.17.0", "@types/uuid": "^9.0.7", "@types/yargs": "^17.0.33", "@typescript-eslint/eslint-plugin": "^8.21.0", @@ -93,7 +93,7 @@ "openapi-zod-client": "^1.18.3", "skott": "^0.35.4", "tsup": "^8.4.0", - "typescript": "5.5.4", + "typescript": "5.9.3", "vite-tsconfig-paths": "^4.3.2", "vitest": "^2.1.9", "yargs": "^17.7.2", diff --git a/packages/proxy/scripts/sync_models.ts b/packages/proxy/scripts/sync_models.ts index f0fd5b77..de0db35d 100644 --- a/packages/proxy/scripts/sync_models.ts +++ b/packages/proxy/scripts/sync_models.ts @@ -394,7 +394,7 @@ JSON array only:`; const allGrokModels = [...grokModels, ...newModelNames]; if ( parsedOrder.length === allGrokModels.length && - parsedOrder.every((name) => allGrokModels.includes(name)) && + parsedOrder.every((name: string) => allGrokModels.includes(name)) && allGrokModels.every((name) => parsedOrder.includes(name)) ) { console.log("✅ Claude Code provided optimal Grok ordering"); @@ -408,7 +408,7 @@ JSON array only:`; } catch (parseError) { console.warn( "Failed to parse Claude's JSON response:", - parseError.message, + parseError instanceof Error ? parseError.message : String(parseError), ); } } else { @@ -420,7 +420,10 @@ JSON array only:`; ); return getFallbackCompleteOrdering(existingModelNames, newModelNames); } catch (error) { - console.warn("Failed to get ordering from Claude:", error.message); + console.warn( + "Failed to get ordering from Claude:", + error instanceof Error ? error.message : String(error), + ); return getFallbackCompleteOrdering(existingModelNames, newModelNames); } } diff --git a/packages/proxy/src/PrometheusSerializer.ts b/packages/proxy/src/PrometheusSerializer.ts index 4491a972..537c4344 100644 --- a/packages/proxy/src/PrometheusSerializer.ts +++ b/packages/proxy/src/PrometheusSerializer.ts @@ -32,7 +32,7 @@ import { Histogram, } from "@opentelemetry/sdk-metrics"; import { hrTimeToMilliseconds } from "@opentelemetry/core"; -import { IResource } from "@opentelemetry/resources"; +import { Resource } from "@opentelemetry/resources"; type PrometheusDataTypeLiteral = | "counter" @@ -217,7 +217,16 @@ export class PrometheusSerializer { } const dataPointType = metricData.dataPointType; - name = enforcePrometheusNamingConvention(name, metricData.descriptor.type); + // Get instrument type from the metric data point type + const instrumentType = + metricData.dataPointType === DataPointType.SUM && metricData.isMonotonic + ? InstrumentType.COUNTER + : metricData.dataPointType === DataPointType.SUM + ? InstrumentType.UP_DOWN_COUNTER + : metricData.dataPointType === DataPointType.GAUGE + ? InstrumentType.GAUGE + : InstrumentType.HISTOGRAM; + name = enforcePrometheusNamingConvention(name, instrumentType); const help = `# HELP ${name} ${escapeString( metricData.descriptor.description || "description missing", @@ -233,11 +242,7 @@ export class PrometheusSerializer { case DataPointType.GAUGE: { results = metricData.dataPoints .map((it) => - this._serializeSingularDataPoint( - name, - metricData.descriptor.type, - it, - ), + this._serializeSingularDataPoint(name, instrumentType, it), ) .join(""); break; @@ -245,11 +250,7 @@ export class PrometheusSerializer { case DataPointType.HISTOGRAM: { results = metricData.dataPoints .map((it) => - this._serializeHistogramDataPoint( - name, - metricData.descriptor.type, - it, - ), + this._serializeHistogramDataPoint(name, instrumentType, it), ) .join(""); break; @@ -343,7 +344,7 @@ export class PrometheusSerializer { return results; } - protected _serializeResource(resource: IResource): string { + protected _serializeResource(resource: Resource): string { const name = "target_info"; const help = `# HELP ${name} Target metadata`; const type = `# TYPE ${name} gauge`; diff --git a/packages/proxy/src/providers/google.test.ts b/packages/proxy/src/providers/google.test.ts index 95474e7a..c597365f 100644 --- a/packages/proxy/src/providers/google.test.ts +++ b/packages/proxy/src/providers/google.test.ts @@ -456,8 +456,16 @@ for (const model of [ }); // Parse and validate the response content - const messageContent = response.choices[0]?.message?.content; - if (messageContent) { + const choice = response.choices[0]; + const messageContent = + choice && + "message" in choice && + typeof choice.message === "object" && + choice.message !== null && + "content" in choice.message + ? (choice.message as { content?: unknown }).content + : undefined; + if (messageContent && typeof messageContent === "string") { const parsed = JSON.parse(messageContent); expect(parsed).toHaveProperty("name"); expect(parsed).toHaveProperty("addresses"); diff --git a/packages/proxy/src/proxy.ts b/packages/proxy/src/proxy.ts index 4e841ba5..7e94f24d 100644 --- a/packages/proxy/src/proxy.ts +++ b/packages/proxy/src/proxy.ts @@ -454,6 +454,7 @@ export async function proxyV1({ let spanType: SpanType | undefined = undefined; const isStreaming = !!bodyData?.stream; + // TypeScript 5.9.3: Use ReadableStream - we'll cast pipeThrough results let stream: ReadableStream | null = null; if (readFromCache) { const cached = await cacheGet(encryptionKey, cacheKey); @@ -1412,7 +1413,7 @@ async function fetchModelLoop( } } - let stream = proxyResponse.stream; + let stream: ReadableStream | null = proxyResponse.stream; if (!proxyResponse.response.ok) { logHistogram?.({ name: "endpoint_failures", @@ -1444,7 +1445,8 @@ async function fetchModelLoop( controller.terminate(); }, }); - stream = stream.pipeThrough(timingStream); + stream = + (stream.pipeThrough(timingStream) as ReadableStream) || null; } return { modelResponse: { @@ -1790,7 +1792,7 @@ async function fetchOpenAIResponsesTranslate({ body: JSON.stringify(responsesRequestFromChatCompletionsRequest(body)), signal, }); - let stream = response.body; + let stream: ReadableStream | null = response.body; if (response.ok && stream) { const oaiResponse: OpenAIResponse = await collectStream(stream); if (oaiResponse.error) { @@ -1809,7 +1811,11 @@ async function fetchOpenAIResponsesTranslate({ if (body.stream) { // Fake stream for now, since it looks like the entire text output is sent in one chunk, // so we don't see any UX improvement. - stream = stream.pipeThrough(makeFakeOpenAIStreamTransformer()); + // TypeScript 5.9.3: pipeThrough returns ReadableStream> + // but we need ReadableStream>, so we cast it + stream = stream.pipeThrough( + makeFakeOpenAIStreamTransformer(), + ) as ReadableStream; } } return { @@ -2136,10 +2142,11 @@ async function fetchOpenAI( }, ); - let stream = proxyResponse.body; + let stream: ReadableStream | null = + proxyResponse.body as ReadableStream | null; if (isManagedStructuredOutput && stream) { if (bodyData?.stream) { - stream = stream.pipeThrough( + const transformedStream = stream.pipeThrough( createEventStreamTransformer((data) => { const chunk: ChatCompletionChunk = JSON.parse(data); const choice = chunk.choices[0]; @@ -2163,34 +2170,43 @@ async function fetchOpenAI( }; }), ); + // TypeScript 5.9.3: pipeThrough returns ReadableStream> + // but we need ReadableStream>, so we cast it + stream = (transformedStream as ReadableStream) || null; } else { const chunks: Uint8Array[] = []; - stream = stream.pipeThrough( - new TransformStream({ - transform(chunk, _controller) { - chunks.push(chunk); - }, - flush(controller) { - const data: ChatCompletion = JSON.parse(flattenChunks(chunks)); - const choice = data.choices[0]; - const toolCall = choice.message.tool_calls![0]; - if (toolCall.type === "function") { - choice.message.content = toolCall.function.arguments; - } - choice.finish_reason = "stop"; - delete choice.message.tool_calls; - controller.enqueue(new TextEncoder().encode(JSON.stringify(data))); - controller.terminate(); - }, - }), - ); + stream = + (stream.pipeThrough( + new TransformStream({ + transform(chunk, _controller) { + chunks.push(chunk); + }, + flush(controller) { + const data: ChatCompletion = JSON.parse(flattenChunks(chunks)); + const choice = data.choices[0]; + const toolCall = choice.message.tool_calls![0]; + if (toolCall.type === "function") { + choice.message.content = toolCall.function.arguments; + } + choice.finish_reason = "stop"; + delete choice.message.tool_calls; + controller.enqueue( + new TextEncoder().encode(JSON.stringify(data)), + ); + controller.terminate(); + }, + }), + ) as ReadableStream) || null; } } if (secret.type === "mistral" && stream && bodyData?.stream) { - stream = stream.pipeThrough( - createEventStreamTransformer(transformMistralThinkingChunks()), - ); + // TypeScript 5.9.3: pipeThrough returns ReadableStream> + // but we need ReadableStream>, so we cast it + stream = + (stream.pipeThrough( + createEventStreamTransformer(transformMistralThinkingChunks()), + ) as ReadableStream) || null; } return { diff --git a/packages/proxy/src/util.ts b/packages/proxy/src/util.ts index 5fc68b46..dd79a49b 100644 --- a/packages/proxy/src/util.ts +++ b/packages/proxy/src/util.ts @@ -1,5 +1,6 @@ import contentDisposition from "content-disposition"; export interface ModelResponse { + // TypeScript 5.9.3: Use ReadableStream - pipeThrough results are cast stream: ReadableStream | null; response: Response; } diff --git a/packages/proxy/tsconfig.json b/packages/proxy/tsconfig.json index b739d1e7..cac5ce60 100644 --- a/packages/proxy/tsconfig.json +++ b/packages/proxy/tsconfig.json @@ -3,8 +3,10 @@ "declaration": true, "lib": ["es2015", "dom"], "target": "ES2018", + "module": "esnext", "strict": true, - "moduleResolution": "node", + "moduleResolution": "bundler", + "jsx": "react", "baseUrl": ".", "paths": { "@lib/*": ["src/*"], @@ -13,7 +15,8 @@ "@types": ["types/index"] }, "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "skipLibCheck": true }, "include": ["."], "exclude": ["node_modules/**", "**/dist/**"] diff --git a/packages/proxy/utils/audioEncoder.ts b/packages/proxy/utils/audioEncoder.ts index 9a3663ce..e822a7eb 100644 --- a/packages/proxy/utils/audioEncoder.ts +++ b/packages/proxy/utils/audioEncoder.ts @@ -21,9 +21,10 @@ export function makeWavFile( byte_order: "little", bits_per_sample: 16, }; + // TypeScript 5.9.3: Int16Array is compatible with ArrayBufferLike buffers = buffers.map((buffer) => floatTo16BitPCM(new Float32Array(buffer)), - ); + ) as unknown as ArrayBufferLike[]; } const dataLength = buffers.reduce((sum, b) => sum + b.byteLength, 0); @@ -57,7 +58,8 @@ export function makeWavFile( ...buffers, ]; - return new Blob(blobParts, { type: "audio/wav" }); + // TypeScript 5.9.3: BlobPart accepts ArrayBufferLike, but type checking is stricter + return new Blob(blobParts as BlobPart[], { type: "audio/wav" }); } function wavFormatCode(format: PcmAudioFormat) { @@ -134,7 +136,7 @@ export function makeMp3File( bitrate, ); - const blobParts: ArrayBuffer[] = []; + const blobParts: BlobPart[] = []; for (const buffer of buffers) { const int16Buffer = @@ -143,11 +145,13 @@ export function makeMp3File( : floatTo16BitPCM(new Float32Array(buffer)); const encoded = encoder.encodeBuffer(int16Buffer); if (encoded.length) { - blobParts.push(encoded); + // TypeScript 5.9.3: Uint8Array is compatible with BlobPart + blobParts.push(encoded as BlobPart); } } - blobParts.push(encoder.flush()); + // TypeScript 5.9.3: encoder.flush() returns Uint8Array which is compatible with BlobPart + blobParts.push(encoder.flush() as BlobPart); return new Blob(blobParts, { type: "audio/mpeg" }); } diff --git a/packages/proxy/utils/encrypt.ts b/packages/proxy/utils/encrypt.ts index 48d0535b..8baf2625 100644 --- a/packages/proxy/utils/encrypt.ts +++ b/packages/proxy/utils/encrypt.ts @@ -100,7 +100,8 @@ export async function encryptMessage( ); return { - iv: arrayBufferToBase64(new Uint8Array(iv)), + // TypeScript 5.9.3: Uint8Array.buffer is ArrayBufferLike, need explicit conversion + iv: arrayBufferToBase64(iv.buffer as ArrayBuffer), data: arrayBufferToBase64(decoded), }; } diff --git a/packages/proxy/utils/tempCredentials.ts b/packages/proxy/utils/tempCredentials.ts index 5f854ac1..63ee7b11 100644 --- a/packages/proxy/utils/tempCredentials.ts +++ b/packages/proxy/utils/tempCredentials.ts @@ -60,9 +60,8 @@ export function makeTempCredentialsJwt({ // Generate 256-bit key since our cache uses AES-256. const keyLengthBytes = 256 / 8; - const cacheEncryptionKey = arrayBufferToBase64( - crypto.getRandomValues(new Uint8Array(keyLengthBytes)), - ); + const randomValues = crypto.getRandomValues(new Uint8Array(keyLengthBytes)); + const cacheEncryptionKey = arrayBufferToBase64(randomValues.buffer); // The partial payload is missing timestamps (`iat`, `exp`). They will be // populated at signing time with the `mutatePayload` option. diff --git a/packages/proxy/utils/tests.ts b/packages/proxy/utils/tests.ts index 0a72bf30..b037126a 100644 --- a/packages/proxy/utils/tests.ts +++ b/packages/proxy/utils/tests.ts @@ -4,6 +4,7 @@ import { TextDecoder } from "util"; import { Buffer } from "node:buffer"; import { proxyV1 } from "../src/proxy"; import { getModelEndpointTypes } from "@schema"; +import type { APISecret } from "@schema"; import { createParser, ParsedEvent, ParseEvent } from "eventsource-parser"; export function createResponseStream(): [ @@ -54,6 +55,7 @@ export const getKnownApiSecrets: Parameters< useCache: boolean, authToken: string, model: string | null, + _org_name?: string, ) => { const endpointTypes = model && getModelEndpointTypes(model); if (!endpointTypes?.length) throw new Error(`Unknown model: ${model}`); @@ -123,7 +125,9 @@ export const getKnownApiSecrets: Parameters< excludeDefaultModels: true, }, }, - ].filter((secret) => !!secret.secret && endpointTypes.includes(secret.type)); + ].filter( + (secret) => !!secret.secret && endpointTypes.includes(secret.type), + ) as APISecret[]; }; export async function callProxyV1({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b821dfa..020fcc43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,10 +25,10 @@ importers: version: 2.5.6 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4) + version: 4.3.2(typescript@5.9.3) vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.10.5)(msw@2.8.4) + version: 2.1.9(@types/node@20.19.25)(msw@2.8.4) apis/cloudflare: dependencies: @@ -274,8 +274,8 @@ importers: specifier: ^9.0.7 version: 9.0.7 '@types/node': - specifier: ^20.10.5 - version: 20.10.5 + specifier: ^20.17.0 + version: 20.19.25 '@types/uuid': specifier: ^9.0.7 version: 9.0.7 @@ -284,13 +284,13 @@ importers: version: 17.0.33 '@typescript-eslint/eslint-plugin': specifier: ^8.21.0 - version: 8.21.0(@typescript-eslint/parser@8.46.2)(eslint@8.57.1)(typescript@5.5.4) + version: 8.21.0(@typescript-eslint/parser@8.46.2)(eslint@8.57.1)(typescript@5.9.3) esbuild: specifier: ^0.19.10 version: 0.19.10 msw: specifier: ^2.8.2 - version: 2.8.4(@types/node@20.10.5)(typescript@5.5.4) + version: 2.8.4(@types/node@20.19.25)(typescript@5.9.3) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -302,16 +302,16 @@ importers: version: 0.35.4 tsup: specifier: ^8.4.0 - version: 8.4.0(typescript@5.5.4) + version: 8.4.0(typescript@5.9.3) typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: 5.9.3 + version: 5.9.3 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4) + version: 4.3.2(typescript@5.9.3) vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.10.5)(msw@2.8.4) + version: 2.1.9(@types/node@20.19.25)(msw@2.8.4) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -2555,7 +2555,7 @@ packages: dev: true optional: true - /@inquirer/confirm@5.1.12(@types/node@20.10.5): + /@inquirer/confirm@5.1.12(@types/node@20.19.25): resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} engines: {node: '>=18'} peerDependencies: @@ -2564,12 +2564,12 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.13(@types/node@20.10.5) - '@inquirer/type': 3.0.7(@types/node@20.10.5) - '@types/node': 20.10.5 + '@inquirer/core': 10.1.13(@types/node@20.19.25) + '@inquirer/type': 3.0.7(@types/node@20.19.25) + '@types/node': 20.19.25 dev: true - /@inquirer/core@10.1.13(@types/node@20.10.5): + /@inquirer/core@10.1.13(@types/node@20.19.25): resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} engines: {node: '>=18'} peerDependencies: @@ -2579,8 +2579,8 @@ packages: optional: true dependencies: '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@20.10.5) - '@types/node': 20.10.5 + '@inquirer/type': 3.0.7(@types/node@20.19.25) + '@types/node': 20.19.25 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -2594,7 +2594,7 @@ packages: engines: {node: '>=18'} dev: true - /@inquirer/type@3.0.7(@types/node@20.10.5): + /@inquirer/type@3.0.7(@types/node@20.19.25): resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} engines: {node: '>=18'} peerDependencies: @@ -2603,7 +2603,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@isaacs/cliui@8.0.2: @@ -4079,19 +4079,19 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/combined-stream@1.0.3: resolution: {integrity: sha512-rU54Qy0+23b3xsXhBtHfx+M4lsRLllU2bnUnkS9hm3HAQ2Xt9q3QCYFxYVeaSG2mpCD8uuOGIEpcXHXDNZTa9w==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/content-disposition@0.5.8: @@ -4105,7 +4105,7 @@ packages: /@types/cors@2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/dotenv@8.2.0: @@ -4128,7 +4128,7 @@ packages: /@types/express-serve-static-core@4.17.41: resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 '@types/qs': 6.9.10 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -4146,7 +4146,7 @@ packages: /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/http-errors@2.0.4: @@ -4163,7 +4163,7 @@ packages: /@types/jsonwebtoken@9.0.7: resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/mime@1.3.5: @@ -4181,7 +4181,7 @@ packages: /@types/node-fetch@2.6.13: resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 form-data: 4.0.4 dev: false @@ -4199,6 +4199,12 @@ packages: resolution: {integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==} dependencies: undici-types: 5.26.5 + dev: true + + /@types/node@20.19.25: + resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} + dependencies: + undici-types: 6.21.0 /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4231,7 +4237,7 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/serve-static@1.15.5: @@ -4239,7 +4245,7 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: true /@types/statuses@2.0.5: @@ -4256,7 +4262,7 @@ packages: /@types/websocket@1.0.10: resolution: {integrity: sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 dev: false /@types/yargs-parser@21.0.3: @@ -4269,7 +4275,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.46.2)(eslint@8.57.1)(typescript@5.5.4): + /@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.46.2)(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -4278,17 +4284,17 @@ packages: typescript: '>=4.8.4 <5.8.0' dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 8.46.2(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': 8.46.2(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/type-utils': 8.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.21.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.5.4) - typescript: 5.5.4 + ts-api-utils: 2.0.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -4314,7 +4320,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.5.4): + /@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -4323,25 +4329,25 @@ packages: dependencies: '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.2 debug: 4.4.3 eslint: 8.57.1 - typescript: 5.5.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/project-service@8.46.2(typescript@5.5.4): + /@typescript-eslint/project-service@8.46.2(typescript@5.9.3): resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) '@typescript-eslint/types': 8.46.2 debug: 4.4.3 - typescript: 5.5.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -4370,28 +4376,28 @@ packages: '@typescript-eslint/visitor-keys': 8.46.2 dev: true - /@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.5.4): + /@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3): resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - typescript: 5.5.4 + typescript: 5.9.3 dev: true - /@typescript-eslint/type-utils@8.21.0(eslint@8.57.1)(typescript@5.5.4): + /@typescript-eslint/type-utils@8.21.0(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.1 eslint: 8.57.1 - ts-api-utils: 2.0.0(typescript@5.5.4) - typescript: 5.5.4 + ts-api-utils: 2.0.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -4459,7 +4465,7 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@8.21.0(typescript@5.5.4): + /@typescript-eslint/typescript-estree@8.21.0(typescript@5.9.3): resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -4472,20 +4478,20 @@ packages: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.5.4) - typescript: 5.5.4 + ts-api-utils: 2.0.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@8.46.2(typescript@5.5.4): + /@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3): resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.5.4) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4) + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) '@typescript-eslint/types': 8.46.2 '@typescript-eslint/visitor-keys': 8.46.2 debug: 4.4.3 @@ -4493,13 +4499,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.5.4) - typescript: 5.5.4 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@8.21.0(eslint@8.57.1)(typescript@5.5.4): + /@typescript-eslint/utils@8.21.0(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -4509,9 +4515,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.9.3) eslint: 8.57.1 - typescript: 5.5.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -4640,8 +4646,8 @@ packages: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.17 - msw: 2.8.4(@types/node@20.10.5)(typescript@5.5.4) - vite: 5.4.19(@types/node@20.10.5) + msw: 2.8.4(@types/node@20.19.25)(typescript@5.9.3) + vite: 5.4.19(@types/node@20.19.25) dev: true /@vitest/pretty-format@2.1.9: @@ -4784,7 +4790,7 @@ packages: dependencies: '@vue/compiler-ssr': 3.5.22 '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.3.3) + vue: 3.5.22(typescript@5.9.3) dev: false /@vue/shared@3.5.13: @@ -4933,7 +4939,7 @@ packages: swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 swrv: 1.0.4(vue@3.5.22) - vue: 3.5.22(typescript@5.5.4) + vue: 3.5.22(typescript@5.9.3) dev: false /ajv-draft-04@1.0.0(ajv@8.17.1): @@ -8352,7 +8358,7 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msw@2.8.4(@types/node@20.10.5)(typescript@5.5.4): + /msw@2.8.4(@types/node@20.19.25)(typescript@5.9.3): resolution: {integrity: sha512-GLU8gx0o7RBG/3x/eTnnLd5S5ZInxXRRRMN8GJwaPZ4jpJTxzQfWGvwr90e8L5dkKJnz+gT4gQYCprLy/c4kVw==} engines: {node: '>=18'} hasBin: true @@ -8366,7 +8372,7 @@ packages: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.12(@types/node@20.10.5) + '@inquirer/confirm': 5.1.12(@types/node@20.19.25) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -8380,7 +8386,7 @@ packages: picocolors: 1.1.1 strict-event-emitter: 0.5.1 type-fest: 4.41.0 - typescript: 5.5.4 + typescript: 5.9.3 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -9187,7 +9193,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.10.5 + '@types/node': 20.19.25 long: 5.3.2 dev: false @@ -10211,7 +10217,7 @@ packages: peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.5.22(typescript@5.3.3) + vue: 3.5.22(typescript@5.9.3) dev: false /tailwindcss@3.2.7(postcss@8.4.38): @@ -10382,22 +10388,22 @@ packages: typescript: 5.4.5 dev: true - /ts-api-utils@2.0.0(typescript@5.5.4): + /ts-api-utils@2.0.0(typescript@5.9.3): resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' dependencies: - typescript: 5.5.4 + typescript: 5.9.3 dev: true - /ts-api-utils@2.1.0(typescript@5.5.4): + /ts-api-utils@2.1.0(typescript@5.9.3): resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' dependencies: - typescript: 5.5.4 + typescript: 5.9.3 dev: true /ts-interface-checker@0.1.13: @@ -10412,7 +10418,7 @@ packages: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} dev: true - /tsconfck@3.1.4(typescript@5.5.4): + /tsconfck@3.1.4(typescript@5.9.3): resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} engines: {node: ^18 || >=20} hasBin: true @@ -10422,7 +10428,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.5.4 + typescript: 5.9.3 dev: true /tsconfig-paths@3.15.0: @@ -10486,7 +10492,7 @@ packages: - yaml dev: true - /tsup@8.4.0(typescript@5.5.4): + /tsup@8.4.0(typescript@5.9.3): resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} engines: {node: '>=18'} hasBin: true @@ -10521,7 +10527,7 @@ packages: tinyexec: 0.3.2 tinyglobby: 0.2.12 tree-kill: 1.2.2 - typescript: 5.5.4 + typescript: 5.9.3 transitivePeerDependencies: - jiti - supports-color @@ -10753,8 +10759,8 @@ packages: hasBin: true dev: true - /typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -10786,6 +10792,9 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + /undici@7.14.0: resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} engines: {node: '>=20.18.1'} @@ -10914,7 +10923,7 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite-node@2.1.9(@types/node@20.10.5): + /vite-node@2.1.9(@types/node@20.19.25): resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -10923,7 +10932,7 @@ packages: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.19(@types/node@20.10.5) + vite: 5.4.19(@types/node@20.19.25) transitivePeerDependencies: - '@types/node' - less @@ -10936,7 +10945,7 @@ packages: - terser dev: true - /vite-tsconfig-paths@4.3.2(typescript@5.5.4): + /vite-tsconfig-paths@4.3.2(typescript@5.9.3): resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: vite: '*' @@ -10946,13 +10955,13 @@ packages: dependencies: debug: 4.3.7 globrex: 0.1.2 - tsconfck: 3.1.4(typescript@5.5.4) + tsconfck: 3.1.4(typescript@5.9.3) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@5.4.19(@types/node@20.10.5): + /vite@5.4.19(@types/node@20.19.25): resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -10983,7 +10992,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.46.4 @@ -10991,7 +11000,7 @@ packages: fsevents: 2.3.3 dev: true - /vitest@2.1.9(@types/node@20.10.5)(msw@2.8.4): + /vitest@2.1.9(@types/node@20.19.25)(msw@2.8.4): resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -11016,7 +11025,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.10.5 + '@types/node': 20.19.25 '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(msw@2.8.4)(vite@5.4.19) '@vitest/pretty-format': 2.1.9 @@ -11034,8 +11043,8 @@ packages: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 1.2.0 - vite: 5.4.19(@types/node@20.10.5) - vite-node: 2.1.9(@types/node@20.10.5) + vite: 5.4.19(@types/node@20.19.25) + vite-node: 2.1.9(@types/node@20.19.25) why-is-node-running: 2.3.0 transitivePeerDependencies: - less @@ -11065,7 +11074,7 @@ packages: typescript: 5.3.3 dev: false - /vue@3.5.22(typescript@5.5.4): + /vue@3.5.22(typescript@5.9.3): resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} peerDependencies: typescript: '*' @@ -11078,7 +11087,7 @@ packages: '@vue/runtime-dom': 3.5.22 '@vue/server-renderer': 3.5.22(vue@3.5.22) '@vue/shared': 3.5.22 - typescript: 5.5.4 + typescript: 5.9.3 dev: false /watchpack@2.4.0: