From d4b66a6218f98f001bab4cc3f93fc7351fb26619 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 27 Jun 2025 18:01:40 +0700 Subject: [PATCH 01/20] spike: Feasibility of generating Signify types from Python type hints via OpenAI --- .gitignore | 3 + README.md | 6 ++ package.json | 3 +- scripts/generate-types.js | 32 +++++++ test-integration/openapi-type.test.ts | 125 ++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 scripts/generate-types.js create mode 100644 test-integration/openapi-type.test.ts diff --git a/.gitignore b/.gitignore index 421b39a5..ace817e0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ dist # IntelliJ Project Files .idea coverage/* + +# Keria API types +src/types \ No newline at end of file diff --git a/README.md b/README.md index e5b5dd67..fee4e067 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,12 @@ Typescript source files needs to be transpiled before running scripts or integra npm run build ``` + To build and generate TypeScript types from KERIA OpenAPI docs dynamically + + ``` + SPEC_URL=http://localhost:3902/spec.yaml npm run build + ``` + - ready() must be called before library is useable. Example minimum viable client code. ```javascript diff --git a/package.json b/package.json index e7feae32..fc2ae03c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ ], "scripts": { "start": "npm run build -- --watch", - "build": "tsc -p tsconfig.build.json && tsc -p tsconfig.json --noEmit", + "generate:types": "node scripts/generate-types.js", + "build": "npm run generate:types && tsc -p tsconfig.build.json && tsc -p tsconfig.json --noEmit", "test": "vitest", "prepare": "tsc -p tsconfig.build.json", "test:integration": "vitest -c vitest.integration.ts", diff --git a/scripts/generate-types.js b/scripts/generate-types.js new file mode 100644 index 00000000..19706401 --- /dev/null +++ b/scripts/generate-types.js @@ -0,0 +1,32 @@ +import { execSync } from "child_process"; +import fs from "fs"; +import path from "path"; + +const specUrl = process.env.SPEC_URL; +const outputFile = path.resolve("src/types/keria-api-schema.ts"); + +if (!specUrl) { + console.log("⚠️ Skipping OpenAPI type generation: SPEC_URL is not set."); + process.exit(0); +} + +console.log(`📦 Generating types from ${specUrl}`); +execSync(`npx openapi-typescript "${specUrl}" --output ${outputFile}`, { + stdio: "inherit", +}); + +// Read the full file +const fullContent = fs.readFileSync(outputFile, "utf8"); + +// Extract only the `export interface components { ... }` block +const match = fullContent.match(/export interface components \{[\s\S]+?\n\}/); + +if (!match) { + console.error("❌ Could not find 'export interface components' block."); + process.exit(1); +} + +// Add comment header +const cleaned = `// AUTO-GENERATED: Only components retained from OpenAPI schema\n\n${match[0]}\n`; + +fs.writeFileSync(outputFile, cleaned, "utf8"); diff --git a/test-integration/openapi-type.test.ts b/test-integration/openapi-type.test.ts new file mode 100644 index 00000000..cb77ca2a --- /dev/null +++ b/test-integration/openapi-type.test.ts @@ -0,0 +1,125 @@ +import { assert, describe, test } from 'vitest'; +import { EventResult, SignifyClient } from 'signify-ts'; +import { + getOrCreateClients, + waitOperation, +} from './utils/test-util.ts'; +import { resolveEnvironment } from './utils/resolve-env.ts'; +import { components } from '../src/types/keria-api-schema.ts'; + + +type IdentifierCreateResponse = components["schemas"]["IdentifierCreateResponse"]; +type ResponseUnion = components["schemas"]["ResponseUnion"]; +type OpMetadata = components["schemas"]["OpMetadata"]; +type OpResponseKel = components["schemas"]["OpResponseKel"]; + + +function isOpResponseKel(obj: any): obj is OpResponseKel { + return ( + typeof obj === "object" && + obj !== null && + (obj.a === undefined || Array.isArray(obj.a)) && + Array.isArray(obj.b) && + typeof obj.bt === "string" && + (obj.c === undefined || Array.isArray(obj.c)) && + typeof obj.d === "string" && + typeof obj.i === "string" && + Array.isArray(obj.k) && + typeof obj.kt === "string" && + Array.isArray(obj.n) && + typeof obj.nt === "string" && + typeof obj.s === "string" && + typeof obj.t === "string" && + typeof obj.v === "string" + ); +} + +function isResponseUnion(obj: any): obj is ResponseUnion { + if (obj === null) return true; + if (typeof obj === "object") { + if (isOpResponseKel(obj)) return true; + if (Object.keys(obj).length === 0) return true; // empty object + } + return false; +} + +function isIdentifierCreateResponse(obj: any): obj is IdentifierCreateResponse { + if ( + typeof obj !== "object" || + obj === null || + typeof obj.done !== "boolean" || + typeof obj.name !== "string" + ) { + return false; + } + // Check optional metadata + if ("metadata" in obj && obj.metadata !== undefined && typeof obj.metadata !== "object") { + return false; + } + // Check optional response + if ("response" in obj && obj.response !== undefined && !isResponseUnion(obj.response)) { + return false; + } + // Only allow expected keys + const allowedKeys = ["done", "metadata", "name", "response"]; + for (const key of Object.keys(obj)) { + if (!allowedKeys.includes(key)) { + return false; + } + } + return true; +} + +let client: SignifyClient; + +describe('test-setup-clients', async () => { + [client] = await getOrCreateClients(1); + + const env = resolveEnvironment(); + const kargs = { + toad: env.witnessIds.length, + wits: env.witnessIds, + }; + + test('should return IdentifierCreateResponse from waitOperation', async () => { + const result: EventResult = await client + .identifiers() + .create("name", kargs); + let op = await result.op(); + op = await waitOperation(client, op); + + console.log('Operation result:', op); + + if (!isIdentifierCreateResponse(op)) { + let errors: string[] = []; + if (typeof op !== "object" || op === null) { + errors.push(`op is not an object: ${JSON.stringify(op)}`); + } else { + if (typeof op.done !== "boolean") { + errors.push(`op.done is not boolean: ${JSON.stringify(op.done)}`); + } + if (typeof op.name !== "string") { + errors.push(`op.name is not string: ${JSON.stringify(op.name)}`); + } + if ("metadata" in op && op.metadata !== undefined && typeof op.metadata !== "object") { + errors.push(`op.metadata is not object or undefined: ${JSON.stringify(op.metadata)}`); + } + if ("response" in op && op.response !== undefined && !isResponseUnion(op.response)) { + errors.push(`op.response is not ResponseUnion: ${JSON.stringify(op.response)}`); + } + const allowedKeys = ["done", "metadata", "name", "response"]; + for (const key of Object.keys(op)) { + if (!allowedKeys.includes(key)) { + errors.push(`Unexpected key in op: ${key}`); + } + } + } + throw new Error("IdentifierCreateResponse check failed:\n" + errors.join("\n")); + } + + assert.equal(isIdentifierCreateResponse(op), true); + assert.typeOf(op.done, 'boolean'); + assert.typeOf(op.name, 'string'); + + }); +}); From ef02dfec6428eb343c8cb97a489385a7e0015bc8 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Mon, 7 Jul 2025 17:55:43 +0700 Subject: [PATCH 02/20] add and use generated TS types --- src/keri/app/coring.ts | 10 +-- src/types/keria-api-schema.ts | 28 ++++++ test-integration/openapi-type.test.ts | 125 -------------------------- 3 files changed, 33 insertions(+), 130 deletions(-) create mode 100644 src/types/keria-api-schema.ts delete mode 100644 test-integration/openapi-type.test.ts diff --git a/src/keri/app/coring.ts b/src/keri/app/coring.ts index 6f7daaf4..987fc1cf 100644 --- a/src/keri/app/coring.ts +++ b/src/keri/app/coring.ts @@ -2,6 +2,9 @@ import { SignifyClient } from './clienting.ts'; import libsodium from 'libsodium-wrappers-sumo'; import { Salter } from '../core/salter.ts'; import { Matter, MtrDex } from '../core/matter.ts'; +import { components } from '../../types/keria-api-schema.ts'; + +type OperationBase = components['schemas']['OperationBase']; export function randomPasscode(): string { const raw = libsodium.randombytes_buf(16); @@ -61,15 +64,12 @@ export class Oobis { } } -export interface Operation { - name: string; +export type Operation = OperationBase & { + response?: T; metadata?: { depends?: Operation; [property: string]: any; }; - done?: boolean; - error?: any; - response?: T; } export interface OperationsDeps { diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts new file mode 100644 index 00000000..21769e0e --- /dev/null +++ b/src/types/keria-api-schema.ts @@ -0,0 +1,28 @@ +// AUTO-GENERATED: Only components retained from OpenAPI schema + +export interface components { + schemas: { + StatusSchema: { + code: number; + message: string; + /** @default null */ + details: { + [key: string]: unknown; + } | null; + }; + OperationBase: { + name: string; + done?: boolean; + error?: boolean; + }; + Operation: components["schemas"]["OperationBase"] & { + metadata?: Record; + response?: Record; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} diff --git a/test-integration/openapi-type.test.ts b/test-integration/openapi-type.test.ts deleted file mode 100644 index cb77ca2a..00000000 --- a/test-integration/openapi-type.test.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { assert, describe, test } from 'vitest'; -import { EventResult, SignifyClient } from 'signify-ts'; -import { - getOrCreateClients, - waitOperation, -} from './utils/test-util.ts'; -import { resolveEnvironment } from './utils/resolve-env.ts'; -import { components } from '../src/types/keria-api-schema.ts'; - - -type IdentifierCreateResponse = components["schemas"]["IdentifierCreateResponse"]; -type ResponseUnion = components["schemas"]["ResponseUnion"]; -type OpMetadata = components["schemas"]["OpMetadata"]; -type OpResponseKel = components["schemas"]["OpResponseKel"]; - - -function isOpResponseKel(obj: any): obj is OpResponseKel { - return ( - typeof obj === "object" && - obj !== null && - (obj.a === undefined || Array.isArray(obj.a)) && - Array.isArray(obj.b) && - typeof obj.bt === "string" && - (obj.c === undefined || Array.isArray(obj.c)) && - typeof obj.d === "string" && - typeof obj.i === "string" && - Array.isArray(obj.k) && - typeof obj.kt === "string" && - Array.isArray(obj.n) && - typeof obj.nt === "string" && - typeof obj.s === "string" && - typeof obj.t === "string" && - typeof obj.v === "string" - ); -} - -function isResponseUnion(obj: any): obj is ResponseUnion { - if (obj === null) return true; - if (typeof obj === "object") { - if (isOpResponseKel(obj)) return true; - if (Object.keys(obj).length === 0) return true; // empty object - } - return false; -} - -function isIdentifierCreateResponse(obj: any): obj is IdentifierCreateResponse { - if ( - typeof obj !== "object" || - obj === null || - typeof obj.done !== "boolean" || - typeof obj.name !== "string" - ) { - return false; - } - // Check optional metadata - if ("metadata" in obj && obj.metadata !== undefined && typeof obj.metadata !== "object") { - return false; - } - // Check optional response - if ("response" in obj && obj.response !== undefined && !isResponseUnion(obj.response)) { - return false; - } - // Only allow expected keys - const allowedKeys = ["done", "metadata", "name", "response"]; - for (const key of Object.keys(obj)) { - if (!allowedKeys.includes(key)) { - return false; - } - } - return true; -} - -let client: SignifyClient; - -describe('test-setup-clients', async () => { - [client] = await getOrCreateClients(1); - - const env = resolveEnvironment(); - const kargs = { - toad: env.witnessIds.length, - wits: env.witnessIds, - }; - - test('should return IdentifierCreateResponse from waitOperation', async () => { - const result: EventResult = await client - .identifiers() - .create("name", kargs); - let op = await result.op(); - op = await waitOperation(client, op); - - console.log('Operation result:', op); - - if (!isIdentifierCreateResponse(op)) { - let errors: string[] = []; - if (typeof op !== "object" || op === null) { - errors.push(`op is not an object: ${JSON.stringify(op)}`); - } else { - if (typeof op.done !== "boolean") { - errors.push(`op.done is not boolean: ${JSON.stringify(op.done)}`); - } - if (typeof op.name !== "string") { - errors.push(`op.name is not string: ${JSON.stringify(op.name)}`); - } - if ("metadata" in op && op.metadata !== undefined && typeof op.metadata !== "object") { - errors.push(`op.metadata is not object or undefined: ${JSON.stringify(op.metadata)}`); - } - if ("response" in op && op.response !== undefined && !isResponseUnion(op.response)) { - errors.push(`op.response is not ResponseUnion: ${JSON.stringify(op.response)}`); - } - const allowedKeys = ["done", "metadata", "name", "response"]; - for (const key of Object.keys(op)) { - if (!allowedKeys.includes(key)) { - errors.push(`Unexpected key in op: ${key}`); - } - } - } - throw new Error("IdentifierCreateResponse check failed:\n" + errors.join("\n")); - } - - assert.equal(isIdentifierCreateResponse(op), true); - assert.typeOf(op.done, 'boolean'); - assert.typeOf(op.name, 'string'); - - }); -}); From 5d490a5915f14aa1ded252048e6b9fb291ab8b47 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Tue, 8 Jul 2025 18:06:43 +0700 Subject: [PATCH 03/20] demo generated types for credentials().get() --- .gitignore | 2 - src/keri/app/credentialing.ts | 16 ++++- src/types/keria-api-schema.ts | 99 ++++++++++++++++++++++++++++ test-integration/credentials.test.ts | 13 +++- 4 files changed, 124 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index ace817e0..c659f56c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,3 @@ dist .idea coverage/* -# Keria API types -src/types \ No newline at end of file diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index 9c342da0..6f802925 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -22,6 +22,10 @@ import { import { Operation } from './coring.ts'; import { HabState } from '../core/keyState.ts'; +import { components } from '../../types/keria-api-schema.ts'; + +type CredentialResult = components['schemas']['CredentialSchema']; + /** Types of credentials */ export class CredentialTypes { static issued = 'issued'; @@ -287,6 +291,8 @@ export class Credentials { return await res.json(); } + + /** * Get a credential * @async @@ -294,7 +300,7 @@ export class Credentials { * @param {boolean} [includeCESR=false] - Optional flag export the credential in CESR format * @returns {Promise} A promise to the credential */ - async get(said: string, includeCESR: boolean = false): Promise { + async get(said: string, includeCESR: boolean = false): Promise { const path = `/credentials/${said}`; const method = 'GET'; const headers = includeCESR @@ -302,7 +308,13 @@ export class Credentials { : new Headers({ Accept: 'application/json' }); const res = await this.client.fetch(path, method, null, headers); - return includeCESR ? await res.text() : await res.json(); + if (includeCESR) { + const text = await res.text(); + // If CESR is JSON, parse it: + return JSON.parse(text) as CredentialResult; + } else { + return await res.json(); + } } /** diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 21769e0e..a6bcf3fd 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -2,6 +2,105 @@ export interface components { schemas: { + SADAttributes: { + d: string; + i: string; + LEI: string; + dt: string; + }; + SADSchema: { + v: string; + d: string; + i: string; + ri: string; + s: string; + a: components["schemas"]["SADAttributes"]; + u?: boolean; + e?: boolean; + r?: boolean; + }; + SADAttributesSchema: { + d: string; + i: string; + LEI: string; + dt: string; + }; + ISSSchema: { + v: string; + t: string; + d: string; + i: string; + s: string; + ri: string; + dt: string; + }; + SchemaSchema: { + $id: string; + $schema: string; + title: string; + description: string; + type: string; + credentialType: string; + version: string; + properties: { + [key: string]: unknown; + }; + additionalProperties: boolean; + required: string[]; + }; + StatusAnchorSchema: { + s: number; + d: string; + }; + CredentialStatusSchema: { + vn: number[]; + i: string; + s: string; + d: string; + ri: string; + ra: { + [key: string]: unknown; + }; + a: components["schemas"]["StatusAnchorSchema"]; + dt: string; + et: string; + }; + AnchorSchema: { + pre: string; + sn: number; + d: string; + }; + SealSchema: { + i: string; + s: string; + d: string; + t?: boolean; + p?: boolean; + }; + ANCSchema: { + v: string; + t: string; + d: string; + i: string; + s: string; + p: string; + a: components["schemas"]["SealSchema"][]; + }; + CredentialSchema: { + sad: components["schemas"]["SADSchema"]; + atc: string; + iss: components["schemas"]["ISSSchema"]; + issAtc: string; + pre: string; + schema: components["schemas"]["SchemaSchema"]; + chains: { + [key: string]: unknown; + }[]; + status: components["schemas"]["CredentialStatusSchema"]; + anchor: components["schemas"]["AnchorSchema"]; + anc: components["schemas"]["ANCSchema"]; + ancAttachment: string; + }; StatusSchema: { code: number; message: string; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index 42e5d04e..16ead390 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -138,6 +138,8 @@ test('single signature credentials', { timeout: 90000 }, async () => { const issuerLeSchema = await issuerClient.schemas().get(LE_SCHEMA_SAID); + console.log('issuerLeSchema', issuerLeSchema); + assert.equal(issuerLeSchema.$id, LE_SCHEMA_SAID); }); @@ -427,7 +429,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { anc: new Serder(holderCredential.anc), iss: new Serder(holderCredential.iss), acdcAttachment: holderCredential.atc, - ancAttachment: holderCredential.ancatc, + ancAttachment: holderCredential.ancAttachment, issAttachment: holderCredential.issAtc, agreeSaid: agreeSaid, datetime: createTimestamp(), @@ -474,6 +476,8 @@ test('single signature credentials', { timeout: 90000 }, async () => { verifierClient.credentials().get(qviCredentialId) ); + console.log('verifierCredential from credentials().get', verifierCredential); + assert.equal(verifierCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(verifierCredential.sad.i, issuerAid.prefix); assert.equal(verifierCredential.status.s, '0'); // 0 = issued @@ -607,11 +611,16 @@ test('single signature credentials', { timeout: 90000 }, async () => { legalEntityClient.credentials().get(leCredentialId) ); + console.log('legalEntityCredential from credentials().get', legalEntityCredential); + assert.equal(legalEntityCredential.sad.s, LE_SCHEMA_SAID); assert.equal(legalEntityCredential.sad.i, holderAid.prefix); assert.equal(legalEntityCredential.sad.a.i, legalEntityAid.prefix); assert.equal(legalEntityCredential.status.s, '0'); - assert.equal(legalEntityCredential.chains[0].sad.d, qviCredentialId); + assert(Array.isArray(legalEntityCredential.chains)); + assert(legalEntityCredential.chains.length > 0); + const firstChain = legalEntityCredential.chains[0] as { sad: { d: string } }; + assert.equal(firstChain.sad.d, qviCredentialId); assert(legalEntityCredential.atc !== undefined); }); From 3ed3b6ac7b9bf56b7b32bcb95e21f0138c8f27d2 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Wed, 9 Jul 2025 18:32:36 +0700 Subject: [PATCH 04/20] update types for CredentialState --- src/keri/app/credentialing.ts | 24 +++-------- src/types/keria-api-schema.ts | 64 +++++++++++++++++++++------- test-integration/credentials.test.ts | 5 ++- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index 6f802925..2ce57f48 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -25,6 +25,8 @@ import { HabState } from '../core/keyState.ts'; import { components } from '../../types/keria-api-schema.ts'; type CredentialResult = components['schemas']['CredentialSchema']; +type CredentialStateIssOrRev = components['schemas']['CredentialStateIssOrRevSchema']; +type CredentialStateBisOrBrv = components['schemas']['CredentialStateBisOrBrvSchema']; /** Types of credentials */ export class CredentialTypes { @@ -233,25 +235,9 @@ export interface IpexAdmitArgs { datetime?: string; } -export type CredentialState = { - vn: [number, number]; - i: string; - s: string; - d: string; - ri: string; - a: { s: number; d: string }; - dt: string; - et: string; -} & ( - | { - et: 'iss' | 'rev'; - ra: Record; - } - | { - et: 'bis' | 'brv'; - ra: { i: string; s: string; d: string }; - } -); + +export type CredentialState = CredentialStateIssOrRev | CredentialStateBisOrBrv; + /** * Credentials diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index a6bcf3fd..8074b1af 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -2,28 +2,24 @@ export interface components { schemas: { - SADAttributes: { - d: string; - i: string; - LEI: string; - dt: string; - }; SADSchema: { v: string; d: string; i: string; - ri: string; s: string; - a: components["schemas"]["SADAttributes"]; - u?: boolean; - e?: boolean; - r?: boolean; + ri?: string; + a?: { + [key: string]: unknown; + }; + u?: string; + e?: unknown[]; + r?: unknown[]; }; SADAttributesSchema: { d: string; - i: string; LEI: string; dt: string; + i?: string; }; ISSSchema: { v: string; @@ -71,11 +67,11 @@ export interface components { d: string; }; SealSchema: { - i: string; s: string; d: string; - t?: boolean; - p?: boolean; + i?: string; + t?: string; + p?: string; }; ANCSchema: { v: string; @@ -96,11 +92,16 @@ export interface components { chains: { [key: string]: unknown; }[]; - status: components["schemas"]["CredentialStatusSchema"]; + status: components["schemas"]["CredentialStateIssOrRevSchema"] | components["schemas"]["CredentialStateBisOrBrvSchema"]; anchor: components["schemas"]["AnchorSchema"]; anc: components["schemas"]["ANCSchema"]; ancAttachment: string; }; + OperationBaseSchema: { + name: string; + done?: boolean; + error?: boolean; + }; StatusSchema: { code: number; message: string; @@ -114,6 +115,37 @@ export interface components { done?: boolean; error?: boolean; }; + CredentialStateIssOrRevSchema: { + vn: unknown; + i: string; + s: string; + d: string; + ri: string; + a: components["schemas"]["SealSchema"]; + dt: string; + /** @enum {unknown} */ + et: "iss" | "rev"; + ra: { + [key: string]: unknown; + }; + }; + RaFields: { + i: string; + s: string; + d: string; + }; + CredentialStateBisOrBrvSchema: { + vn: unknown; + i: string; + s: string; + d: string; + ri: string; + a: components["schemas"]["SealSchema"]; + dt: string; + /** @enum {unknown} */ + et: "bis" | "brv"; + ra: components["schemas"]["RaFields"]; + }; Operation: components["schemas"]["OperationBase"] & { metadata?: Record; response?: Record; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index 16ead390..767afe9a 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -615,7 +615,10 @@ test('single signature credentials', { timeout: 90000 }, async () => { assert.equal(legalEntityCredential.sad.s, LE_SCHEMA_SAID); assert.equal(legalEntityCredential.sad.i, holderAid.prefix); - assert.equal(legalEntityCredential.sad.a.i, legalEntityAid.prefix); + assert.equal(legalEntityCredential.sad.a !== undefined, true); + if (legalEntityCredential.sad.a) { + assert.equal(legalEntityCredential.sad.a.i, legalEntityAid.prefix); + } assert.equal(legalEntityCredential.status.s, '0'); assert(Array.isArray(legalEntityCredential.chains)); assert(legalEntityCredential.chains.length > 0); From 5389dfad0ccb16e7b350966d8083fbb85daf5fb9 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Thu, 10 Jul 2025 15:28:58 +0700 Subject: [PATCH 05/20] resolve review comments --- scripts/generate-types.js | 22 ++++++------ src/keri/app/coring.ts | 2 +- src/keri/app/credentialing.ts | 27 ++++++--------- src/types/keria-api-schema.ts | 5 ++- test-integration/credentials.test.ts | 52 ++++++++++++++++------------ 5 files changed, 55 insertions(+), 53 deletions(-) diff --git a/scripts/generate-types.js b/scripts/generate-types.js index 19706401..037e5187 100644 --- a/scripts/generate-types.js +++ b/scripts/generate-types.js @@ -1,32 +1,32 @@ -import { execSync } from "child_process"; -import fs from "fs"; -import path from "path"; +import { execSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; const specUrl = process.env.SPEC_URL; -const outputFile = path.resolve("src/types/keria-api-schema.ts"); +const outputFile = path.resolve('src/types/keria-api-schema.ts'); if (!specUrl) { - console.log("⚠️ Skipping OpenAPI type generation: SPEC_URL is not set."); - process.exit(0); + console.log('⚠️ Skipping OpenAPI type generation: SPEC_URL is not set.'); + process.exit(0); } console.log(`📦 Generating types from ${specUrl}`); execSync(`npx openapi-typescript "${specUrl}" --output ${outputFile}`, { - stdio: "inherit", + stdio: 'inherit', }); // Read the full file -const fullContent = fs.readFileSync(outputFile, "utf8"); +const fullContent = fs.readFileSync(outputFile, 'utf8'); // Extract only the `export interface components { ... }` block const match = fullContent.match(/export interface components \{[\s\S]+?\n\}/); if (!match) { - console.error("❌ Could not find 'export interface components' block."); - process.exit(1); + console.error("❌ Could not find 'export interface components' block."); + process.exit(1); } // Add comment header const cleaned = `// AUTO-GENERATED: Only components retained from OpenAPI schema\n\n${match[0]}\n`; -fs.writeFileSync(outputFile, cleaned, "utf8"); +fs.writeFileSync(outputFile, cleaned, 'utf8'); diff --git a/src/keri/app/coring.ts b/src/keri/app/coring.ts index 987fc1cf..6eafd9e0 100644 --- a/src/keri/app/coring.ts +++ b/src/keri/app/coring.ts @@ -70,7 +70,7 @@ export type Operation = OperationBase & { depends?: Operation; [property: string]: any; }; -} +}; export interface OperationsDeps { fetch( diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index 2ce57f48..d616f3a2 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -24,9 +24,11 @@ import { HabState } from '../core/keyState.ts'; import { components } from '../../types/keria-api-schema.ts'; -type CredentialResult = components['schemas']['CredentialSchema']; -type CredentialStateIssOrRev = components['schemas']['CredentialStateIssOrRevSchema']; -type CredentialStateBisOrBrv = components['schemas']['CredentialStateBisOrBrvSchema']; +export type CredentialResult = components['schemas']['CredentialSchema']; +type CredentialStateIssOrRev = + components['schemas']['CredentialStateIssOrRevSchema']; +type CredentialStateBisOrBrv = + components['schemas']['CredentialStateBisOrBrvSchema']; /** Types of credentials */ export class CredentialTypes { @@ -235,10 +237,8 @@ export interface IpexAdmitArgs { datetime?: string; } - export type CredentialState = CredentialStateIssOrRev | CredentialStateBisOrBrv; - /** * Credentials */ @@ -277,8 +277,6 @@ export class Credentials { return await res.json(); } - - /** * Get a credential * @async @@ -286,7 +284,10 @@ export class Credentials { * @param {boolean} [includeCESR=false] - Optional flag export the credential in CESR format * @returns {Promise} A promise to the credential */ - async get(said: string, includeCESR: boolean = false): Promise { + async get( + said: string, + includeCESR: boolean = false + ): Promise { const path = `/credentials/${said}`; const method = 'GET'; const headers = includeCESR @@ -294,13 +295,7 @@ export class Credentials { : new Headers({ Accept: 'application/json' }); const res = await this.client.fetch(path, method, null, headers); - if (includeCESR) { - const text = await res.text(); - // If CESR is JSON, parse it: - return JSON.parse(text) as CredentialResult; - } else { - return await res.json(); - } + return includeCESR ? await res.text() : await res.json(); } /** @@ -435,7 +430,7 @@ export class Credentials { const dt = datetime ?? new Date().toISOString().replace('Z', '000+00:00'); - const cred = await this.get(said); + const cred = (await this.get(said)) as CredentialResult; // Create rev const _rev = { diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 8074b1af..63c06e51 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -115,6 +115,7 @@ export interface components { done?: boolean; error?: boolean; }; + EmptyDict: Record; CredentialStateIssOrRevSchema: { vn: unknown; i: string; @@ -125,9 +126,7 @@ export interface components { dt: string; /** @enum {unknown} */ et: "iss" | "rev"; - ra: { - [key: string]: unknown; - }; + ra: components["schemas"]["EmptyDict"]; }; RaFields: { i: string; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index 767afe9a..d89d98e2 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -15,7 +15,7 @@ import { import { retry } from './utils/retry.ts'; import { randomUUID } from 'node:crypto'; import { step } from './utils/test-step.ts'; - +import { CredentialResult } from '../src/keri/app/credentialing.ts'; const { vleiServerUrl } = resolveEnvironment(); const QVI_SCHEMA_SAID = 'EBfdlu8R27Fbx-ehrqwImnK-8Cm79sqbAQ4MmvEAYqao'; @@ -228,9 +228,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { }); await step('issuer get credential by id', async () => { - const issuerCredential = await issuerClient + const issuerCredential = (await issuerClient .credentials() - .get(qviCredentialId); + .get(qviCredentialId)) as CredentialResult; assert.equal(issuerCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(issuerCredential.sad.i, issuerAid.prefix); assert.equal(issuerCredential.status.s, '0'); @@ -238,9 +238,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('issuer IPEX grant', async () => { const dt = createTimestamp(); - const issuerCredential = await issuerClient + const issuerCredential = (await issuerClient .credentials() - .get(qviCredentialId); + .get(qviCredentialId)) as CredentialResult; assert(issuerCredential !== undefined); const [grant, gsigs, gend] = await issuerClient.ipex().grant({ @@ -305,9 +305,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('holder has credential', async () => { const holderCredential = await retry(async () => { - const result = await holderClient + const result = (await holderClient .credentials() - .get(qviCredentialId); + .get(qviCredentialId)) as CredentialResult; assert(result !== undefined); return result; }); @@ -418,9 +418,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await markAndRemoveNotification(holderClient, holderAgreeNote); - const holderCredential = await holderClient + const holderCredential = (await holderClient .credentials() - .get(qviCredentialId); + .get(qviCredentialId)) as CredentialResult; const [grant2, gsigs2, gend2] = await holderClient.ipex().grant({ senderName: holderAid.name, @@ -472,11 +472,14 @@ test('single signature credentials', { timeout: 90000 }, async () => { await markAndRemoveNotification(verifierClient, verifierGrantNote); - const verifierCredential = await retry(async () => + const verifierCredential = (await retry(async () => verifierClient.credentials().get(qviCredentialId) - ); + )) as CredentialResult; - console.log('verifierCredential from credentials().get', verifierCredential); + console.log( + 'verifierCredential from credentials().get', + verifierCredential + ); assert.equal(verifierCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(verifierCredential.sad.i, issuerAid.prefix); @@ -512,9 +515,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { const leCredentialId = await step( 'holder create LE (chained) credential', async () => { - const qviCredential = await holderClient + const qviCredential = (await holderClient .credentials() - .get(qviCredentialId); + .get(qviCredentialId)) as CredentialResult; const result = await holderClient .credentials() @@ -550,9 +553,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('LE credential IPEX grant', async () => { const dt = createTimestamp(); - const leCredential = await holderClient + const leCredential = (await holderClient .credentials() - .get(leCredentialId); + .get(leCredentialId)) as CredentialResult; assert(leCredential !== undefined); const [grant, gsigs, gend] = await holderClient.ipex().grant({ @@ -607,11 +610,14 @@ test('single signature credentials', { timeout: 90000 }, async () => { }); await step('Legal Entity has chained credential', async () => { - const legalEntityCredential = await retry(async () => + const legalEntityCredential = (await retry(async () => legalEntityClient.credentials().get(leCredentialId) - ); + )) as CredentialResult; - console.log('legalEntityCredential from credentials().get', legalEntityCredential); + console.log( + 'legalEntityCredential from credentials().get', + legalEntityCredential + ); assert.equal(legalEntityCredential.sad.s, LE_SCHEMA_SAID); assert.equal(legalEntityCredential.sad.i, holderAid.prefix); @@ -622,7 +628,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { assert.equal(legalEntityCredential.status.s, '0'); assert(Array.isArray(legalEntityCredential.chains)); assert(legalEntityCredential.chains.length > 0); - const firstChain = legalEntityCredential.chains[0] as { sad: { d: string } }; + const firstChain = legalEntityCredential.chains[0] as { + sad: { d: string }; + }; assert.equal(firstChain.sad.d, qviCredentialId); assert(legalEntityCredential.atc !== undefined); }); @@ -633,9 +641,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { .revoke(issuerAid.name, qviCredentialId); await waitOperation(issuerClient, revokeOperation.op); - const issuerCredential = await issuerClient + const issuerCredential = (await issuerClient .credentials() - .get(qviCredentialId); + .get(qviCredentialId)) as CredentialResult; assert.equal(issuerCredential.status.s, '1'); }); From 4b3644a0dfca23cf367fdae162d7279cdfd5a374 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 11 Jul 2025 18:06:41 +0700 Subject: [PATCH 06/20] fix credentials types + add registries's types --- src/keri/app/credentialing.ts | 9 +++++---- src/types/keria-api-schema.ts | 6 ++++++ test-integration/credentials.test.ts | 6 +----- test-integration/multisig-vlei-issuance.test.ts | 3 +++ 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index d616f3a2..bd006fd2 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -25,6 +25,7 @@ import { HabState } from '../core/keyState.ts'; import { components } from '../../types/keria-api-schema.ts'; export type CredentialResult = components['schemas']['CredentialSchema']; +export type Registry = components['schemas']['RegistrySchema']; type CredentialStateIssOrRev = components['schemas']['CredentialStateIssOrRevSchema']; type CredentialStateBisOrBrv = @@ -258,7 +259,7 @@ export class Credentials { * @param {CredentialFilter} [kargs] Optional parameters to filter the credentials * @returns {Promise} A promise to the list of credentials */ - async list(kargs: CredentialFilter = {}): Promise { + async list(kargs: CredentialFilter = {}): Promise { const path = `/credentials/query`; const filtr = kargs.filter === undefined ? {} : kargs.filter; const sort = kargs.sort === undefined ? [] : kargs.sort; @@ -545,7 +546,7 @@ export class RegistryResult { return this._sigs; } - async op(): Promise { + async op(): Promise { const res = await this.promise; return await res.json(); } @@ -570,7 +571,7 @@ export class Registries { * @param {string} name Name or alias of the identifier * @returns {Promise} A promise to the list of registries */ - async list(name: string): Promise { + async list(name: string): Promise { const path = `/identifiers/${name}/registries`; const method = 'GET'; const res = await this.client.fetch(path, method, null); @@ -679,7 +680,7 @@ export class Registries { name: string, registryName: string, newName: string - ): Promise { + ): Promise { const path = `/identifiers/${name}/registries/${registryName}`; const method = 'PUT'; const data = { diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 63c06e51..3c813aec 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -149,6 +149,12 @@ export interface components { metadata?: Record; response?: Record; }; + RegistrySchema: { + name: string; + regk: string; + pre: string; + state: components["schemas"]["CredentialStateIssOrRevSchema"] | components["schemas"]["CredentialStateBisOrBrvSchema"]; + }; }; responses: never; parameters: never; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index d89d98e2..20907dfe 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -170,6 +170,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('issuer list credentials', async () => { const issuerCredentials = await issuerClient.credentials().list(); + assertLength(issuerCredentials, 1); assert(issuerCredentials.length >= 1); assert.equal(issuerCredentials[0].sad.s, QVI_SCHEMA_SAID); assert.equal(issuerCredentials[0].sad.i, issuerAid.prefix); @@ -476,11 +477,6 @@ test('single signature credentials', { timeout: 90000 }, async () => { verifierClient.credentials().get(qviCredentialId) )) as CredentialResult; - console.log( - 'verifierCredential from credentials().get', - verifierCredential - ); - assert.equal(verifierCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(verifierCredential.sad.i, issuerAid.prefix); assert.equal(verifierCredential.status.s, '0'); // 0 = issued diff --git a/test-integration/multisig-vlei-issuance.test.ts b/test-integration/multisig-vlei-issuance.test.ts index c1775279..662fea4f 100644 --- a/test-integration/multisig-vlei-issuance.test.ts +++ b/test-integration/multisig-vlei-issuance.test.ts @@ -609,6 +609,7 @@ test('multisig-vlei-issuance', async function run() { assert.equal(qviCredbyGAR1.sad.d, qviCredbyGAR2.sad.d); assert.equal(qviCredbyGAR1.sad.s, QVI_SCHEMA_SAID); assert.equal(qviCredbyGAR1.sad.i, aidGEDA.prefix); + assert(qviCredbyGAR1.sad.a !== undefined, "qviCredbyGAR1.sad.a is undefined"); assert.equal(qviCredbyGAR1.sad.a.i, aidQVI.prefix); assert.equal(qviCredbyGAR1.status.s, '0'); assert(qviCredbyGAR1.atc !== undefined); @@ -986,6 +987,7 @@ test('multisig-vlei-issuance', async function run() { assert.equal(leCredbyQAR1.sad.d, leCredbyQAR3.sad.d); assert.equal(leCredbyQAR1.sad.s, LE_SCHEMA_SAID); assert.equal(leCredbyQAR1.sad.i, aidQVI.prefix); + assert(leCredbyQAR1.sad.a !== undefined, "leCredbyQAR1.sad.a is undefined"); assert.equal(leCredbyQAR1.sad.a.i, aidLE.prefix); assert.equal(leCredbyQAR1.status.s, '0'); assert(leCredbyQAR1.atc !== undefined); @@ -1234,6 +1236,7 @@ test('multisig-vlei-issuance', async function run() { assert.equal(ecrCredbyLAR1.sad.d, ecrCredbyLAR3.sad.d); assert.equal(ecrCredbyLAR1.sad.s, ECR_SCHEMA_SAID); assert.equal(ecrCredbyLAR1.sad.i, aidLE.prefix); + assert(ecrCredbyLAR1.sad.a !== undefined, "ecrCredbyLAR1.sad.a is undefined"); assert.equal(ecrCredbyLAR1.sad.a.i, aidECR.prefix); assert.equal(ecrCredbyLAR1.status.s, '0'); assert(ecrCredbyLAR1.atc !== undefined); From fd747e852c5cebc3fd90d26097e83803d9fe0104 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Mon, 14 Jul 2025 17:25:54 +0700 Subject: [PATCH 07/20] Add more types for credentialing --- src/keri/app/credentialing.ts | 25 +++++++++++-------------- src/types/keria-api-schema.ts | 3 ++- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index bd006fd2..6fb0376a 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -26,10 +26,7 @@ import { components } from '../../types/keria-api-schema.ts'; export type CredentialResult = components['schemas']['CredentialSchema']; export type Registry = components['schemas']['RegistrySchema']; -type CredentialStateIssOrRev = - components['schemas']['CredentialStateIssOrRevSchema']; -type CredentialStateBisOrBrv = - components['schemas']['CredentialStateBisOrBrvSchema']; +export type Schema = components['schemas']['SchemaSchema']; /** Types of credentials */ export class CredentialTypes { @@ -238,7 +235,7 @@ export interface IpexAdmitArgs { datetime?: string; } -export type CredentialState = CredentialStateIssOrRev | CredentialStateBisOrBrv; +export type CredentialState = components['schemas']['CredentialStateSchema']; /** * Credentials @@ -257,7 +254,7 @@ export class Credentials { * List credentials * @async * @param {CredentialFilter} [kargs] Optional parameters to filter the credentials - * @returns {Promise} A promise to the list of credentials + * @returns {Promise} A promise to the list of credentials */ async list(kargs: CredentialFilter = {}): Promise { const path = `/credentials/query`; @@ -283,7 +280,7 @@ export class Credentials { * @async * @param {string} said - SAID of the credential * @param {boolean} [includeCESR=false] - Optional flag export the credential in CESR format - * @returns {Promise} A promise to the credential + * @returns {Promise} A promise to the credential */ async get( said: string, @@ -417,7 +414,7 @@ export class Credentials { * @param {string} name Name or alias of the identifier * @param {string} said SAID of the credential * @param {string} datetime date time of revocation - * @returns {Promise} A promise to the long-running operation + * @returns {Promise} A promise to the long-running operation */ async revoke( name: string, @@ -569,7 +566,7 @@ export class Registries { * List registries * @async * @param {string} name Name or alias of the identifier - * @returns {Promise} A promise to the list of registries + * @returns {Promise} A promise to the list of registries */ async list(name: string): Promise { const path = `/identifiers/${name}/registries`; @@ -674,7 +671,7 @@ export class Registries { * @param {string} name Name or alias of the identifier * @param {string} registryName Current registry name * @param {string} newName New registry name - * @returns {Promise} A promise to the registry record + * @returns {Promise} A promise to the registry record */ async rename( name: string, @@ -707,9 +704,9 @@ export class Schemas { * Get a schema * @async * @param {string} said SAID of the schema - * @returns {Promise} A promise to the schema + * @returns {Promise} A promise to the schema */ - async get(said: string): Promise { + async get(said: string): Promise { const path = `/schema/${said}`; const method = 'GET'; const res = await this.client.fetch(path, method, null); @@ -719,9 +716,9 @@ export class Schemas { /** * List schemas * @async - * @returns {Promise} A promise to the list of schemas + * @returns {Promise} A promise to the list of schemas */ - async list(): Promise { + async list(): Promise { const path = `/schema`; const method = 'GET'; const res = await this.client.fetch(path, method, null); diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 3c813aec..bbdc9450 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -149,11 +149,12 @@ export interface components { metadata?: Record; response?: Record; }; + CredentialStateSchema: components["schemas"]["CredentialStateIssOrRevSchema"] | components["schemas"]["CredentialStateBisOrBrvSchema"]; RegistrySchema: { name: string; regk: string; pre: string; - state: components["schemas"]["CredentialStateIssOrRevSchema"] | components["schemas"]["CredentialStateBisOrBrvSchema"]; + state: components["schemas"]["CredentialStateSchema"]; }; }; responses: never; From feb6b6efaf7b01f8df6d7a854524b6e63fdb91c2 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Wed, 16 Jul 2025 15:09:54 +0700 Subject: [PATCH 08/20] resolve review comments --- src/keri/app/credentialing.ts | 8 +-- src/types/keria-api-schema.ts | 85 +++++++++++++++------------- test-integration/credentials.test.ts | 9 +-- 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index 6fb0376a..062f25f9 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -24,9 +24,9 @@ import { HabState } from '../core/keyState.ts'; import { components } from '../../types/keria-api-schema.ts'; -export type CredentialResult = components['schemas']['CredentialSchema']; -export type Registry = components['schemas']['RegistrySchema']; -export type Schema = components['schemas']['SchemaSchema']; +export type CredentialResult = components['schemas']['Credential']; +export type Registry = components['schemas']['Registry']; +export type Schema = components['schemas']['Schema']; /** Types of credentials */ export class CredentialTypes { @@ -235,7 +235,7 @@ export interface IpexAdmitArgs { datetime?: string; } -export type CredentialState = components['schemas']['CredentialStateSchema']; +export type CredentialState = components['schemas']['CredentialState']; /** * Credentials diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index bbdc9450..af3ee722 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -2,7 +2,7 @@ export interface components { schemas: { - SADSchema: { + ACDC: { v: string; d: string; i: string; @@ -15,13 +15,14 @@ export interface components { e?: unknown[]; r?: unknown[]; }; - SADAttributesSchema: { - d: string; - LEI: string; - dt: string; + ACDCAttributes: { + dt?: string; i?: string; + u?: string; + } & { + [key: string]: unknown; }; - ISSSchema: { + IssEvt: { v: string; t: string; d: string; @@ -30,7 +31,7 @@ export interface components { ri: string; dt: string; }; - SchemaSchema: { + Schema: { $id: string; $schema: string; title: string; @@ -44,11 +45,11 @@ export interface components { additionalProperties: boolean; required: string[]; }; - StatusAnchorSchema: { + StatusAnchor: { s: number; d: string; }; - CredentialStatusSchema: { + CredentialStatus: { vn: number[]; i: string; s: string; @@ -57,50 +58,61 @@ export interface components { ra: { [key: string]: unknown; }; - a: components["schemas"]["StatusAnchorSchema"]; + a: components["schemas"]["StatusAnchor"]; dt: string; et: string; }; - AnchorSchema: { + Anchor: { pre: string; sn: number; d: string; }; - SealSchema: { + Seal: { s: string; d: string; i?: string; - t?: string; - p?: string; }; - ANCSchema: { + ANC: { v: string; t: string; d: string; i: string; s: string; p: string; - a: components["schemas"]["SealSchema"][]; + di?: string; + a?: unknown[]; + }; + CredentialStateBase: { + vn: unknown; + i: string; + s: string; + d: string; + ri: string; + a: components["schemas"]["Seal"]; + dt: string; + et: string; }; - CredentialSchema: { - sad: components["schemas"]["SADSchema"]; + Credential: { + sad: components["schemas"]["ACDC"]; atc: string; - iss: components["schemas"]["ISSSchema"]; - issAtc: string; + iss: components["schemas"]["IssEvt"]; + issatc: string; pre: string; - schema: components["schemas"]["SchemaSchema"]; + schema: components["schemas"]["Schema"]; chains: { [key: string]: unknown; }[]; - status: components["schemas"]["CredentialStateIssOrRevSchema"] | components["schemas"]["CredentialStateBisOrBrvSchema"]; - anchor: components["schemas"]["AnchorSchema"]; - anc: components["schemas"]["ANCSchema"]; - ancAttachment: string; + status: components["schemas"]["CredentialState"]; + anchor: components["schemas"]["Anchor"]; + anc: components["schemas"]["ANC"]; + ancatc: string; }; - OperationBaseSchema: { + OperationBase: { name: string; done?: boolean; - error?: boolean; + error?: { + [key: string]: unknown; + }; }; StatusSchema: { code: number; @@ -110,19 +122,14 @@ export interface components { [key: string]: unknown; } | null; }; - OperationBase: { - name: string; - done?: boolean; - error?: boolean; - }; EmptyDict: Record; - CredentialStateIssOrRevSchema: { + CredentialStateIssOrRev: { vn: unknown; i: string; s: string; d: string; ri: string; - a: components["schemas"]["SealSchema"]; + a: components["schemas"]["Seal"]; dt: string; /** @enum {unknown} */ et: "iss" | "rev"; @@ -133,28 +140,28 @@ export interface components { s: string; d: string; }; - CredentialStateBisOrBrvSchema: { + CredentialStateBisOrBrv: { vn: unknown; i: string; s: string; d: string; ri: string; - a: components["schemas"]["SealSchema"]; + a: components["schemas"]["Seal"]; dt: string; /** @enum {unknown} */ et: "bis" | "brv"; ra: components["schemas"]["RaFields"]; }; + CredentialState: components["schemas"]["CredentialStateIssOrRev"] | components["schemas"]["CredentialStateBisOrBrv"]; Operation: components["schemas"]["OperationBase"] & { metadata?: Record; response?: Record; }; - CredentialStateSchema: components["schemas"]["CredentialStateIssOrRevSchema"] | components["schemas"]["CredentialStateBisOrBrvSchema"]; - RegistrySchema: { + Registry: { name: string; regk: string; pre: string; - state: components["schemas"]["CredentialStateSchema"]; + state: components["schemas"]["CredentialState"]; }; }; responses: never; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index 20907dfe..c01fd3a6 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -232,6 +232,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { const issuerCredential = (await issuerClient .credentials() .get(qviCredentialId)) as CredentialResult; + assert(issuerCredential !== undefined); assert.equal(issuerCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(issuerCredential.sad.i, issuerAid.prefix); assert.equal(issuerCredential.status.s, '0'); @@ -249,7 +250,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { acdc: new Serder(issuerCredential.sad), anc: new Serder(issuerCredential.anc), iss: new Serder(issuerCredential.iss), - ancAttachment: issuerCredential.ancAttachment, + ancAttachment: issuerCredential.ancatc, recipient: holderAid.prefix, datetime: dt, }); @@ -430,8 +431,8 @@ test('single signature credentials', { timeout: 90000 }, async () => { anc: new Serder(holderCredential.anc), iss: new Serder(holderCredential.iss), acdcAttachment: holderCredential.atc, - ancAttachment: holderCredential.ancAttachment, - issAttachment: holderCredential.issAtc, + ancAttachment: holderCredential.ancatc, + issAttachment: holderCredential.issatc, agreeSaid: agreeSaid, datetime: createTimestamp(), }); @@ -559,7 +560,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { acdc: new Serder(leCredential.sad), anc: new Serder(leCredential.anc), iss: new Serder(leCredential.iss), - ancAttachment: leCredential.ancAttachment, + ancAttachment: leCredential.ancatc, recipient: legalEntityAid.prefix, datetime: dt, }); From d21e90182a09d89a75dd169cc3ddc0e98620ef9a Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Wed, 16 Jul 2025 17:42:24 +0700 Subject: [PATCH 09/20] fix errors/warning for swagger validator --- src/types/keria-api-schema.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index af3ee722..c07b6f0a 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -117,8 +117,7 @@ export interface components { StatusSchema: { code: number; message: string; - /** @default null */ - details: { + details?: { [key: string]: unknown; } | null; }; From 7ce750a09f72d42a9ed3d3eee3324dbe1d8e7be2 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Thu, 17 Jul 2025 17:29:31 +0700 Subject: [PATCH 10/20] re-generate types --- src/types/keria-api-schema.ts | 37 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index c07b6f0a..ad80eb95 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -24,7 +24,8 @@ export interface components { }; IssEvt: { v: string; - t: string; + /** @enum {unknown} */ + t: "iss" | "bis"; d: string; i: string; s: string; @@ -82,16 +83,6 @@ export interface components { di?: string; a?: unknown[]; }; - CredentialStateBase: { - vn: unknown; - i: string; - s: string; - d: string; - ri: string; - a: components["schemas"]["Seal"]; - dt: string; - et: string; - }; Credential: { sad: components["schemas"]["ACDC"]; atc: string; @@ -107,20 +98,18 @@ export interface components { anc: components["schemas"]["ANC"]; ancatc: string; }; - OperationBase: { - name: string; - done?: boolean; - error?: { - [key: string]: unknown; - }; - }; - StatusSchema: { + OperationStatus: { code: number; message: string; details?: { [key: string]: unknown; } | null; }; + OperationBase: { + name: string; + error?: components["schemas"]["OperationStatus"]; + done?: boolean; + }; EmptyDict: Record; CredentialStateIssOrRev: { vn: unknown; @@ -156,6 +145,16 @@ export interface components { metadata?: Record; response?: Record; }; + CredentialStateBase: { + vn: unknown; + i: string; + s: string; + d: string; + ri: string; + a: components["schemas"]["Seal"]; + dt: string; + et: string; + }; Registry: { name: string; regk: string; From 178d404f6ebff7177d91da3c6df3097448acf0de Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 18 Jul 2025 11:25:15 +0700 Subject: [PATCH 11/20] re-generate types --- src/types/keria-api-schema.ts | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index ad80eb95..3b3df4bd 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -2,26 +2,24 @@ export interface components { schemas: { + ACDCAttributes: { + dt?: string; + i?: string; + u?: string; + } & { + [key: string]: unknown; + }; ACDC: { v: string; d: string; i: string; s: string; ri?: string; - a?: { - [key: string]: unknown; - }; + a?: components["schemas"]["ACDCAttributes"]; u?: string; e?: unknown[]; r?: unknown[]; }; - ACDCAttributes: { - dt?: string; - i?: string; - u?: string; - } & { - [key: string]: unknown; - }; IssEvt: { v: string; /** @enum {unknown} */ @@ -81,7 +79,7 @@ export interface components { s: string; p: string; di?: string; - a?: unknown[]; + a?: components["schemas"]["Seal"][]; }; Credential: { sad: components["schemas"]["ACDC"]; @@ -145,16 +143,6 @@ export interface components { metadata?: Record; response?: Record; }; - CredentialStateBase: { - vn: unknown; - i: string; - s: string; - d: string; - ri: string; - a: components["schemas"]["Seal"]; - dt: string; - et: string; - }; Registry: { name: string; regk: string; From 4890016238b998ae8d7750a519043f150a53e7f1 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 18 Jul 2025 15:36:25 +0700 Subject: [PATCH 12/20] remove debug logs and add multiple overload signatures --- src/keri/app/credentialing.ts | 5 ++++- test-integration/credentials.test.ts | 26 +++++++++----------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index 062f25f9..cdb7d184 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -282,6 +282,9 @@ export class Credentials { * @param {boolean} [includeCESR=false] - Optional flag export the credential in CESR format * @returns {Promise} A promise to the credential */ + async get(said: string): Promise; + async get(said: string, includeCESR: false): Promise; + async get(said: string, includeCESR: true): Promise; async get( said: string, includeCESR: boolean = false @@ -428,7 +431,7 @@ export class Credentials { const dt = datetime ?? new Date().toISOString().replace('Z', '000+00:00'); - const cred = (await this.get(said)) as CredentialResult; + const cred = (await this.get(said)); // Create rev const _rev = { diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index c01fd3a6..37a45ad6 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -138,8 +138,6 @@ test('single signature credentials', { timeout: 90000 }, async () => { const issuerLeSchema = await issuerClient.schemas().get(LE_SCHEMA_SAID); - console.log('issuerLeSchema', issuerLeSchema); - assert.equal(issuerLeSchema.$id, LE_SCHEMA_SAID); }); @@ -231,7 +229,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('issuer get credential by id', async () => { const issuerCredential = (await issuerClient .credentials() - .get(qviCredentialId)) as CredentialResult; + .get(qviCredentialId)); assert(issuerCredential !== undefined); assert.equal(issuerCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(issuerCredential.sad.i, issuerAid.prefix); @@ -242,7 +240,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { const dt = createTimestamp(); const issuerCredential = (await issuerClient .credentials() - .get(qviCredentialId)) as CredentialResult; + .get(qviCredentialId)); assert(issuerCredential !== undefined); const [grant, gsigs, gend] = await issuerClient.ipex().grant({ @@ -309,7 +307,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { const holderCredential = await retry(async () => { const result = (await holderClient .credentials() - .get(qviCredentialId)) as CredentialResult; + .get(qviCredentialId)); assert(result !== undefined); return result; }); @@ -422,7 +420,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { const holderCredential = (await holderClient .credentials() - .get(qviCredentialId)) as CredentialResult; + .get(qviCredentialId)); const [grant2, gsigs2, gend2] = await holderClient.ipex().grant({ senderName: holderAid.name, @@ -476,7 +474,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { const verifierCredential = (await retry(async () => verifierClient.credentials().get(qviCredentialId) - )) as CredentialResult; + )); assert.equal(verifierCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(verifierCredential.sad.i, issuerAid.prefix); @@ -514,7 +512,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { async () => { const qviCredential = (await holderClient .credentials() - .get(qviCredentialId)) as CredentialResult; + .get(qviCredentialId)); const result = await holderClient .credentials() @@ -552,7 +550,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { const dt = createTimestamp(); const leCredential = (await holderClient .credentials() - .get(leCredentialId)) as CredentialResult; + .get(leCredentialId)); assert(leCredential !== undefined); const [grant, gsigs, gend] = await holderClient.ipex().grant({ @@ -609,13 +607,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('Legal Entity has chained credential', async () => { const legalEntityCredential = (await retry(async () => legalEntityClient.credentials().get(leCredentialId) - )) as CredentialResult; - - console.log( - 'legalEntityCredential from credentials().get', - legalEntityCredential - ); - + )); assert.equal(legalEntityCredential.sad.s, LE_SCHEMA_SAID); assert.equal(legalEntityCredential.sad.i, holderAid.prefix); assert.equal(legalEntityCredential.sad.a !== undefined, true); @@ -640,7 +632,7 @@ test('single signature credentials', { timeout: 90000 }, async () => { await waitOperation(issuerClient, revokeOperation.op); const issuerCredential = (await issuerClient .credentials() - .get(qviCredentialId)) as CredentialResult; + .get(qviCredentialId)); assert.equal(issuerCredential.status.s, '1'); }); From fc282725f9bc01423fb038b0b4b49eff8810fff9 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 5 Sep 2025 10:29:24 +0700 Subject: [PATCH 13/20] separate generate:types and build --- README.md | 20 ++++++++++++++------ package.json | 4 ++-- scripts/generate-types.js | 7 +------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index fee4e067..e07c9fe3 100644 --- a/README.md +++ b/README.md @@ -39,16 +39,24 @@ The code is built using Typescript and running code locally requires a Mac or Li Typescript source files needs to be transpiled before running scripts or integration tests -- Build: +- Generate types: - ```bash - npm run build + To generate TypeScript types from KERIA OpenAPI docs dynamically + + ``` + npm run generate:types ``` - To build and generate TypeScript types from KERIA OpenAPI docs dynamically - + We can specify KERIA spec url by this command: + ``` - SPEC_URL=http://localhost:3902/spec.yaml npm run build + SPEC_URL=http://localhost:3902/spec.yaml npm run generate:types + ``` + +- Build: + + ```bash + npm run build ``` - ready() must be called before library is useable. Example minimum viable client code. diff --git a/package.json b/package.json index fc2ae03c..7afeab79 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,12 @@ "scripts": { "start": "npm run build -- --watch", "generate:types": "node scripts/generate-types.js", - "build": "npm run generate:types && tsc -p tsconfig.build.json && tsc -p tsconfig.json --noEmit", + "build": "tsc -p tsconfig.build.json && tsc -p tsconfig.json --noEmit", "test": "vitest", "prepare": "tsc -p tsconfig.build.json", "test:integration": "vitest -c vitest.integration.ts", "lint": "eslint src test test-integration", - "generate-docs": "typedoc src/index.ts", + "generate:docs": "typedoc src/index.ts", "pretty": "prettier --write .", "pretty:check": "prettier --check ." }, diff --git a/scripts/generate-types.js b/scripts/generate-types.js index 037e5187..e82304d9 100644 --- a/scripts/generate-types.js +++ b/scripts/generate-types.js @@ -2,14 +2,9 @@ import { execSync } from 'child_process'; import fs from 'fs'; import path from 'path'; -const specUrl = process.env.SPEC_URL; +const specUrl = process.env.SPEC_URL || 'http://localhost:3902/spec.yaml'; const outputFile = path.resolve('src/types/keria-api-schema.ts'); -if (!specUrl) { - console.log('⚠️ Skipping OpenAPI type generation: SPEC_URL is not set.'); - process.exit(0); -} - console.log(`📦 Generating types from ${specUrl}`); execSync(`npx openapi-typescript "${specUrl}" --output ${outputFile}`, { stdio: 'inherit', From d81737a5596ed085c7113833f0954da667b9bfa2 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Wed, 10 Sep 2025 09:09:18 +0700 Subject: [PATCH 14/20] fix formatting --- README.md | 2 +- src/keri/app/credentialing.ts | 2 +- src/types/keria-api-schema.ts | 42 ++++++++++--------- test-integration/credentials.test.ts | 36 ++++++++-------- .../multisig-vlei-issuance.test.ts | 12 ++++-- 5 files changed, 51 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index e07c9fe3..acb3e24c 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Typescript source files needs to be transpiled before running scripts or integra - Generate types: To generate TypeScript types from KERIA OpenAPI docs dynamically - + ``` npm run generate:types ``` diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index cdb7d184..6c19b769 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -431,7 +431,7 @@ export class Credentials { const dt = datetime ?? new Date().toISOString().replace('Z', '000+00:00'); - const cred = (await this.get(said)); + const cred = await this.get(said); // Create rev const _rev = { diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 3b3df4bd..35917bfd 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -15,7 +15,7 @@ export interface components { i: string; s: string; ri?: string; - a?: components["schemas"]["ACDCAttributes"]; + a?: components['schemas']['ACDCAttributes']; u?: string; e?: unknown[]; r?: unknown[]; @@ -23,7 +23,7 @@ export interface components { IssEvt: { v: string; /** @enum {unknown} */ - t: "iss" | "bis"; + t: 'iss' | 'bis'; d: string; i: string; s: string; @@ -57,7 +57,7 @@ export interface components { ra: { [key: string]: unknown; }; - a: components["schemas"]["StatusAnchor"]; + a: components['schemas']['StatusAnchor']; dt: string; et: string; }; @@ -79,21 +79,21 @@ export interface components { s: string; p: string; di?: string; - a?: components["schemas"]["Seal"][]; + a?: components['schemas']['Seal'][]; }; Credential: { - sad: components["schemas"]["ACDC"]; + sad: components['schemas']['ACDC']; atc: string; - iss: components["schemas"]["IssEvt"]; + iss: components['schemas']['IssEvt']; issatc: string; pre: string; - schema: components["schemas"]["Schema"]; + schema: components['schemas']['Schema']; chains: { [key: string]: unknown; }[]; - status: components["schemas"]["CredentialState"]; - anchor: components["schemas"]["Anchor"]; - anc: components["schemas"]["ANC"]; + status: components['schemas']['CredentialState']; + anchor: components['schemas']['Anchor']; + anc: components['schemas']['ANC']; ancatc: string; }; OperationStatus: { @@ -105,7 +105,7 @@ export interface components { }; OperationBase: { name: string; - error?: components["schemas"]["OperationStatus"]; + error?: components['schemas']['OperationStatus']; done?: boolean; }; EmptyDict: Record; @@ -115,11 +115,11 @@ export interface components { s: string; d: string; ri: string; - a: components["schemas"]["Seal"]; + a: components['schemas']['Seal']; dt: string; /** @enum {unknown} */ - et: "iss" | "rev"; - ra: components["schemas"]["EmptyDict"]; + et: 'iss' | 'rev'; + ra: components['schemas']['EmptyDict']; }; RaFields: { i: string; @@ -132,14 +132,16 @@ export interface components { s: string; d: string; ri: string; - a: components["schemas"]["Seal"]; + a: components['schemas']['Seal']; dt: string; /** @enum {unknown} */ - et: "bis" | "brv"; - ra: components["schemas"]["RaFields"]; + et: 'bis' | 'brv'; + ra: components['schemas']['RaFields']; }; - CredentialState: components["schemas"]["CredentialStateIssOrRev"] | components["schemas"]["CredentialStateBisOrBrv"]; - Operation: components["schemas"]["OperationBase"] & { + CredentialState: + | components['schemas']['CredentialStateIssOrRev'] + | components['schemas']['CredentialStateBisOrBrv']; + Operation: components['schemas']['OperationBase'] & { metadata?: Record; response?: Record; }; @@ -147,7 +149,7 @@ export interface components { name: string; regk: string; pre: string; - state: components["schemas"]["CredentialState"]; + state: components['schemas']['CredentialState']; }; }; responses: never; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index 37a45ad6..4409069d 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -227,9 +227,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { }); await step('issuer get credential by id', async () => { - const issuerCredential = (await issuerClient + const issuerCredential = await issuerClient .credentials() - .get(qviCredentialId)); + .get(qviCredentialId); assert(issuerCredential !== undefined); assert.equal(issuerCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(issuerCredential.sad.i, issuerAid.prefix); @@ -238,9 +238,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('issuer IPEX grant', async () => { const dt = createTimestamp(); - const issuerCredential = (await issuerClient + const issuerCredential = await issuerClient .credentials() - .get(qviCredentialId)); + .get(qviCredentialId); assert(issuerCredential !== undefined); const [grant, gsigs, gend] = await issuerClient.ipex().grant({ @@ -305,9 +305,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('holder has credential', async () => { const holderCredential = await retry(async () => { - const result = (await holderClient + const result = await holderClient .credentials() - .get(qviCredentialId)); + .get(qviCredentialId); assert(result !== undefined); return result; }); @@ -418,9 +418,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await markAndRemoveNotification(holderClient, holderAgreeNote); - const holderCredential = (await holderClient + const holderCredential = await holderClient .credentials() - .get(qviCredentialId)); + .get(qviCredentialId); const [grant2, gsigs2, gend2] = await holderClient.ipex().grant({ senderName: holderAid.name, @@ -472,9 +472,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await markAndRemoveNotification(verifierClient, verifierGrantNote); - const verifierCredential = (await retry(async () => + const verifierCredential = await retry(async () => verifierClient.credentials().get(qviCredentialId) - )); + ); assert.equal(verifierCredential.sad.s, QVI_SCHEMA_SAID); assert.equal(verifierCredential.sad.i, issuerAid.prefix); @@ -510,9 +510,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { const leCredentialId = await step( 'holder create LE (chained) credential', async () => { - const qviCredential = (await holderClient + const qviCredential = await holderClient .credentials() - .get(qviCredentialId)); + .get(qviCredentialId); const result = await holderClient .credentials() @@ -548,9 +548,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { await step('LE credential IPEX grant', async () => { const dt = createTimestamp(); - const leCredential = (await holderClient + const leCredential = await holderClient .credentials() - .get(leCredentialId)); + .get(leCredentialId); assert(leCredential !== undefined); const [grant, gsigs, gend] = await holderClient.ipex().grant({ @@ -605,9 +605,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { }); await step('Legal Entity has chained credential', async () => { - const legalEntityCredential = (await retry(async () => + const legalEntityCredential = await retry(async () => legalEntityClient.credentials().get(leCredentialId) - )); + ); assert.equal(legalEntityCredential.sad.s, LE_SCHEMA_SAID); assert.equal(legalEntityCredential.sad.i, holderAid.prefix); assert.equal(legalEntityCredential.sad.a !== undefined, true); @@ -630,9 +630,9 @@ test('single signature credentials', { timeout: 90000 }, async () => { .revoke(issuerAid.name, qviCredentialId); await waitOperation(issuerClient, revokeOperation.op); - const issuerCredential = (await issuerClient + const issuerCredential = await issuerClient .credentials() - .get(qviCredentialId)); + .get(qviCredentialId); assert.equal(issuerCredential.status.s, '1'); }); diff --git a/test-integration/multisig-vlei-issuance.test.ts b/test-integration/multisig-vlei-issuance.test.ts index 662fea4f..553697dc 100644 --- a/test-integration/multisig-vlei-issuance.test.ts +++ b/test-integration/multisig-vlei-issuance.test.ts @@ -609,7 +609,10 @@ test('multisig-vlei-issuance', async function run() { assert.equal(qviCredbyGAR1.sad.d, qviCredbyGAR2.sad.d); assert.equal(qviCredbyGAR1.sad.s, QVI_SCHEMA_SAID); assert.equal(qviCredbyGAR1.sad.i, aidGEDA.prefix); - assert(qviCredbyGAR1.sad.a !== undefined, "qviCredbyGAR1.sad.a is undefined"); + assert( + qviCredbyGAR1.sad.a !== undefined, + 'qviCredbyGAR1.sad.a is undefined' + ); assert.equal(qviCredbyGAR1.sad.a.i, aidQVI.prefix); assert.equal(qviCredbyGAR1.status.s, '0'); assert(qviCredbyGAR1.atc !== undefined); @@ -987,7 +990,7 @@ test('multisig-vlei-issuance', async function run() { assert.equal(leCredbyQAR1.sad.d, leCredbyQAR3.sad.d); assert.equal(leCredbyQAR1.sad.s, LE_SCHEMA_SAID); assert.equal(leCredbyQAR1.sad.i, aidQVI.prefix); - assert(leCredbyQAR1.sad.a !== undefined, "leCredbyQAR1.sad.a is undefined"); + assert(leCredbyQAR1.sad.a !== undefined, 'leCredbyQAR1.sad.a is undefined'); assert.equal(leCredbyQAR1.sad.a.i, aidLE.prefix); assert.equal(leCredbyQAR1.status.s, '0'); assert(leCredbyQAR1.atc !== undefined); @@ -1236,7 +1239,10 @@ test('multisig-vlei-issuance', async function run() { assert.equal(ecrCredbyLAR1.sad.d, ecrCredbyLAR3.sad.d); assert.equal(ecrCredbyLAR1.sad.s, ECR_SCHEMA_SAID); assert.equal(ecrCredbyLAR1.sad.i, aidLE.prefix); - assert(ecrCredbyLAR1.sad.a !== undefined, "ecrCredbyLAR1.sad.a is undefined"); + assert( + ecrCredbyLAR1.sad.a !== undefined, + 'ecrCredbyLAR1.sad.a is undefined' + ); assert.equal(ecrCredbyLAR1.sad.a.i, aidECR.prefix); assert.equal(ecrCredbyLAR1.status.s, '0'); assert(ecrCredbyLAR1.atc !== undefined); From 543d2fc83a0fe16688771ba2b4e7ea1a02ecd4e5 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 19 Sep 2025 11:11:37 +0700 Subject: [PATCH 15/20] use the node.js API instead of starting a child process for generating openAPI types --- eslint.config.mjs | 11 ++++++++++- package.json | 4 +++- scripts/generate-types.js | 31 +++++++++++-------------------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 579b8a1d..a24582f7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,6 +3,7 @@ import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import prettier from 'eslint-config-prettier'; +import globals from 'globals'; export default tseslint.config( eslint.configs.recommended, @@ -11,7 +12,15 @@ export default tseslint.config( { // These are files with more lenient lint config because they have not been "fixed" yet // Once a directory here is fixed, it should be removed from here so the strict rules applies - files: ['src/keri/app/**', 'src/keri/core/**', 'test-integration/**'], + files: [ + 'src/keri/app/**', + 'src/keri/core/**', + 'test-integration/**', + 'scripts/*.js', + ], + languageOptions: { + globals: globals['node'], + }, rules: { 'prefer-const': 'warn', 'no-var': 'warn', diff --git a/package.json b/package.json index 7afeab79..fdcfd7dd 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "test": "vitest", "prepare": "tsc -p tsconfig.build.json", "test:integration": "vitest -c vitest.integration.ts", - "lint": "eslint src test test-integration", + "lint": "eslint src test test-integration scripts", "generate:docs": "typedoc src/index.ts", "pretty": "prettier --write .", "pretty:check": "prettier --check ." @@ -49,7 +49,9 @@ "bip39": "^3.1.0", "eslint": "^9.22.0", "eslint-config-prettier": "^10.1.1", + "globals": "^16.4.0", "minami": "^1.2.3", + "openapi-typescript": "^7.9.1", "prettier": "^3.5.3", "ts-mockito": "^2.6.1", "typedoc": "^0.28.0", diff --git a/scripts/generate-types.js b/scripts/generate-types.js index e82304d9..2c72d4ef 100644 --- a/scripts/generate-types.js +++ b/scripts/generate-types.js @@ -1,27 +1,18 @@ -import { execSync } from 'child_process'; -import fs from 'fs'; -import path from 'path'; +import path from 'node:path'; +import { writeFile } from 'node:fs/promises'; +import openapiTS, { astToString } from 'openapi-typescript'; +import { isInterfaceDeclaration } from 'typescript'; const specUrl = process.env.SPEC_URL || 'http://localhost:3902/spec.yaml'; const outputFile = path.resolve('src/types/keria-api-schema.ts'); console.log(`📦 Generating types from ${specUrl}`); -execSync(`npx openapi-typescript "${specUrl}" --output ${outputFile}`, { - stdio: 'inherit', -}); +const ast = await openapiTS(new URL(specUrl), { rootTypes: true }); +const content = ast.filter( + (s) => isInterfaceDeclaration(s) && s.name.text === 'components' +); -// Read the full file -const fullContent = fs.readFileSync(outputFile, 'utf8'); +const header = `// AUTO-GENERATED: Only components retained from OpenAPI schema\n\n`; +await writeFile(outputFile, `${header}${astToString(content)}`); -// Extract only the `export interface components { ... }` block -const match = fullContent.match(/export interface components \{[\s\S]+?\n\}/); - -if (!match) { - console.error("❌ Could not find 'export interface components' block."); - process.exit(1); -} - -// Add comment header -const cleaned = `// AUTO-GENERATED: Only components retained from OpenAPI schema\n\n${match[0]}\n`; - -fs.writeFileSync(outputFile, cleaned, 'utf8'); +console.log(`🚀 ${specUrl} → ${outputFile}`); From f0d4b0f1b84bde306bd960d0a54f28d1e66ba859 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 19 Sep 2025 15:19:28 +0700 Subject: [PATCH 16/20] remove unuse schemas --- src/types/keria-api-schema.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 35917bfd..3fa1b2b4 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -44,23 +44,6 @@ export interface components { additionalProperties: boolean; required: string[]; }; - StatusAnchor: { - s: number; - d: string; - }; - CredentialStatus: { - vn: number[]; - i: string; - s: string; - d: string; - ri: string; - ra: { - [key: string]: unknown; - }; - a: components['schemas']['StatusAnchor']; - dt: string; - et: string; - }; Anchor: { pre: string; sn: number; From ee4e8c2ca488b7dbc607be2a1bbe351a6b01056d Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 19 Sep 2025 15:20:56 +0700 Subject: [PATCH 17/20] resolve review comment: fix the eslint rules --- eslint.config.mjs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index a24582f7..27bc2da6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,14 +12,9 @@ export default tseslint.config( { // These are files with more lenient lint config because they have not been "fixed" yet // Once a directory here is fixed, it should be removed from here so the strict rules applies - files: [ - 'src/keri/app/**', - 'src/keri/core/**', - 'test-integration/**', - 'scripts/*.js', - ], + files: ['src/keri/app/**', 'src/keri/core/**', 'test-integration/**'], languageOptions: { - globals: globals['node'], + globals: globals['shared-node-browser'], }, rules: { 'prefer-const': 'warn', @@ -34,5 +29,11 @@ export default tseslint.config( // '@typescript-eslint/ban-types': 'warn', '@typescript-eslint/no-unused-vars': 'warn', }, + }, + { + files: ['scripts/*.js'], + languageOptions: { + globals: globals.node, + }, } ); From 79b336ffe259caae738083fad413c62878e3a5aa Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Fri, 19 Sep 2025 16:07:23 +0700 Subject: [PATCH 18/20] update package-lock.json --- package-lock.json | 2551 +++++++++++++++++++++++++++++++-------------- 1 file changed, 1764 insertions(+), 787 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9165fdad..9f2f90ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,9 @@ "bip39": "^3.1.0", "eslint": "^9.22.0", "eslint-config-prettier": "^10.1.1", + "globals": "^16.4.0", "minami": "^1.2.3", + "openapi-typescript": "^7.9.1", "prettier": "^3.5.3", "ts-mockito": "^2.6.1", "typedoc": "^0.28.0", @@ -34,22 +36,6 @@ "vitest": "^3.0.9" } }, - "examples/integration-scripts": { - "extraneous": true, - "dependencies": { - "bip39": "^3.1.0", - "bip39-light": "^1.0.7", - "signify-ts": "*" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -64,10 +50,32 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -75,9 +83,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -85,13 +93,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -101,24 +109,23 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -134,8 +141,282 @@ "node": ">=18" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.0", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -149,20 +430,191 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -235,10 +687,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", "dev": true, "license": "MIT", "engines": { @@ -273,14 +738,16 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.2.1.tgz", - "integrity": "sha512-HbzRC6MKB6U8kQhczz0APKPIzFHTrcqhaC7es2EXInq1SpjPVnpVSIsBe6hNoLWqqCx1n5VKiPXq6PfXnHZKOQ==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.12.2.tgz", + "integrity": "sha512-HKZPmO8OSSAAo20H2B3xgJdxZaLTwtlMwxg0967scnrDlPwe6j5+ULGHyIqwgTbFCn9yv/ff8CmfWZLE9YKBzA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.2.1", - "@shikijs/types": "^3.2.1", + "@shikijs/engine-oniguruma": "^3.12.2", + "@shikijs/langs": "^3.12.2", + "@shikijs/themes": "^3.12.2", + "@shikijs/types": "^3.12.2", "@shikijs/vscode-textmate": "^10.0.2" } }, @@ -295,35 +762,23 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -335,9 +790,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -377,18 +832,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -401,27 +852,17 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -430,12 +871,12 @@ } }, "node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.7.1" + "@noble/hashes": "1.8.0" }, "engines": { "node": "^14.21.3 || >=16" @@ -445,9 +886,9 @@ } }, "node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -458,6 +899,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -470,6 +913,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -478,6 +923,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -499,10 +946,86 @@ "node": ">=14" } }, + "node_modules/@redocly/ajv": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.3.tgz", + "integrity": "sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/ajv/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/config": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", + "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.5", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", + "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", - "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.51.0.tgz", + "integrity": "sha512-VyfldO8T/C5vAXBGIobrAnUE+VJNVLw5z9h4NgSDq/AJZWt/fXqdW+0PJbk+M74xz7yMDRiHtlsuDV7ew6K20w==", "cpu": [ "arm" ], @@ -514,9 +1037,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", - "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.51.0.tgz", + "integrity": "sha512-Z3ujzDZgsEVSokgIhmOAReh9SGT2qloJJX2Xo1Q3nPU1EhCXrV0PbpR3r7DWRgozqnjrPZQkLe5cgBPIYp70Vg==", "cpu": [ "arm64" ], @@ -528,9 +1051,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", - "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.51.0.tgz", + "integrity": "sha512-T3gskHgArUdR6TCN69li5VELVAZK+iQ4iwMoSMNYixoj+56EC9lTj35rcxhXzIJt40YfBkvDy3GS+t5zh7zM6g==", "cpu": [ "arm64" ], @@ -542,9 +1065,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", - "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.51.0.tgz", + "integrity": "sha512-Hh7n/fh0g5UjH6ATDF56Qdf5bzdLZKIbhp5KftjMYG546Ocjeyg15dxphCpH1FFY2PJ2G6MiOVL4jMq5VLTyrQ==", "cpu": [ "x64" ], @@ -556,9 +1079,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", - "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.51.0.tgz", + "integrity": "sha512-0EddADb6FBvfqYoxwVom3hAbAvpSVUbZqmR1wmjk0MSZ06hn/UxxGHKRqEQDMkts7XiZjejVB+TLF28cDTU+gA==", "cpu": [ "arm64" ], @@ -570,9 +1093,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", - "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.51.0.tgz", + "integrity": "sha512-MpqaEDLo3JuVPF+wWV4mK7V8akL76WCz8ndfz1aVB7RhvXFO3k7yT7eu8OEuog4VTSyNu5ibvN9n6lgjq/qLEQ==", "cpu": [ "x64" ], @@ -584,9 +1107,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", - "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.51.0.tgz", + "integrity": "sha512-WEWAGFNFFpvSWAIT3MYvxTkYHv/cJl9yWKpjhheg7ONfB0hetZt/uwBnM3GZqSHrk5bXCDYTFXg3jQyk/j7eXQ==", "cpu": [ "arm" ], @@ -598,9 +1121,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", - "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.51.0.tgz", + "integrity": "sha512-9bxtxj8QoAp++LOq5PGDGkEEOpCDk9rOEHUcXadnijedDH8IXrBt6PnBa4Y6NblvGWdoxvXZYghZLaliTCmAng==", "cpu": [ "arm" ], @@ -612,9 +1135,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", - "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.51.0.tgz", + "integrity": "sha512-DdqA+fARqIsfqDYkKo2nrWMp0kvu/wPJ2G8lZ4DjYhn+8QhrjVuzmsh7tTkhULwjvHTN59nWVzAixmOi6rqjNA==", "cpu": [ "arm64" ], @@ -626,9 +1149,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", - "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.51.0.tgz", + "integrity": "sha512-2XVRNzcUJE1UJua8P4a1GXS5jafFWE+pQ6zhUbZzptOu/70p1F6+0FTi6aGPd6jNtnJqGMjtBCXancC2dhYlWw==", "cpu": [ "arm64" ], @@ -639,10 +1162,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", - "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.51.0.tgz", + "integrity": "sha512-R8QhY0kLIPCAVXWi2yftDSpn7Jtejey/WhMoBESSfwGec5SKdFVupjxFlKoQ7clVRuaDpiQf7wNx3EBZf4Ey6g==", "cpu": [ "loong64" ], @@ -653,12 +1176,26 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", - "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.51.0.tgz", + "integrity": "sha512-I498RPfxx9cMv1KTHQ9tg2Ku1utuQm+T5B+Xro+WNu3FzAFSKp4awKfgMoZwjoPgNbaFGINaOM25cQW6WuBhiQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.51.0.tgz", + "integrity": "sha512-o8COudsb8lvtdm9ixg9aKjfX5aeoc2x9KGE7WjtrmQFquoCRZ9jtzGlonujE4WhvXFepTraWzT4RcwyDDeHXjA==", "cpu": [ - "ppc64" + "riscv64" ], "dev": true, "license": "MIT", @@ -667,10 +1204,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", - "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.51.0.tgz", + "integrity": "sha512-0shJPgSXMdYzOQzpM5BJN2euXY1f8uV8mS6AnrbMcH2KrkNsbpMxWB1wp8UEdiJ1NtyBkCk3U/HfX5mEONBq6w==", "cpu": [ "riscv64" ], @@ -682,9 +1219,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", - "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.51.0.tgz", + "integrity": "sha512-L7pV+ny7865jamSCQwyozBYjFRUKaTsPqDz7ClOtJCDu4paf2uAa0mrcHwSt4XxZP2ogFZS9uuitH3NXdeBEJA==", "cpu": [ "s390x" ], @@ -696,9 +1233,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", - "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.51.0.tgz", + "integrity": "sha512-4YHhP+Rv3T3+H3TPbUvWOw5tuSwhrVhkHHZhk4hC9VXeAOKR26/IsUAT4FsB4mT+kfIdxxb1BezQDEg/voPO8A==", "cpu": [ "x64" ], @@ -710,9 +1247,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", - "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.51.0.tgz", + "integrity": "sha512-P7U7U03+E5w7WgJtvSseNLOX1UhknVPmEaqgUENFWfNxNBa1OhExT6qYGmyF8gepcxWSaSfJsAV5UwhWrYefdQ==", "cpu": [ "x64" ], @@ -723,10 +1260,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.51.0.tgz", + "integrity": "sha512-FuD8g3u9W6RPwdO1R45hZFORwa1g9YXEMesAKP/sOi7mDqxjbni8S3zAXJiDcRfGfGBqpRYVuH54Gu3FTuSoEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", - "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.51.0.tgz", + "integrity": "sha512-zST+FdMCX3QAYfmZX3dp/Fy8qLUetfE17QN5ZmmFGPrhl86qvRr+E9u2bk7fzkIXsfQR30Z7ZRS7WMryPPn4rQ==", "cpu": [ "arm64" ], @@ -738,9 +1289,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", - "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.51.0.tgz", + "integrity": "sha512-U+qhoCVAZmTHCmUKxdQxw1jwAFNFXmOpMME7Npt5GTb1W/7itfgAgNluVOvyeuSeqW+dEQLFuNZF3YZPO8XkMg==", "cpu": [ "ia32" ], @@ -752,9 +1303,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", - "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.51.0.tgz", + "integrity": "sha512-z6UpFzMhXSD8NNUfCi2HO+pbpSzSWIIPgb1TZsEZjmZYtk6RUIC63JYjlFBwbBZS3jt3f1q6IGfkj3g+GnBt2Q==", "cpu": [ "x64" ], @@ -766,20 +1317,40 @@ ] }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.2.1.tgz", - "integrity": "sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.12.2.tgz", + "integrity": "sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.2.1", + "@shikijs/types": "3.12.2", "@shikijs/vscode-textmate": "^10.0.2" } }, + "node_modules/@shikijs/langs": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.12.2.tgz", + "integrity": "sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.12.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.12.2.tgz", + "integrity": "sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.12.2" + } + }, "node_modules/@shikijs/types": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.2.1.tgz", - "integrity": "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.12.2.tgz", + "integrity": "sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -794,10 +1365,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -819,12 +1407,16 @@ "license": "MIT" }, "node_modules/@types/libsodium-wrappers": { - "version": "0.7.11", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.14.tgz", + "integrity": "sha512-5Kv68fXuXK0iDuUir1WPGw2R9fOZUlYlSAa0ztMcL0s0BfIDTqg9GXz8K30VJpPP3sxWhbolnQma2x+/TfkzDQ==", "dev": true, "license": "MIT" }, "node_modules/@types/libsodium-wrappers-sumo": { - "version": "0.7.6", + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@types/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.8.tgz", + "integrity": "sha512-N2+df4MB/A+W0RAcTw7A5oxKgzD+Vh6Ye7lfjWIi5SdTzVLfHPzxUjhwPqHLO5Ev9fv/+VHl+sUaUuTg4fUPqw==", "dev": true, "license": "MIT", "dependencies": { @@ -832,13 +1424,13 @@ } }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "22.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", + "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/unist": { @@ -848,23 +1440,282 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", + "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/type-utils": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.44.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", + "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", + "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.44.0", + "@typescript-eslint/types": "^8.44.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", + "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", + "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", + "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", + "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", + "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.44.0", + "@typescript-eslint/tsconfig-utils": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", + "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", + "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.9.tgz", - "integrity": "sha512-15OACZcBtQ34keIEn19JYTVuMFTlFrClclwWjHo/IRPg/8ELpkgNTl0o7WLP9WO9XGH6+tip9CPYtEOrIDJvBA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", "magic-string": "^0.30.17", "magicast": "^0.3.5", - "std-env": "^3.8.0", + "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, @@ -872,8 +1723,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.9", - "vitest": "3.0.9" + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -882,14 +1733,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", - "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -898,13 +1750,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", - "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.9", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -913,7 +1765,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -925,9 +1777,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", - "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -938,27 +1790,28 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", - "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.9", - "pathe": "^2.0.3" + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", - "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.9", + "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -967,27 +1820,27 @@ } }, "node_modules/@vitest/spy": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", - "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.2" + "tinyspy": "^4.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", - "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.9", - "loupe": "^3.1.3", + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, "funding": { @@ -1017,6 +1870,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1034,10 +1897,20 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -1048,13 +1921,16 @@ } }, "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -1077,8 +1953,22 @@ "node": ">=12" } }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", + "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.30", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + } + }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, @@ -1125,6 +2015,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -1155,9 +2047,9 @@ } }, "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -1168,9 +2060,33 @@ "pathval": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -1183,6 +2099,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1194,18 +2112,29 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true, "license": "MIT" }, "node_modules/complex.js": { - "version": "2.1.1", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.2.tgz", + "integrity": "sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==", "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, "node_modules/concat-map": { @@ -1217,6 +2146,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -1229,7 +2160,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -1245,7 +2178,9 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, "node_modules/deep-eql": { @@ -1260,6 +2195,8 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, @@ -1291,14 +2228,16 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.0", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1309,39 +2248,44 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/escape-latex": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -1352,19 +2296,19 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", + "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -1413,14 +2357,17 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.1.tgz", - "integrity": "sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } @@ -1443,46 +2390,6 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", @@ -1495,60 +2402,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -1567,21 +2420,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { - "version": "1.5.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1606,6 +2448,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -1633,9 +2477,9 @@ } }, "node_modules/expect-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", - "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1651,6 +2495,8 @@ }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -1664,6 +2510,19 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1673,11 +2532,15 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { - "version": "1.15.0", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1699,6 +2562,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -1708,6 +2573,23 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -1748,6 +2630,8 @@ }, "node_modules/fraction.js": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", + "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", "license": "MIT", "engines": { "node": "*" @@ -1794,14 +2678,16 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob/node_modules/brace-expansion": { @@ -1831,9 +2717,9 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { @@ -1852,11 +2738,15 @@ }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -1870,6 +2760,20 @@ "dev": true, "license": "MIT" }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1899,14 +2803,31 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/index-to-position": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", + "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -1925,6 +2846,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1936,6 +2859,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -1944,6 +2869,8 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, @@ -1988,9 +2915,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2019,6 +2946,25 @@ }, "node_modules/javascript-natural-sort": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "license": "MIT" + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -2050,6 +2996,8 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, @@ -2065,6 +3013,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2076,14 +3026,18 @@ } }, "node_modules/libsodium-sumo": { - "version": "0.7.11", + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", + "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==", "license": "ISC" }, "node_modules/libsodium-wrappers-sumo": { - "version": "0.7.11", + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", + "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", "license": "ISC", "dependencies": { - "libsodium-sumo": "^0.7.11" + "libsodium-sumo": "^0.7.15" } }, "node_modules/linkify-it": { @@ -2096,20 +3050,40 @@ "uc.micro": "^2.0.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, @@ -2122,17 +3096,19 @@ }, "node_modules/lunr": { "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/magicast": { @@ -2182,10 +3158,12 @@ } }, "node_modules/mathjs": { - "version": "12.4.0", + "version": "12.4.3", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.3.tgz", + "integrity": "sha512-oHdGPDbp7gO873xxG90RLq36IuicuKvbpr/bBG5g9c8Obm/VsKVrK9uoRZZHUodohzlnmCEqfDzbR3LH6m+aAQ==", "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.23.9", + "@babel/runtime": "^7.24.4", "complex.js": "^2.1.1", "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", @@ -2211,6 +3189,8 @@ }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -2219,6 +3199,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -2231,6 +3213,8 @@ }, "node_modules/minami": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", + "integrity": "sha512-3f2QqqbUC1usVux0FkQMFYB73yd9JIxmHSn1dWQacizL6hOUaNu6mA3KxZ9SfiCc4qgcgq+5XP59+hP7URa1Dw==", "dev": true }, "node_modules/minimatch": { @@ -2258,6 +3242,8 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, @@ -2282,20 +3268,58 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, + "node_modules/openapi-typescript": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.9.1.tgz", + "integrity": "sha512-9gJtoY04mk6iPMbToPjPxEAtfXZ0dTsMZtsgUI8YZta0btPPig9DJFP4jlerQD/7QOwYgb0tl+zLUpDf7vb7VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.34.5", + "ansi-colors": "^4.1.3", + "change-case": "^5.4.4", + "parse-json": "^8.3.0", + "supports-color": "^10.1.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/openapi-typescript/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -2303,6 +3327,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2315,6 +3341,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -2335,8 +3377,28 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -2345,6 +3407,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -2376,9 +3440,9 @@ "license": "MIT" }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -2394,6 +3458,8 @@ }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -2403,10 +3469,20 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -2424,7 +3500,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -2434,6 +3510,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -2441,9 +3519,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { @@ -2478,6 +3556,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -2495,9 +3575,15 @@ ], "license": "MIT" }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "license": "MIT" + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/resolve-from": { "version": "4.0.0", @@ -2510,7 +3596,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -2519,13 +3607,13 @@ } }, "node_modules/rollup": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", - "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.51.0.tgz", + "integrity": "sha512-7cR0XWrdp/UAj2HMY/Y4QQEUjidn3l2AY1wSeZoFjMbD8aOMPoV9wgTFYbrJpPzzvejDEini1h3CiUP8wLzxQA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -2535,30 +3623,34 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.36.0", - "@rollup/rollup-android-arm64": "4.36.0", - "@rollup/rollup-darwin-arm64": "4.36.0", - "@rollup/rollup-darwin-x64": "4.36.0", - "@rollup/rollup-freebsd-arm64": "4.36.0", - "@rollup/rollup-freebsd-x64": "4.36.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", - "@rollup/rollup-linux-arm-musleabihf": "4.36.0", - "@rollup/rollup-linux-arm64-gnu": "4.36.0", - "@rollup/rollup-linux-arm64-musl": "4.36.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", - "@rollup/rollup-linux-riscv64-gnu": "4.36.0", - "@rollup/rollup-linux-s390x-gnu": "4.36.0", - "@rollup/rollup-linux-x64-gnu": "4.36.0", - "@rollup/rollup-linux-x64-musl": "4.36.0", - "@rollup/rollup-win32-arm64-msvc": "4.36.0", - "@rollup/rollup-win32-ia32-msvc": "4.36.0", - "@rollup/rollup-win32-x64-msvc": "4.36.0", + "@rollup/rollup-android-arm-eabi": "4.51.0", + "@rollup/rollup-android-arm64": "4.51.0", + "@rollup/rollup-darwin-arm64": "4.51.0", + "@rollup/rollup-darwin-x64": "4.51.0", + "@rollup/rollup-freebsd-arm64": "4.51.0", + "@rollup/rollup-freebsd-x64": "4.51.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.51.0", + "@rollup/rollup-linux-arm-musleabihf": "4.51.0", + "@rollup/rollup-linux-arm64-gnu": "4.51.0", + "@rollup/rollup-linux-arm64-musl": "4.51.0", + "@rollup/rollup-linux-loong64-gnu": "4.51.0", + "@rollup/rollup-linux-ppc64-gnu": "4.51.0", + "@rollup/rollup-linux-riscv64-gnu": "4.51.0", + "@rollup/rollup-linux-riscv64-musl": "4.51.0", + "@rollup/rollup-linux-s390x-gnu": "4.51.0", + "@rollup/rollup-linux-x64-gnu": "4.51.0", + "@rollup/rollup-linux-x64-musl": "4.51.0", + "@rollup/rollup-openharmony-arm64": "4.51.0", + "@rollup/rollup-win32-arm64-msvc": "4.51.0", + "@rollup/rollup-win32-ia32-msvc": "4.51.0", + "@rollup/rollup-win32-x64-msvc": "4.51.0", "fsevents": "~2.3.2" } }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -2581,12 +3673,14 @@ }, "node_modules/seedrandom": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -2598,6 +3692,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2609,6 +3705,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -2653,9 +3751,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", - "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, "license": "MIT" }, @@ -2724,9 +3822,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -2773,15 +3871,32 @@ "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/structured-headers": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.5.0.tgz", + "integrity": "sha512-oLnmXSsjhud+LxRJpvokwP8ImEB2wTg8sg30buwfVViKMuluTv3BlOJHUX9VW9pJ2nQOxmx87Z0kB86O4cphag==", "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -2834,6 +3949,8 @@ }, "node_modules/tiny-emitter": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", "license": "MIT" }, "node_modules/tinybench": { @@ -2851,14 +3968,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -2868,11 +3985,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -2883,9 +4003,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -2896,9 +4016,9 @@ } }, "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -2916,9 +4036,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -2927,6 +4047,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2936,8 +4058,23 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-mockito": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", + "integrity": "sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==", "dev": true, "license": "MIT", "dependencies": { @@ -2945,9 +4082,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", - "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, "license": "MIT", "bin": { @@ -2967,6 +4104,8 @@ }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -2976,25 +4115,40 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-function": { - "version": "4.1.1", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", + "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/typedoc": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.1.tgz", - "integrity": "sha512-Mn2VPNMaxoe/hlBiLriG4U55oyAa3Xo+8HbtEwV7F5WEOPXqtxzGuMZhJYHaqFJpajeQ6ZDUC2c990NAtTbdgw==", + "version": "0.28.13", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.13.tgz", + "integrity": "sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@gerrit0/mini-shiki": "^3.2.1", + "@gerrit0/mini-shiki": "^3.12.0", "lunr": "^2.3.9", "markdown-it": "^14.1.0", "minimatch": "^9.0.5", - "yaml": "^2.7.0 " + "yaml": "^2.8.1" }, "bin": { "typedoc": "bin/typedoc" @@ -3004,7 +4158,7 @@ "pnpm": ">= 10" }, "peerDependencies": { - "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x" + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { @@ -3034,9 +4188,9 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3048,177 +4202,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.27.0.tgz", - "integrity": "sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.27.0", - "@typescript-eslint/parser": "8.27.0", - "@typescript-eslint/utils": "8.27.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz", - "integrity": "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/type-utils": "8.27.0", - "@typescript-eslint/utils": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.27.0.tgz", - "integrity": "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/typescript-estree": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz", - "integrity": "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz", - "integrity": "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.27.0", - "@typescript-eslint/utils": "8.27.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.27.0.tgz", - "integrity": "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz", - "integrity": "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.27.0.tgz", - "integrity": "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz", + "integrity": "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/typescript-estree": "8.27.0" + "@typescript-eslint/eslint-plugin": "8.44.0", + "@typescript-eslint/parser": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3229,77 +4222,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz", - "integrity": "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.27.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/typescript-eslint/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript-eslint/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/uc.micro": { @@ -3310,9 +4233,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -3326,25 +4249,32 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", - "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz", + "integrity": "sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -3353,14 +4283,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -3402,17 +4332,17 @@ } }, "node_modules/vite-node": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", - "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -3445,11 +4375,14 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -3460,9 +4393,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -3473,31 +4406,34 @@ } }, "node_modules/vitest": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", - "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.9", - "@vitest/mocker": "3.0.9", - "@vitest/pretty-format": "^3.0.9", - "@vitest/runner": "3.0.9", - "@vitest/snapshot": "3.0.9", - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.1.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.0", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -3513,8 +4449,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.9", - "@vitest/ui": "3.0.9", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, @@ -3542,8 +4478,23 @@ } } }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -3573,6 +4524,16 @@ "node": ">=8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -3620,22 +4581,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3671,21 +4616,53 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" } }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { From 2b2c0bb5bb8ec826215c0d918fe38cc53ecfb8c0 Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Tue, 30 Sep 2025 15:41:48 +0700 Subject: [PATCH 19/20] update types since keria changed --- src/keri/app/coring.ts | 8 +- src/keri/app/credentialing.ts | 11 +- src/types/keria-api-schema.ts | 158 +++++++++++++++--- test-integration/credentials.test.ts | 9 +- .../multisig-vlei-issuance.test.ts | 33 ++-- 5 files changed, 178 insertions(+), 41 deletions(-) diff --git a/src/keri/app/coring.ts b/src/keri/app/coring.ts index 6eafd9e0..10d45389 100644 --- a/src/keri/app/coring.ts +++ b/src/keri/app/coring.ts @@ -4,8 +4,6 @@ import { Salter } from '../core/salter.ts'; import { Matter, MtrDex } from '../core/matter.ts'; import { components } from '../../types/keria-api-schema.ts'; -type OperationBase = components['schemas']['OperationBase']; - export function randomPasscode(): string { const raw = libsodium.randombytes_buf(16); const salter = new Salter({ raw: raw }); @@ -64,7 +62,11 @@ export class Oobis { } } -export type Operation = OperationBase & { +// TODO: the generic will be replaced by specific overrides like IpexOperation +export type Operation = Omit< + components['schemas']['Operation'], + 'response' | 'metadata' +> & { response?: T; metadata?: { depends?: Operation; diff --git a/src/keri/app/credentialing.ts b/src/keri/app/credentialing.ts index 6c19b769..870f355e 100644 --- a/src/keri/app/credentialing.ts +++ b/src/keri/app/credentialing.ts @@ -433,6 +433,15 @@ export class Credentials { const cred = await this.get(said); + let registryId: string; + if ('ri' in cred.sad && cred.sad.ri !== undefined) { + registryId = cred.sad.ri; + } else if ('rd' in cred.sad && cred.sad.rd !== undefined) { + registryId = cred.sad.rd; + } else { + throw new Error('Neither ri nor rd property found in credential'); + } + // Create rev const _rev = { v: vs, @@ -440,7 +449,7 @@ export class Credentials { d: '', i: said, s: '1', - ri: cred.sad.ri, + ri: registryId, p: cred.status.d, dt: dt, }; diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 3fa1b2b4..920ac19a 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -9,18 +9,53 @@ export interface components { } & { [key: string]: unknown; }; - ACDC: { - v: string; - d: string; - i: string; - s: string; - ri?: string; - a?: components['schemas']['ACDCAttributes']; - u?: string; - e?: unknown[]; - r?: unknown[]; - }; - IssEvt: { + ACDC_V_1: + | { + v: string; + d: string; + i: string; + s: string; + u?: string; + ri?: string; + e?: string; + r?: string; + a?: components['schemas']['ACDCAttributes']; + } + | { + v: string; + d: string; + i: string; + s: string; + u?: string; + ri?: string; + e?: string; + r?: string; + A?: string | unknown[]; + }; + ACDC_V_2: + | { + v: string; + d: string; + i: string; + s: string; + u?: string; + rd?: string; + e?: string; + r?: string; + a?: components['schemas']['ACDCAttributes']; + } + | { + v: string; + d: string; + i: string; + s: string; + u?: string; + rd?: string; + e?: string; + r?: string; + A?: string | unknown[]; + }; + IssEvent: { v: string; /** @enum {unknown} */ t: 'iss' | 'bis'; @@ -54,20 +89,93 @@ export interface components { d: string; i?: string; }; - ANC: { + IXN_V_1: { + v: string; + t: string; + d: string; + i: string; + s: string; + p: string; + a: components['schemas']['Seal'][]; + }; + IXN_V_2: { + v: string; + t: string; + d: string; + i: string; + s: string; + p: string; + a: components['schemas']['Seal'][]; + }; + ICP_V_1: { + v: string; + t: string; + d: string; + i: string; + s: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + b: string[]; + c: string[]; + a: unknown; + }; + ICP_V_2: { + v: string; + t: string; + d: string; + i: string; + s: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + b: string[]; + c: string[]; + a: unknown; + }; + ROT_V_1: { + v: string; + t: string; + d: string; + i: string; + s: string; + p: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + br: string[]; + ba: string[]; + a: unknown; + }; + ROT_V_2: { v: string; t: string; d: string; i: string; s: string; p: string; - di?: string; - a?: components['schemas']['Seal'][]; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + br: string[]; + ba: string[]; + c: string[]; + a: unknown; }; Credential: { - sad: components['schemas']['ACDC']; + sad: + | components['schemas']['ACDC_V_1'] + | components['schemas']['ACDC_V_2']; atc: string; - iss: components['schemas']['IssEvt']; + iss: components['schemas']['IssEvent']; issatc: string; pre: string; schema: components['schemas']['Schema']; @@ -76,7 +184,13 @@ export interface components { }[]; status: components['schemas']['CredentialState']; anchor: components['schemas']['Anchor']; - anc: components['schemas']['ANC']; + anc: + | components['schemas']['IXN_V_1'] + | components['schemas']['IXN_V_2'] + | components['schemas']['ICP_V_1'] + | components['schemas']['ICP_V_2'] + | components['schemas']['ROT_V_1'] + | components['schemas']['ROT_V_2']; ancatc: string; }; OperationStatus: { @@ -86,10 +200,12 @@ export interface components { [key: string]: unknown; } | null; }; - OperationBase: { + Operation: { name: string; error?: components['schemas']['OperationStatus']; done?: boolean; + metadata?: Record; + response?: Record; }; EmptyDict: Record; CredentialStateIssOrRev: { @@ -124,10 +240,6 @@ export interface components { CredentialState: | components['schemas']['CredentialStateIssOrRev'] | components['schemas']['CredentialStateBisOrBrv']; - Operation: components['schemas']['OperationBase'] & { - metadata?: Record; - response?: Record; - }; Registry: { name: string; regk: string; diff --git a/test-integration/credentials.test.ts b/test-integration/credentials.test.ts index 4409069d..98b58b4b 100644 --- a/test-integration/credentials.test.ts +++ b/test-integration/credentials.test.ts @@ -610,10 +610,15 @@ test('single signature credentials', { timeout: 90000 }, async () => { ); assert.equal(legalEntityCredential.sad.s, LE_SCHEMA_SAID); assert.equal(legalEntityCredential.sad.i, holderAid.prefix); - assert.equal(legalEntityCredential.sad.a !== undefined, true); - if (legalEntityCredential.sad.a) { + + if ( + 'a' in legalEntityCredential.sad && + legalEntityCredential.sad.a !== undefined + ) { + assert.equal(legalEntityCredential.sad.a !== undefined, true); assert.equal(legalEntityCredential.sad.a.i, legalEntityAid.prefix); } + assert.equal(legalEntityCredential.status.s, '0'); assert(Array.isArray(legalEntityCredential.chains)); assert(legalEntityCredential.chains.length > 0); diff --git a/test-integration/multisig-vlei-issuance.test.ts b/test-integration/multisig-vlei-issuance.test.ts index 553697dc..2e2a89b2 100644 --- a/test-integration/multisig-vlei-issuance.test.ts +++ b/test-integration/multisig-vlei-issuance.test.ts @@ -609,11 +609,13 @@ test('multisig-vlei-issuance', async function run() { assert.equal(qviCredbyGAR1.sad.d, qviCredbyGAR2.sad.d); assert.equal(qviCredbyGAR1.sad.s, QVI_SCHEMA_SAID); assert.equal(qviCredbyGAR1.sad.i, aidGEDA.prefix); - assert( - qviCredbyGAR1.sad.a !== undefined, - 'qviCredbyGAR1.sad.a is undefined' - ); - assert.equal(qviCredbyGAR1.sad.a.i, aidQVI.prefix); + + if ('a' in qviCredbyGAR1.sad && qviCredbyGAR1.sad.a !== undefined) { + assert.equal(qviCredbyGAR1.sad.a.i, aidQVI.prefix); + } else { + throw new Error('Expected qviCredbyGAR1.sad.a to be defined'); + } + assert.equal(qviCredbyGAR1.status.s, '0'); assert(qviCredbyGAR1.atc !== undefined); const qviCred = qviCredbyGAR1; @@ -990,8 +992,13 @@ test('multisig-vlei-issuance', async function run() { assert.equal(leCredbyQAR1.sad.d, leCredbyQAR3.sad.d); assert.equal(leCredbyQAR1.sad.s, LE_SCHEMA_SAID); assert.equal(leCredbyQAR1.sad.i, aidQVI.prefix); - assert(leCredbyQAR1.sad.a !== undefined, 'leCredbyQAR1.sad.a is undefined'); - assert.equal(leCredbyQAR1.sad.a.i, aidLE.prefix); + + if ('a' in leCredbyQAR1.sad && leCredbyQAR1.sad.a !== undefined) { + assert.equal(leCredbyQAR1.sad.a.i, aidLE.prefix); + } else { + throw new Error('Expected leCredbyQAR1.sad.a to be defined'); + } + assert.equal(leCredbyQAR1.status.s, '0'); assert(leCredbyQAR1.atc !== undefined); const leCred = leCredbyQAR1; @@ -1239,11 +1246,13 @@ test('multisig-vlei-issuance', async function run() { assert.equal(ecrCredbyLAR1.sad.d, ecrCredbyLAR3.sad.d); assert.equal(ecrCredbyLAR1.sad.s, ECR_SCHEMA_SAID); assert.equal(ecrCredbyLAR1.sad.i, aidLE.prefix); - assert( - ecrCredbyLAR1.sad.a !== undefined, - 'ecrCredbyLAR1.sad.a is undefined' - ); - assert.equal(ecrCredbyLAR1.sad.a.i, aidECR.prefix); + + if ('a' in ecrCredbyLAR1.sad && ecrCredbyLAR1.sad.a !== undefined) { + assert.equal(ecrCredbyLAR1.sad.a.i, aidECR.prefix); + } else { + throw new Error('Expected ecrCredbyLAR1.sad.a to be defined'); + } + assert.equal(ecrCredbyLAR1.status.s, '0'); assert(ecrCredbyLAR1.atc !== undefined); const ecrCred = ecrCredbyLAR1; From ecb49300a74b6712a4ab3000a0dc753a64bb7b8b Mon Sep 17 00:00:00 2001 From: Patrick Vu Date: Wed, 1 Oct 2025 14:50:10 +0700 Subject: [PATCH 20/20] update new types from keria --- src/types/keria-api-schema.ts | 71 ++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/types/keria-api-schema.ts b/src/types/keria-api-schema.ts index 920ac19a..61dd3e6e 100644 --- a/src/types/keria-api-schema.ts +++ b/src/types/keria-api-schema.ts @@ -170,6 +170,71 @@ export interface components { c: string[]; a: unknown; }; + DIP_V_1: { + v: string; + t: string; + d: string; + i: string; + s: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + b: string[]; + c: string[]; + a: unknown; + di: string; + }; + DIP_V_2: { + v: string; + t: string; + d: string; + i: string; + s: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + b: string[]; + c: string[]; + a: unknown; + di: string; + }; + DRT_V_1: { + v: string; + t: string; + d: string; + i: string; + s: string; + p: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + br: string[]; + ba: string[]; + a: unknown; + }; + DRT_V_2: { + v: string; + t: string; + d: string; + i: string; + s: string; + p: string; + kt: string; + k: string[]; + nt: string; + n: string[]; + bt: string; + br: string[]; + ba: string[]; + c: string[]; + a: unknown; + }; Credential: { sad: | components['schemas']['ACDC_V_1'] @@ -190,7 +255,11 @@ export interface components { | components['schemas']['ICP_V_1'] | components['schemas']['ICP_V_2'] | components['schemas']['ROT_V_1'] - | components['schemas']['ROT_V_2']; + | components['schemas']['ROT_V_2'] + | components['schemas']['DIP_V_1'] + | components['schemas']['DIP_V_2'] + | components['schemas']['DRT_V_1'] + | components['schemas']['DRT_V_2']; ancatc: string; }; OperationStatus: {