diff --git a/js/examples/browser/index.html b/js/examples/browser/index.html index d52837b6..dc16fb4c 100644 --- a/js/examples/browser/index.html +++ b/js/examples/browser/index.html @@ -23,6 +23,14 @@ --border-color: #ddd; } + * { + box-sizing: border-box; + } + + [hidden] { + display: none !important; + } + body { background-color: var(--bg-color); color: var(--text-color); @@ -30,10 +38,12 @@ system-ui, -apple-system, sans-serif; - padding: 20px; + padding: 40px 16px 80px; transition: background-color 0.3s, color 0.3s; + max-width: 980px; + margin: 0 auto; } button { @@ -88,7 +98,6 @@ background-color: #22c55e; color: white; } - .verify-result.error { background-color: #ef4444; color: white; @@ -105,12 +114,10 @@ background-color: #22c55e; color: white; } - .verify-summary.partial-success { background-color: #f59e0b; color: white; } - .verify-summary.all-failed { background-color: #ef4444; color: white; @@ -126,17 +133,21 @@ display: flex; align-items: center; gap: 10px; + min-height: 34px; } .config-row > label { - min-width: 100px; + width: 200px; + flex-shrink: 0; opacity: 0.7; font-size: 14px; } .config-row input[type="text"], + .config-row input[type="number"], .config-row select { flex: 1; + height: 34px; font-family: monospace; font-size: 14px; padding: 6px 10px; @@ -146,6 +157,12 @@ color: var(--text-color); } + .config-row input[type="checkbox"] { + width: 16px; + height: 16px; + margin: 0; + } + .config-row input[type="text"][readonly] { opacity: 0.5; } @@ -173,6 +190,39 @@ padding: 6px 12px; font-size: 13px; } + + .config-note { + font-family: monospace; + font-size: 12px; + opacity: 0.7; + } + + .config-divider { + border: none; + border-top: 1px solid var(--border-color); + margin: 4px 0; + } + + .config-section-label { + font-size: 12px; + opacity: 0.5; + text-transform: uppercase; + letter-spacing: 0.05em; + } + + #v3Options, + #v4Options, + #identityCheckOptions { + display: flex; + flex-direction: column; + gap: 10px; + } + + #v3Options[hidden], + #v4Options[hidden], + #identityCheckOptions[hidden] { + display: none; + } @@ -190,7 +240,7 @@

IDKit Browser Example

- +
@@ -207,6 +257,13 @@

IDKit Browser Example

+
IDKit Browser Example placeholder="https://bridge.worldcoin.org (default)" />
-
- - - For a local bridge over http://localhost:*, App ID must - start with app_staging_ (idkit's BridgeUrl validator only - relaxes for staging app IDs). - -
IDKit Browser Example placeholder="https://world.org/verify (default)" />
-
- - - Overrides the base of the rendered connector URL — useful when testing - against a local world.org/verify page. Wired through to - idkit's override_connect_base_url. - -
+
+ + +
+ + + + + +
+
+ + +
+ +
+ + +
+ + +
- - - - - +
@@ -293,13 +450,12 @@

Error

diff --git a/js/examples/browser/package.json b/js/examples/browser/package.json index 4e873344..4ae7158f 100644 --- a/js/examples/browser/package.json +++ b/js/examples/browser/package.json @@ -12,7 +12,8 @@ "dependencies": { "@worldcoin/idkit-core": "workspace:*", "dotenv": "^16.4.5", - "express": "^5.1.0" + "express": "^5.1.0", + "i18n-iso-countries": "^7.14.0" }, "devDependencies": { "@types/express": "^5.0.2", diff --git a/js/examples/nextjs/app/arena/ui.tsx b/js/examples/nextjs/app/arena/ui.tsx index 1570ea0f..6e6f23ff 100644 --- a/js/examples/nextjs/app/arena/ui.tsx +++ b/js/examples/nextjs/app/arena/ui.tsx @@ -56,6 +56,11 @@ type ArenaCaseId = | "v4_constraint_unsatisfied" | "v4_future_genesis_no_fallback" | "v4_future_genesis_fallback_success" + | "user_presence_v3_orb_failed" + | "user_presence_v3_secure_document_failed" + | "user_presence_v4_poh_failed" + | "user_presence_v4_passport_failed" + | "user_presence_v4_mnc_failed" | "error_invalid_rp_signature" | "error_duplicate_nonce" | "error_nullifier_replayed" @@ -105,6 +110,7 @@ type ArenaCaseDefinition = { description: string; prerequisite: string; request: RequestDefinition; + requireUserPresence?: boolean; contextCaseId?: RpContextCaseId; }; @@ -147,6 +153,7 @@ type ActiveRun = { rpContext: RpContext; signal: string; request: RequestDefinition; + requireUserPresence: boolean; }; type FlowConfig = @@ -163,6 +170,7 @@ const APP_ID = process.env.NEXT_PUBLIC_APP_ID as `app_${string}` | undefined; const RP_ID = process.env.NEXT_PUBLIC_RP_ID; const STAGING_CONNECT_BASE_URL = "https://staging.world.org/verify"; const FUTURE_GENESIS_OFFSET_SEC = 365 * 24 * 60 * 60; +const CONFIGURABLE_ALLOW_LEGACY_SECTION_ID = "world-id-4-success"; const PRESET_KIND_TO_NAME: Record = { orb: "Orb / Proof of Human", @@ -251,7 +259,7 @@ const ARENA_SECTIONS: ArenaSection[] = [ expected: "success", expectedProtocol: "4.0", prerequisite: "Account has a 4.0 Proof of Human credential.", - description: "Requests proof_of_human with legacy fallback disabled.", + description: "Requests proof_of_human as a 4.0 success path.", request: { type: "constraints", constraintKind: "proof_of_human", @@ -264,7 +272,7 @@ const ARENA_SECTIONS: ArenaSection[] = [ expected: "success", expectedProtocol: "4.0", prerequisite: "Account has a 4.0 Passport credential.", - description: "Requests passport with legacy fallback disabled.", + description: "Requests passport as a 4.0 success path.", request: { type: "constraints", constraintKind: "passport", @@ -277,7 +285,7 @@ const ARENA_SECTIONS: ArenaSection[] = [ expected: "success", expectedProtocol: "4.0", prerequisite: "Account has a 4.0 MNC credential.", - description: "Requests mnc with legacy fallback disabled.", + description: "Requests mnc as a 4.0 success path.", request: { type: "constraints", constraintKind: "mnc", @@ -461,6 +469,81 @@ const ARENA_SECTIONS: ArenaSection[] = [ }, ], }, + { + id: "user-presence-face-auth", + title: "User presence (Face Auth)", + description: + "Requests that require Face Auth and should fail when the user reaches Face Auth but does not complete it.", + cases: [ + { + id: "user_presence_v3_orb_failed", + title: "WID 3.0 Orb with Face Auth", + expected: IDKitErrorCodes.UserPresenceFailed, + prerequisite: + "Account can satisfy the 3.0 Orb preset. Reach the Face Auth step and fail or cancel that step.", + description: + "Runs the Orb legacy preset with require_user_presence=true and expects user_presence_failed.", + request: { type: "preset", presetKind: "orb" }, + requireUserPresence: true, + }, + { + id: "user_presence_v3_secure_document_failed", + title: "WID 3.0 Secure Document with Face Auth", + expected: IDKitErrorCodes.UserPresenceFailed, + prerequisite: + "Account can satisfy the secure document legacy preset. Reach the Face Auth step and fail or cancel that step.", + description: + "Runs the secure document legacy preset with require_user_presence=true and expects user_presence_failed.", + request: { type: "preset", presetKind: "secure_document" }, + requireUserPresence: true, + }, + { + id: "user_presence_v4_poh_failed", + title: "WID 4.0 Proof of Human with Face Auth", + expected: IDKitErrorCodes.UserPresenceFailed, + prerequisite: + "Account has a 4.0 Proof of Human credential. Reach the Face Auth step and fail or cancel that step.", + description: + "Requests proof_of_human with require_user_presence=true and expects user_presence_failed.", + request: { + type: "constraints", + constraintKind: "proof_of_human", + allowLegacyProofs: false, + }, + requireUserPresence: true, + }, + { + id: "user_presence_v4_passport_failed", + title: "WID 4.0 Passport with Face Auth", + expected: IDKitErrorCodes.UserPresenceFailed, + prerequisite: + "Account has a 4.0 Passport credential. Reach the Face Auth step and fail or cancel that step.", + description: + "Requests passport with require_user_presence=true and expects user_presence_failed.", + request: { + type: "constraints", + constraintKind: "passport", + allowLegacyProofs: false, + }, + requireUserPresence: true, + }, + { + id: "user_presence_v4_mnc_failed", + title: "WID 4.0 MNC with Face Auth", + expected: IDKitErrorCodes.UserPresenceFailed, + prerequisite: + "Account has a 4.0 MNC credential. Reach the Face Auth step and fail or cancel that step.", + description: + "Requests mnc with require_user_presence=true and expects user_presence_failed.", + request: { + type: "constraints", + constraintKind: "mnc", + allowLegacyProofs: false, + }, + requireUserPresence: true, + }, + ], + }, { id: "world-id-4-errors", title: "World ID 4.0 Error Cases", @@ -641,6 +724,24 @@ function caseExpectedLabel(testCase: ArenaCaseDefinition): string { return expectedLabel(testCase.expected, testCase.expectedProtocol); } +function withSectionAllowLegacyProofs( + request: RequestDefinition, + sectionId: string, + allowLegacyProofs: boolean, +): RequestDefinition { + if ( + sectionId !== CONFIGURABLE_ALLOW_LEGACY_SECTION_ID || + request.type !== "constraints" + ) { + return request; + } + + return { + ...request, + allowLegacyProofs, + }; +} + function makeAction(caseId: ArenaCaseId, actionPrefix: string): string { const base = actionPrefix.trim() || "idkit-arena"; if (caseId === "error_nullifier_replayed") { @@ -747,18 +848,33 @@ function buildFlowConfig(activeRun: ActiveRun): FlowConfig { }; } -function requestLabel(request: RequestDefinition): string { +function requestLabel( + request: RequestDefinition, + requireUserPresence = false, +): string { + const userPresence = requireUserPresence ? "require_user_presence=true" : ""; + if (request.type === "preset") { - return `preset: ${PRESET_KIND_TO_NAME[request.presetKind]}`; + return userPresence + ? `preset: ${PRESET_KIND_TO_NAME[request.presetKind]} (${userPresence})` + : `preset: ${PRESET_KIND_TO_NAME[request.presetKind]}`; + } + + const flags = [ + request.allowLegacyProofs + ? "allow_legacy_proofs=true" + : "allow_legacy_proofs=false", + ]; + + if (request.genesisIssuedAtMin === "future") { + flags.push("future genesis min"); } - const fallback = request.allowLegacyProofs - ? "allow_legacy_proofs=true" - : "allow_legacy_proofs=false"; - const genesis = - request.genesisIssuedAtMin === "future" ? ", future genesis min" : ""; + if (userPresence) { + flags.push(userPresence); + } - return `${CONSTRAINT_KIND_TO_NAME[request.constraintKind]} (${fallback}${genesis})`; + return `${CONSTRAINT_KIND_TO_NAME[request.constraintKind]} (${flags.join(", ")})`; } function resultProtocol(result: IDKitResult): ExpectedProtocol { @@ -822,6 +938,8 @@ export function ArenaClient(): ReactElement { const [useReturnTo, setUseReturnTo] = useState(false); const [returnTo, setReturnTo] = useState(""); const [actionPrefix, setActionPrefix] = useState("idkit-arena"); + const [allowLegacyProofsForV4Success, setAllowLegacyProofsForV4Success] = + useState(false); const [results, setResults] = useState< Partial> >({}); @@ -963,6 +1081,7 @@ export function ArenaClient(): ReactElement { rpContext: response.rpContext, signal: makeSignal(testCase.id, action), request: testCase.request, + requireUserPresence: testCase.requireUserPresence ?? false, }); setWidgetOpen(true); @@ -1200,12 +1319,35 @@ export function ArenaClient(): ReactElement { {ARENA_SECTIONS.map((section) => (
-

{section.title}

-

{section.description}

+
+

{section.title}

+

{section.description}

+
+ {section.id === CONFIGURABLE_ALLOW_LEGACY_SECTION_ID && ( + + )}
{section.cases.map((testCase) => { + const request = withSectionAllowLegacyProofs( + testCase.request, + section.id, + allowLegacyProofsForV4Success, + ); const result = results[testCase.id] ?? { status: "idle", message: "Not run", @@ -1228,7 +1370,12 @@ export function ArenaClient(): ReactElement {
Request
-
{requestLabel(testCase.request)}
+
+ {requestLabel( + request, + testCase.requireUserPresence ?? false, + )} +
Prerequisite
@@ -1245,7 +1392,12 @@ export function ArenaClient(): ReactElement {
-
- -
setIsGenesisTooltipOpen(true)} - onMouseLeave={() => setIsGenesisTooltipOpen(false)} - > - - {isGenesisTooltipOpen && ( - +
+ +
setIsGenesisTooltipOpen(true)} + onMouseLeave={() => setIsGenesisTooltipOpen(false)} > - {GENESIS_ISSUED_AT_MIN_TOOLTIP} - - )} -
- setGenesisEnabled(e.target.checked)} - /> - {genesisEnabled && ( - setGenesisDate(e.target.value)} - /> - )} -
+ + {isGenesisTooltipOpen && ( + + {GENESIS_ISSUED_AT_MIN_TOOLTIP} + + )} +
+ setGenesisEnabled(e.target.checked)} + /> + {genesisEnabled && ( + setGenesisDate(e.target.value)} + /> + )} +
+ + )} + {v4CredentialType === "identity_check" && ( + <> +
+ + + setRequireProofOfHumanity(e.target.checked) + } + /> +
+
+ + + setIdentityAttributes((current) => ({ + ...current, + document_type: { + ...current.document_type, + enabled: e.target.checked, + }, + })) + } + /> + {identityAttributes.document_type.enabled && ( + + )} +
+
+ + + setIdentityAttributes((current) => ({ + ...current, + document_number: { + ...current.document_number, + enabled: e.target.checked, + }, + })) + } + /> + {identityAttributes.document_number.enabled && ( + + setIdentityAttributes((current) => ({ + ...current, + document_number: { + ...current.document_number, + value: e.target.value, + }, + })) + } + placeholder="A1234567" + /> + )} +
+
+ + + setIdentityAttributes((current) => ({ + ...current, + issuing_country: { + ...current.issuing_country, + enabled: e.target.checked, + }, + })) + } + /> + {identityAttributes.issuing_country.enabled && ( + <> + + setIdentityAttributes((current) => ({ + ...current, + issuing_country: { + ...current.issuing_country, + value: normalizeAlpha3(e.target.value), + }, + })) + } + maxLength={3} + placeholder="JPN" + /> + {identityAttributes.issuing_country.value && + (isValidAlpha3( + identityAttributes.issuing_country.value, + ) ? ( + + {countries.getName( + identityAttributes.issuing_country.value, + "en", + )} + + ) : ( + + ISO 3166-1 alpha-3 + + ))} + + )} +
+
+ + + setIdentityAttributes((current) => ({ + ...current, + full_name: { + ...current.full_name, + enabled: e.target.checked, + }, + })) + } + /> + {identityAttributes.full_name.enabled && ( + + setIdentityAttributes((current) => ({ + ...current, + full_name: { + ...current.full_name, + value: e.target.value, + }, + })) + } + placeholder="Jane Doe" + /> + )} +
+
+ + + setIdentityAttributes((current) => ({ + ...current, + minimum_age: { + ...current.minimum_age, + enabled: e.target.checked, + }, + })) + } + /> + {identityAttributes.minimum_age.enabled && ( + + setIdentityAttributes((current) => ({ + ...current, + minimum_age: { + ...current.minimum_age, + value: e.target.value, + }, + })) + } + min={1} + max={255} + placeholder="18" + /> + )} +
+
+ + + setIdentityAttributes((current) => ({ + ...current, + nationality: { + ...current.nationality, + enabled: e.target.checked, + }, + })) + } + /> + {identityAttributes.nationality.enabled && ( + <> + + setIdentityAttributes((current) => ({ + ...current, + nationality: { + ...current.nationality, + value: normalizeAlpha3(e.target.value), + }, + })) + } + maxLength={3} + placeholder="JPN" + /> + {identityAttributes.nationality.value && + (isValidAlpha3(identityAttributes.nationality.value) ? ( + + {countries.getName( + identityAttributes.nationality.value, + "en", + )} + + ) : ( + + ISO 3166-1 alpha-3 + + ))} + + )} +
+ + )} )}
@@ -512,6 +900,17 @@ export function DemoClient(): ReactElement { placeholder="googlechromes://" />
+
+ + setRequireUserPresence(e.target.checked)} + /> +
@@ -525,12 +924,15 @@ export function DemoClient(): ReactElement { {worldIdVersion === "4.0" && ( <> - )}
+ {isIdentityCheck && identityAttributesPayload.length === 0 && ( +

Select at least one identity attribute.

+ )} {widgetError &&

Error: {widgetError}

} {widgetRpContext && @@ -542,10 +944,12 @@ export function DemoClient(): ReactElement { action={action || "test-action"} rp_context={widgetRpContext} allow_legacy_proofs={true} + require_user_presence={requireUserPresence} {...widgetConstraintsOrPreset} - onSuccess={(result) => {}} - handleVerify={async (result) => { + onSuccess={(result) => { setWidgetIdkitResult(result); + }} + handleVerify={async (result) => { const verified = await verifyProof(result); setWidgetVerifyResult(verified); }} @@ -564,10 +968,12 @@ export function DemoClient(): ReactElement { action={action || "test-action"} rp_context={widgetRpContext} allow_legacy_proofs={true} + require_user_presence={requireUserPresence} {...widgetConstraintsOrPreset} - onSuccess={(result) => {}} - handleVerify={async (result) => { + onSuccess={(result) => { setWidgetIdkitResult(result); + }} + handleVerify={async (result) => { const verified = await verifyProof(result); setWidgetVerifyResult(verified); }} @@ -583,6 +989,22 @@ export function DemoClient(): ReactElement { {widgetIdkitResult && ( <>

IDKit response

+ {widgetIdkitResult.protocol_version === "4.0" && + !("session_id" in widgetIdkitResult) && + widgetIdkitResult.identity_attested !== undefined && ( +

+ Identity Attested:{" "} + {widgetIdkitResult.identity_attested ? "✓ Yes" : "✗ No"} +

+ )}
             {JSON.stringify(widgetIdkitResult, null, 2)}
           
diff --git a/js/examples/nextjs/package.json b/js/examples/nextjs/package.json index 9507e67a..a4576bb4 100644 --- a/js/examples/nextjs/package.json +++ b/js/examples/nextjs/package.json @@ -12,6 +12,7 @@ "@worldcoin/idkit-server": "workspace:*", "takis-minikit-js": "2.0.0-dev.1", "eruda": "^3.4.1", + "i18n-iso-countries": "^7.14.0", "next": "^15.4.0", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/js/packages/core/src/__tests__/smoke.test.ts b/js/packages/core/src/__tests__/smoke.test.ts index 06f17561..b3f08762 100644 --- a/js/packages/core/src/__tests__/smoke.test.ts +++ b/js/packages/core/src/__tests__/smoke.test.ts @@ -12,6 +12,7 @@ import { orbLegacy, deviceLegacy, selfieCheckLegacy, + identityCheck, proofOfHuman, passport, isNode, @@ -53,6 +54,7 @@ describe("IDKitRequest API", () => { expect(typeof enumerate).toBe("function"); expect(typeof orbLegacy).toBe("function"); expect(typeof selfieCheckLegacy).toBe("function"); + expect(typeof identityCheck).toBe("function"); expect(typeof proofOfHuman).toBe("function"); expect(typeof passport).toBe("function"); }); @@ -97,6 +99,36 @@ describe("IDKitRequest API", () => { expect(preset).toHaveProperty("signal", "device-signal"); }); + it("should create identityCheck preset correctly", () => { + const preset = identityCheck({ + attributes: [ + { type: "minimum_age", value: 21 }, + { type: "nationality", value: "JPN" }, + ], + require_proof_of_humanity: false, + }); + expect(preset).toEqual({ + type: "IdentityCheck", + attributes: [ + { type: "minimum_age", value: 21 }, + { type: "nationality", value: "JPN" }, + ], + require_proof_of_humanity: false, + }); + }); + + it("should create identityCheck preset with proof-of-humanity requirement correctly", () => { + const preset = identityCheck({ + attributes: [{ type: "document_number", value: "AB123456" }], + require_proof_of_humanity: true, + }); + expect(preset).toEqual({ + type: "IdentityCheck", + attributes: [{ type: "document_number", value: "AB123456" }], + require_proof_of_humanity: true, + }); + }); + it("should create proofOfHuman preset correctly", () => { const preset = proofOfHuman({ signal: "poh-signal" }); expect(preset).toHaveProperty("type", "ProofOfHuman"); @@ -121,6 +153,35 @@ describe("IDKitRequest API", () => { ).toThrow("rp_context is required"); }); + it("should default require_user_presence to false in request config", () => { + const builder = IDKit.request({ + app_id: "app_staging_test", + action: "test-action", + rp_context: TEST_SESSION_CONFIG.rp_context, + allow_legacy_proofs: false, + }); + + expect((builder as any).config.require_user_presence).toBe(false); + }); + + it("should preserve require_user_presence in request and session configs", () => { + const requestBuilder = IDKit.request({ + app_id: "app_staging_test", + action: "test-action", + rp_context: TEST_SESSION_CONFIG.rp_context, + allow_legacy_proofs: false, + require_user_presence: true, + }); + + const sessionBuilder = IDKit.createSession({ + ...TEST_SESSION_CONFIG, + require_user_presence: true, + }); + + expect((requestBuilder as any).config.require_user_presence).toBe(true); + expect((sessionBuilder as any).config.require_user_presence).toBe(true); + }); + it("should reject malformed session_id values in proveSession", () => { expect(() => IDKit.proveSession( @@ -189,6 +250,7 @@ describe("IDKitRequest API", () => { null, null, true, + false, null, null, "production", @@ -203,6 +265,46 @@ describe("IDKitRequest API", () => { expect(result.payload.signal).toBe(rawAddressSignalHash); expect(result.legacy_signal_hash).toBe(rawAddressSignalHash); }); + + it("should include identity attributes in native payload from preset", () => { + const rpContext = new WasmModule.RpContextWasm( + "rp_123456789abcdef0", + "0x0000000000000000000000000000000000000000000000000000000000000001", + 1n, + 2n, + "0x" + "00".repeat(64) + "1b", + ); + const builder = WasmModule.request( + "app_staging_test", + "test-action", + rpContext, + null, + null, + false, + false, + null, + null, + ); + + const result = builder.nativePayloadFromPreset( + identityCheck({ + attributes: [ + { type: "minimum_age", value: 21 }, + { type: "nationality", value: "JPN" }, + ], + require_proof_of_humanity: false, + }), + ) as { + payload: { + identity_attributes: Array<{ type: string; value: number | string }>; + }; + }; + + expect(result.payload.identity_attributes).toEqual([ + { type: "minimum_age", value: 21 }, + { type: "nationality", value: "JPN" }, + ]); + }); }); describe("Enums", () => { @@ -229,6 +331,7 @@ describe("Enums", () => { ); expect(IDKitErrorCodes.InvalidTimestamp).toBe("invalid_timestamp"); expect(IDKitErrorCodes.RpSignatureExpired).toBe("rp_signature_expired"); + expect(IDKitErrorCodes.UserPresenceFailed).toBe("user_presence_failed"); expect(IDKitErrorCodes.InvalidRpIdFormat).toBe("invalid_rp_id_format"); expect(IDKitErrorCodes.Timeout).toBe("timeout"); expect(IDKitErrorCodes.Cancelled).toBe("cancelled"); diff --git a/js/packages/core/src/index.ts b/js/packages/core/src/index.ts index 8b8c0fa4..8ac20f01 100644 --- a/js/packages/core/src/index.ts +++ b/js/packages/core/src/index.ts @@ -18,6 +18,7 @@ export { documentLegacy, deviceLegacy, selfieCheckLegacy, + identityCheck, proofOfHuman, passport, // Types @@ -27,11 +28,14 @@ export { type WaitOptions, type RpContext, type Preset, + type IdentityAttribute, + type DocumentType, type OrbLegacyPreset, type SecureDocumentLegacyPreset, type DocumentLegacyPreset, type DeviceLegacyPreset, type SelfieCheckLegacyPreset, + type IdentityCheckPreset, type ProofOfHumanPreset, type PassportPreset, } from "./request"; diff --git a/js/packages/core/src/lib/wasm.ts b/js/packages/core/src/lib/wasm.ts index a3205b6b..7ae55f63 100644 --- a/js/packages/core/src/lib/wasm.ts +++ b/js/packages/core/src/lib/wasm.ts @@ -60,6 +60,8 @@ export type { CredentialType, ConstraintNode, CredentialRequestType, + DocumentType, + IdentityAttribute, // Preset types Preset, OrbLegacyPreset, @@ -67,6 +69,7 @@ export type { DocumentLegacyPreset, DeviceLegacyPreset, SelfieCheckLegacyPreset, + IdentityCheckPreset, ProofOfHumanPreset, PassportPreset, // Native transport types diff --git a/js/packages/core/src/request.ts b/js/packages/core/src/request.ts index 38c34957..9910f85f 100644 --- a/js/packages/core/src/request.ts +++ b/js/packages/core/src/request.ts @@ -298,11 +298,14 @@ export function enumerate(...nodes: ConstraintNode[]): { // Re-export preset types from WASM (source of truth in rust/core/src/wasm_bindings.rs) export type { Preset, + IdentityAttribute, + DocumentType, OrbLegacyPreset, SecureDocumentLegacyPreset, DocumentLegacyPreset, SelfieCheckLegacyPreset, DeviceLegacyPreset, + IdentityCheckPreset, ProofOfHumanPreset, PassportPreset, } from "./lib/wasm"; @@ -310,11 +313,13 @@ export type { // Import WASM preset type for function return types import type { Preset, + IdentityAttribute, OrbLegacyPreset, SecureDocumentLegacyPreset, DocumentLegacyPreset, SelfieCheckLegacyPreset, DeviceLegacyPreset, + IdentityCheckPreset, ProofOfHumanPreset, PassportPreset, } from "./lib/wasm"; @@ -420,6 +425,25 @@ export function selfieCheckLegacy( return { type: "SelfieCheckLegacy", signal: opts.signal }; } +/** + * Creates an IdentityCheck preset for document-based identity attestation. + * + * This preset requires World ID 4.0-compatible clients. + * + * @param params - Identity attribute filters and proof-of-humanity requirement + * @returns An IdentityCheck preset + */ +export function identityCheck(params: { + attributes: IdentityAttribute[]; + require_proof_of_humanity: boolean; +}): IdentityCheckPreset { + return { + type: "IdentityCheck", + attributes: params.attributes, + require_proof_of_humanity: params.require_proof_of_humanity, + }; +} + /** * Creates a ProofOfHuman preset for World ID 4.0 with legacy Orb fallback * @@ -481,6 +505,7 @@ function createWasmBuilderFromConfig( config.action_description ?? null, config.bridge_url ?? null, config.allow_legacy_proofs ?? false, + config.require_user_presence ?? false, config.override_connect_base_url ?? null, config.return_to ?? null, config.environment ?? null, @@ -494,6 +519,7 @@ function createWasmBuilderFromConfig( rpContext, config.action_description ?? null, config.bridge_url ?? null, + config.require_user_presence ?? false, config.override_connect_base_url ?? null, config.return_to ?? null, config.environment ?? null, @@ -506,6 +532,7 @@ function createWasmBuilderFromConfig( rpContext, config.action_description ?? null, config.bridge_url ?? null, + config.require_user_presence ?? false, config.override_connect_base_url ?? null, config.return_to ?? null, config.environment ?? null, @@ -793,6 +820,7 @@ function createRequest(config: IDKitRequestConfig): IDKitBuilder { bridge_url: config.bridge_url, return_to: config.return_to, allow_legacy_proofs: config.allow_legacy_proofs, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, environment: config.environment, }); @@ -850,6 +878,7 @@ function createRequestWithInviteCode( bridge_url: config.bridge_url, return_to: config.return_to, allow_legacy_proofs: config.allow_legacy_proofs, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, environment: config.environment, }); @@ -899,6 +928,7 @@ function createSession(config: IDKitSessionConfig): IDKitBuilder { action_description: config.action_description, bridge_url: config.bridge_url, return_to: config.return_to, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, environment: config.environment, }); @@ -960,6 +990,7 @@ function proveSession( action_description: config.action_description, bridge_url: config.bridge_url, return_to: config.return_to, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, environment: config.environment, }); @@ -1013,6 +1044,8 @@ export const IDKit = { deviceLegacy, /** Create a SelfieCheckLegacy preset for face verification */ selfieCheckLegacy, + /** Create an IdentityCheck preset for World ID 4.0 identity attestation */ + identityCheck, /** Create a ProofOfHuman preset for World ID 4.0 with legacy Orb fallback */ proofOfHuman, /** Create a Passport preset for World ID 4.0 with legacy document fallback */ diff --git a/js/packages/core/src/transports/native.test.ts b/js/packages/core/src/transports/native.test.ts index 619ae6a7..1bc9536a 100644 --- a/js/packages/core/src/transports/native.test.ts +++ b/js/packages/core/src/transports/native.test.ts @@ -114,6 +114,85 @@ describe("native transport request lifecycle", () => { expect(completion.success).toBe(true); }); + it("defaults missing user_presence_completed to false on success", async () => { + const req = createNativeRequest({ payload: 1 }, baseConfig, {}, ""); + activeRequest = req; + + const completionPromise = req.pollUntilCompletion({ timeout: 1000 }); + + miniKitHandlers["miniapp-verify-action"]?.({ + status: "success", + protocol_version: "3.0", + verification_level: "orb", + signal_hash: "0xabc", + proof: "0x01", + merkle_root: "0x02", + nullifier_hash: "0x03", + }); + + const completion = await completionPromise; + expect(completion.success).toBe(true); + if (completion.success) { + expect(completion.result.user_presence_completed).toBe(false); + } + }); + + it("fails when user presence is required but not completed", async () => { + const req = createNativeRequest( + { payload: 1 }, + { ...baseConfig, require_user_presence: true }, + {}, + "", + ); + activeRequest = req; + + const completionPromise = req.pollUntilCompletion({ timeout: 1000 }); + + miniKitHandlers["miniapp-verify-action"]?.({ + status: "success", + protocol_version: "3.0", + verification_level: "orb", + signal_hash: "0xabc", + proof: "0x01", + merkle_root: "0x02", + nullifier_hash: "0x03", + }); + + await expect(completionPromise).resolves.toEqual({ + success: false, + error: IDKitErrorCodes.UserPresenceFailed, + }); + }); + + it("preserves completed user presence on success", async () => { + const req = createNativeRequest( + { payload: 1 }, + { ...baseConfig, require_user_presence: true }, + {}, + "", + ); + activeRequest = req; + + const completionPromise = req.pollUntilCompletion({ timeout: 1000 }); + + miniKitHandlers["miniapp-verify-action"]?.({ + status: "success", + user_presence_completed: true, + protocol_version: "3.0", + verification_level: "orb", + signal_hash: "0xabc", + proof: "0x01", + merkle_root: "0x02", + nullifier_hash: "0x03", + }); + + const completion = await completionPromise; + expect(completion.success).toBe(true); + if (completion.success) { + expect(completion.result.user_presence_completed).toBe(true); + } + }); + it("uses per-identifier signal hashes when response omits signal_hash", async () => { const signalHashes = { proof_of_human: hashSignal("poh-signal"), diff --git a/js/packages/core/src/transports/native.ts b/js/packages/core/src/transports/native.ts index b69c842b..3a51f5c6 100644 --- a/js/packages/core/src/transports/native.ts +++ b/js/packages/core/src/transports/native.ts @@ -80,6 +80,7 @@ export interface BuilderConfig { bridge_url?: string; return_to?: string; allow_legacy_proofs?: boolean; + require_user_presence?: boolean; override_connect_base_url?: string; environment?: string; } @@ -174,12 +175,23 @@ class NativeIDKitRequest implements IDKitRequest { return; } + const userPresenceCompleted = getUserPresenceCompleted(responsePayload); + + if (config.require_user_presence === true && !userPresenceCompleted) { + this.complete({ + success: false, + error: IDKitErrorCodes.UserPresenceFailed, + }); + return; + } + try { const result = nativeResultToIDKitResult( responsePayload, config, signalHashes, legacySignalHash, + userPresenceCompleted, ); if (isDebug()) console.debug( @@ -371,6 +383,7 @@ function nativeResultToIDKitResult( config: BuilderConfig, signalHashes: Record, legacySignalHash: string, + userPresenceCompleted: boolean, ): IDKitResult { const p = payload as Record; const rpNonce = config.rp_context?.nonce ?? ""; @@ -393,6 +406,7 @@ function nativeResultToIDKitResult( environment: config.environment ?? "production", signal_hashes: signalHashes, identity_attested: p.identity_attested, + user_presence_completed: userPresenceCompleted, }) as IDKitResult; } @@ -425,6 +439,7 @@ function nativeResultToIDKitResult( merkle_root: v.merkle_root, nullifier: v.nullifier_hash, })), + user_presence_completed: userPresenceCompleted, environment: config.environment ?? "production", } satisfies IDKitResultV3; } @@ -446,6 +461,16 @@ function nativeResultToIDKitResult( nullifier: p.nullifier_hash, }, ], + user_presence_completed: userPresenceCompleted, environment: config.environment ?? "production", } satisfies IDKitResultV3; } + +function getUserPresenceCompleted(payload: unknown): boolean { + const p = payload as Record; + return ( + p?.user_presence_completed === true || + (p?.proof_response as Record | undefined) + ?.user_presence_completed === true + ); +} diff --git a/js/packages/core/src/types/config.ts b/js/packages/core/src/types/config.ts index 0fa77403..994ae987 100644 --- a/js/packages/core/src/types/config.ts +++ b/js/packages/core/src/types/config.ts @@ -58,6 +58,9 @@ export type IDKitRequestConfig = { */ allow_legacy_proofs: boolean; + /** Require World App to perform a user-presence check before verification. Defaults to false. */ + require_user_presence?: boolean; + /** Optional override for the connect base URL (e.g., for staging environments) */ override_connect_base_url?: string; @@ -84,6 +87,8 @@ export type IDKitSessionConfig = { bridge_url?: string; /** Optional deep-link callback URL appended as `return_to` on the connector URL. */ return_to?: string; + /** Require World App to perform a user-presence check before verification. Defaults to false. */ + require_user_presence?: boolean; /** Optional override for the connect base URL (e.g., for staging environments) */ override_connect_base_url?: string; diff --git a/js/packages/core/src/types/result.ts b/js/packages/core/src/types/result.ts index 7181a9b0..a2cc6afe 100644 --- a/js/packages/core/src/types/result.ts +++ b/js/packages/core/src/types/result.ts @@ -51,6 +51,7 @@ export enum IDKitErrorCodes { TimestampTooFarInFuture = "timestamp_too_far_in_future", InvalidTimestamp = "invalid_timestamp", RpSignatureExpired = "rp_signature_expired", + UserPresenceFailed = "user_presence_failed", IdentityAttributesNotMatched = "identity_attributes_not_matched", GenericError = "generic_error", // Client-side errors diff --git a/js/packages/react/src/__tests__/hooks.test.tsx b/js/packages/react/src/__tests__/hooks.test.tsx index b1cc90f7..2af1acce 100644 --- a/js/packages/react/src/__tests__/hooks.test.tsx +++ b/js/packages/react/src/__tests__/hooks.test.tsx @@ -141,6 +141,7 @@ describe("request/session hooks", () => { bridge_url: undefined, return_to: undefined, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: undefined, environment: undefined, }); @@ -181,6 +182,7 @@ describe("request/session hooks", () => { rp_context: baseRpContext, action_description: undefined, bridge_url: undefined, + require_user_presence: false, override_connect_base_url: undefined, return_to: undefined, environment: undefined, @@ -222,6 +224,7 @@ describe("request/session hooks", () => { rp_context: baseRpContext, action_description: undefined, bridge_url: undefined, + require_user_presence: false, override_connect_base_url: undefined, return_to: undefined, environment: undefined, @@ -266,11 +269,46 @@ describe("request/session hooks", () => { bridge_url: undefined, return_to: "idkit://callback?step=proof", allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: undefined, environment: undefined, }); }); + it("request hook forwards require_user_presence to core", async () => { + requestMock.mockReturnValue({ + preset: vi.fn(async () => + makeRequest(async () => ({ + type: "confirmed", + result: { proof: "ok" }, + })), + ), + }); + + const { result } = renderHook(() => + useIDKitRequest({ + app_id: "app_test", + action: "test-action", + rp_context: baseRpContext, + allow_legacy_proofs: false, + require_user_presence: true, + preset: { type: "OrbLegacy" }, + }), + ); + + act(() => { + result.current.open(); + }); + + await waitFor(() => { + expect(result.current.isSuccess).toBe(true); + }); + + expect(requestMock).toHaveBeenCalledWith( + expect.objectContaining({ require_user_presence: true }), + ); + }); + it("session hook forwards return_to to createSession", async () => { createSessionMock.mockReturnValue({ constraints: vi.fn(async () => ({ @@ -287,6 +325,7 @@ describe("request/session hooks", () => { app_id: "app_test", rp_context: baseRpContext, return_to: "idkit://callback?step=create", + require_user_presence: true, constraints: { all: [] }, }), ); @@ -304,6 +343,7 @@ describe("request/session hooks", () => { rp_context: baseRpContext, action_description: undefined, bridge_url: undefined, + require_user_presence: true, override_connect_base_url: undefined, return_to: "idkit://callback?step=create", environment: undefined, @@ -345,6 +385,7 @@ describe("request/session hooks", () => { rp_context: baseRpContext, action_description: undefined, bridge_url: undefined, + require_user_presence: false, override_connect_base_url: undefined, return_to: "idkit://callback?step=prove", environment: undefined, diff --git a/js/packages/react/src/__tests__/widgets.test.tsx b/js/packages/react/src/__tests__/widgets.test.tsx index 0c970169..beee8736 100644 --- a/js/packages/react/src/__tests__/widgets.test.tsx +++ b/js/packages/react/src/__tests__/widgets.test.tsx @@ -115,7 +115,7 @@ function createSessionProps( onSuccess: vi.fn(), app_id: "app_test", rp_context: baseRpContext, - constraints: { type: "orb" }, + constraints: { all: [] }, ...overrides, } as IDKitSessionWidgetProps; } diff --git a/js/packages/react/src/hooks/useIDKitRequest.ts b/js/packages/react/src/hooks/useIDKitRequest.ts index 22ee05e8..916439ec 100644 --- a/js/packages/react/src/hooks/useIDKitRequest.ts +++ b/js/packages/react/src/hooks/useIDKitRequest.ts @@ -17,6 +17,7 @@ export function useIDKitRequest( bridge_url: config.bridge_url, return_to: config.return_to, allow_legacy_proofs: config.allow_legacy_proofs, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, environment: config.environment, }); diff --git a/js/packages/react/src/hooks/useIDKitSession.ts b/js/packages/react/src/hooks/useIDKitSession.ts index 9e826128..97bd300c 100644 --- a/js/packages/react/src/hooks/useIDKitSession.ts +++ b/js/packages/react/src/hooks/useIDKitSession.ts @@ -36,6 +36,7 @@ export function useIDKitSession( rp_context: config.rp_context, action_description: config.action_description, bridge_url: config.bridge_url, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, return_to: config.return_to, environment: config.environment, @@ -45,6 +46,7 @@ export function useIDKitSession( rp_context: config.rp_context, action_description: config.action_description, bridge_url: config.bridge_url, + require_user_presence: config.require_user_presence ?? false, override_connect_base_url: config.override_connect_base_url, return_to: config.return_to, environment: config.environment, diff --git a/js/packages/react/src/index.ts b/js/packages/react/src/index.ts index 04b9a4ba..76ebf4ce 100644 --- a/js/packages/react/src/index.ts +++ b/js/packages/react/src/index.ts @@ -39,6 +39,7 @@ export { secureDocumentLegacy, deviceLegacy, selfieCheckLegacy, + identityCheck, proofOfHuman, passport, IDKitErrorCodes, @@ -61,6 +62,9 @@ export type { ResponseItemV4, ResponseItemSession, IDKitErrorCode, + DocumentType, + IdentityAttribute, + IdentityCheckPreset, ProofOfHumanPreset, PassportPreset, } from "@worldcoin/idkit-core"; diff --git a/kotlin/Examples/IDKitSampleApp/app/src/main/java/com/worldcoin/idkit/sample/MainActivity.kt b/kotlin/Examples/IDKitSampleApp/app/src/main/java/com/worldcoin/idkit/sample/MainActivity.kt index 57957a5d..dae800be 100644 --- a/kotlin/Examples/IDKitSampleApp/app/src/main/java/com/worldcoin/idkit/sample/MainActivity.kt +++ b/kotlin/Examples/IDKitSampleApp/app/src/main/java/com/worldcoin/idkit/sample/MainActivity.kt @@ -346,6 +346,7 @@ private class SampleModel { actionDescription = "Local Android sample", bridgeUrl = null, allowLegacyProofs = false, + requireUserPresence = false, overrideConnectBaseUrl = null, returnTo = returnToURL, environment = when (environment) { diff --git a/kotlin/README.md b/kotlin/README.md index 06b56991..4da56b4d 100644 --- a/kotlin/README.md +++ b/kotlin/README.md @@ -84,6 +84,7 @@ val config = IDKitRequestConfig( actionDescription = "Log in", bridgeUrl = null, allowLegacyProofs = false, + requireUserPresence = false, overrideConnectBaseUrl = null, returnTo = null, environment = Environment.STAGING, diff --git a/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt b/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt index 5257b678..95a4f846 100644 --- a/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt +++ b/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt @@ -13,11 +13,10 @@ import uniffi.idkit_core.AppError // import uniffi.idkit_core.CredentialRequest // import uniffi.idkit_core.CredentialType import uniffi.idkit_core.IdKitBuilder -import uniffi.idkit_core.IdKitRequestConfig +import uniffi.idkit_core.IdKitRequestConfig as NativeIDKitRequestConfig import uniffi.idkit_core.IdKitRequestWrapper import uniffi.idkit_core.IdKitResult -// TODO: Re-enable when World ID 4.0 is live -// import uniffi.idkit_core.IdKitSessionConfig +import uniffi.idkit_core.IdKitSessionConfig as NativeIDKitSessionConfig import uniffi.idkit_core.Preset import uniffi.idkit_core.Signal import uniffi.idkit_core.StatusWrapper @@ -31,12 +30,62 @@ import uniffi.idkit_core.idkitResultToJson as nativeIdkitResultToJson // import uniffi.idkit_core.proveSession as nativeProveSession import uniffi.idkit_core.request as nativeRequest -typealias IDKitRequestConfig = IdKitRequestConfig -// TODO: Re-enable when World ID 4.0 is live -// typealias IDKitSessionConfig = IdKitSessionConfig typealias IDKitResult = IdKitResult typealias RpContext = uniffi.idkit_core.RpContext typealias Environment = uniffi.idkit_core.Environment +typealias ConnectUrlMode = uniffi.idkit_core.ConnectUrlMode + +data class IDKitRequestConfig( + val appId: String, + val action: String, + val rpContext: RpContext, + val actionDescription: String? = null, + val bridgeUrl: String? = null, + val allowLegacyProofs: Boolean = false, + val requireUserPresence: Boolean = false, + val overrideConnectBaseUrl: String? = null, + val returnTo: String? = null, + val environment: Environment? = null, + val connectUrlMode: ConnectUrlMode? = null, +) { + internal fun toNative(): NativeIDKitRequestConfig = + NativeIDKitRequestConfig( + appId = appId, + action = action, + rpContext = rpContext, + actionDescription = actionDescription, + bridgeUrl = bridgeUrl, + allowLegacyProofs = allowLegacyProofs, + requireUserPresence = requireUserPresence, + overrideConnectBaseUrl = overrideConnectBaseUrl, + returnTo = returnTo, + environment = environment, + connectUrlMode = connectUrlMode, + ) +} + +data class IDKitSessionConfig( + val appId: String, + val rpContext: RpContext, + val actionDescription: String? = null, + val bridgeUrl: String? = null, + val requireUserPresence: Boolean = false, + val overrideConnectBaseUrl: String? = null, + val returnTo: String? = null, + val environment: Environment? = null, +) { + internal fun toNative(): NativeIDKitSessionConfig = + NativeIDKitSessionConfig( + appId = appId, + rpContext = rpContext, + actionDescription = actionDescription, + bridgeUrl = bridgeUrl, + requireUserPresence = requireUserPresence, + overrideConnectBaseUrl = overrideConnectBaseUrl, + returnTo = returnTo, + environment = environment, + ) +} class IDKitClientError(message: String) : IllegalArgumentException(message) @@ -63,6 +112,7 @@ enum class IDKitErrorCode(val rawValue: String) { TIMESTAMP_TOO_FAR_IN_FUTURE("timestamp_too_far_in_future"), INVALID_TIMESTAMP("invalid_timestamp"), RP_SIGNATURE_EXPIRED("rp_signature_expired"), + USER_PRESENCE_FAILED("user_presence_failed"), IDENTITY_ATTRIBUTES_NOT_MATCHED("identity_attributes_not_matched"), GENERIC_ERROR("generic_error"), TIMEOUT("timeout"), @@ -92,6 +142,7 @@ enum class IDKitErrorCode(val rawValue: String) { AppError.TIMESTAMP_TOO_FAR_IN_FUTURE -> TIMESTAMP_TOO_FAR_IN_FUTURE AppError.INVALID_TIMESTAMP -> INVALID_TIMESTAMP AppError.RP_SIGNATURE_EXPIRED -> RP_SIGNATURE_EXPIRED + AppError.USER_PRESENCE_FAILED -> USER_PRESENCE_FAILED AppError.IDENTITY_ATTRIBUTES_NOT_MATCHED -> IDENTITY_ATTRIBUTES_NOT_MATCHED AppError.GENERIC_ERROR -> GENERIC_ERROR } @@ -203,19 +254,19 @@ object IDKit { fun request(config: IDKitRequestConfig): IDKitBuilder { require(config.appId.isNotBlank()) { "app_id is required" } require(config.action.isNotBlank()) { "action is required" } - return IDKitBuilder(nativeRequest(config)) + return IDKitBuilder(nativeRequest(config.toNative())) } // TODO: Re-enable when World ID 4.0 is live // fun createSession(config: IDKitSessionConfig): IDKitBuilder { // require(config.appId.isNotBlank()) { "app_id is required" } - // return IDKitBuilder(nativeCreateSession(config)) + // return IDKitBuilder(nativeCreateSession(config.toNative())) // } // fun proveSession(sessionId: String, config: IDKitSessionConfig): IDKitBuilder { // require(sessionId.isNotBlank()) { "session_id is required" } // require(config.appId.isNotBlank()) { "app_id is required" } - // return IDKitBuilder(nativeProveSession(sessionId, config)) + // return IDKitBuilder(nativeProveSession(sessionId, config.toNative())) // } fun hashSignal(signal: String): String = hashSignalFfi(Signal.fromString(signal)) diff --git a/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt b/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt index da50115e..3af5b25a 100644 --- a/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt +++ b/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt @@ -16,7 +16,10 @@ import uniffi.idkit_core.RpContext import uniffi.idkit_core.StatusWrapper class IDKitTests { - private fun sampleResult(sessionId: String? = null): IDKitResult = + private fun sampleResult( + sessionId: String? = null, + userPresenceCompleted: Boolean = false, + ): IDKitResult = IDKitResult( protocolVersion = "4.0", nonce = "0x1234", @@ -24,6 +27,7 @@ class IDKitTests { actionDescription = "Sample action", sessionId = sessionId, responses = emptyList(), + userPresenceCompleted = userPresenceCompleted, environment = "production", ) @@ -47,6 +51,7 @@ class IDKitTests { actionDescription = null, bridgeUrl = null, allowLegacyProofs = false, + requireUserPresence = false, overrideConnectBaseUrl = null, returnTo = null, environment = Environment.STAGING, @@ -58,6 +63,7 @@ class IDKitTests { // rpContext = sampleRpContext(), // actionDescription = null, // bridgeUrl = null, + // requireUserPresence = false, // overrideConnectBaseUrl = null, // returnTo = null, // environment = Environment.STAGING, @@ -125,6 +131,10 @@ class IDKitTests { IDKitStatus.Failed(IDKitErrorCode.RP_SIGNATURE_EXPIRED), IDKitRequest.mapStatus(StatusWrapper.Failed(AppError.RP_SIGNATURE_EXPIRED)), ) + assertEquals( + IDKitStatus.Failed(IDKitErrorCode.USER_PRESENCE_FAILED), + IDKitRequest.mapStatus(StatusWrapper.Failed(AppError.USER_PRESENCE_FAILED)), + ) assertEquals( IDKitStatus.NetworkingError(IDKitErrorCode.CONNECTION_FAILED), IDKitRequest.mapStatus(StatusWrapper.NetworkingError(AppError.CONNECTION_FAILED)), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2248c54..3a2a618c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,14 +1,13 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: false excludeLinksFromLockfile: false overrides: - happy-dom: '>=20.0.0' + happy-dom: ">=20.0.0" importers: - .: devDependencies: prettier: @@ -17,7 +16,7 @@ importers: js/examples/browser: dependencies: - '@worldcoin/idkit-core': + "@worldcoin/idkit-core": specifier: workspace:* version: link:../../packages/core dotenv: @@ -26,8 +25,11 @@ importers: express: specifier: ^5.1.0 version: 5.2.1 + i18n-iso-countries: + specifier: ^7.14.0 + version: 7.14.0 devDependencies: - '@types/express': + "@types/express": specifier: ^5.0.2 version: 5.0.6 concurrently: @@ -42,15 +44,18 @@ importers: js/examples/nextjs: dependencies: - '@worldcoin/idkit': + "@worldcoin/idkit": specifier: workspace:* version: link:../../packages/react - '@worldcoin/idkit-server': + "@worldcoin/idkit-server": specifier: workspace:* version: link:../../packages/server eruda: specifier: ^3.4.1 version: 3.4.3 + i18n-iso-countries: + specifier: ^7.14.0 + version: 7.14.0 next: specifier: ^15.4.0 version: 15.5.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -67,10 +72,10 @@ importers: specifier: ^2.47.2 version: 2.47.2(typescript@5.9.3) devDependencies: - '@types/react': + "@types/react": specifier: ^18.3.12 version: 18.3.28 - '@types/react-dom': + "@types/react-dom": specifier: ^18.3.1 version: 18.3.7(@types/react@18.3.28) typescript: @@ -79,17 +84,17 @@ importers: js/packages/core: dependencies: - '@noble/hashes': + "@noble/hashes": specifier: ^1.7.2 version: 1.8.0 - '@worldcoin/idkit-server': + "@worldcoin/idkit-server": specifier: workspace:* version: link:../server devDependencies: - '@types/node': + "@types/node": specifier: ^20.19.30 version: 20.19.30 - '@vitest/coverage-v8': + "@vitest/coverage-v8": specifier: ^4.0.18 version: 4.0.18(vitest@4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0)) tsup: @@ -104,33 +109,33 @@ importers: js/packages/react: dependencies: - '@worldcoin/idkit-core': + "@worldcoin/idkit-core": specifier: workspace:* version: link:../core qrcode: specifier: ^1.5.4 version: 1.5.4 devDependencies: - '@testing-library/dom': + "@testing-library/dom": specifier: ^10.4.1 version: 10.4.1 - '@testing-library/jest-dom': + "@testing-library/jest-dom": specifier: ^6.6.3 version: 6.9.1 - '@testing-library/react': + "@testing-library/react": specifier: ^16.1.0 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@types/qrcode': + "@types/qrcode": specifier: ^1.5.5 version: 1.5.6 - '@types/react': + "@types/react": specifier: ^18.3.12 version: 18.3.28 - '@types/react-dom': + "@types/react-dom": specifier: ^18.3.1 version: 18.3.7(@types/react@18.3.28) happy-dom: - specifier: '>=20.0.0' + specifier: ">=20.0.0" version: 20.0.0 react: specifier: ^18.3.1 @@ -150,17 +155,17 @@ importers: js/packages/server: dependencies: - '@noble/hashes': + "@noble/hashes": specifier: ^1.7.2 version: 1.8.0 - '@noble/secp256k1': + "@noble/secp256k1": specifier: ^2.2.3 version: 2.3.0 devDependencies: - '@types/node': + "@types/node": specifier: ^20.19.30 version: 20.19.30 - '@vitest/coverage-v8': + "@vitest/coverage-v8": specifier: ^4.0.18 version: 4.0.18(vitest@4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0)) tsup: @@ -174,653 +179,1084 @@ importers: version: 4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0) packages: - - '@adobe/css-tools@4.4.4': - resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - - '@adraffy/ens-normalize@1.11.1': - resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} + "@adobe/css-tools@4.4.4": + resolution: + { + integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==, + } + + "@adraffy/ens-normalize@1.11.1": + resolution: + { + integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==, + } + + "@babel/code-frame@7.29.0": + resolution: + { + integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.27.1": + resolution: + { + integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.28.5": + resolution: + { + integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.28.6": + resolution: + { + integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==, + } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} - - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} - engines: {node: '>=18'} + "@babel/runtime@7.28.6": + resolution: + { + integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.28.6": + resolution: + { + integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==, + } + engines: { node: ">=6.9.0" } + + "@bcoe/v8-coverage@1.0.2": + resolution: + { + integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==, + } + engines: { node: ">=18" } + + "@emnapi/runtime@1.8.1": + resolution: + { + integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==, + } + + "@esbuild/aix-ppc64@0.27.2": + resolution: + { + integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.27.2": + resolution: + { + integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==, + } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.27.2": + resolution: + { + integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==, + } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.27.2": + resolution: + { + integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==, + } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.27.2": + resolution: + { + integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.27.2": + resolution: + { + integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==, + } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.27.2": + resolution: + { + integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==, + } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.27.2": + resolution: + { + integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==, + } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.27.2": + resolution: + { + integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.27.2": + resolution: + { + integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==, + } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.27.2": + resolution: + { + integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==, + } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.27.2": + resolution: + { + integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==, + } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.27.2": + resolution: + { + integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==, + } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.27.2": + resolution: + { + integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.27.2": + resolution: + { + integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==, + } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.27.2": + resolution: + { + integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==, + } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.27.2": + resolution: + { + integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==, + } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.27.2": + resolution: + { + integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.27.2": + resolution: + { + integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==, + } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.27.2": + resolution: + { + integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.27.2": + resolution: + { + integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==, + } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} + "@esbuild/openharmony-arm64@0.27.2": + resolution: + { + integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.27.2": + resolution: + { + integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==, + } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.27.2": + resolution: + { + integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.27.2": + resolution: + { + integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==, + } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.27.2": + resolution: + { + integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/colour@1.0.0": + resolution: + { + integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==, + } + engines: { node: ">=18" } + + "@img/sharp-darwin-arm64@0.34.5": + resolution: + { + integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-darwin-x64@0.34.5": + resolution: + { + integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + "@img/sharp-libvips-darwin-arm64@1.2.4": + resolution: + { + integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==, + } cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + "@img/sharp-libvips-darwin-x64@1.2.4": + resolution: + { + integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==, + } cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + "@img/sharp-libvips-linux-arm64@1.2.4": + resolution: + { + integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==, + } cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + "@img/sharp-libvips-linux-arm@1.2.4": + resolution: + { + integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==, + } cpu: [arm] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + "@img/sharp-libvips-linux-ppc64@1.2.4": + resolution: + { + integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==, + } cpu: [ppc64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + "@img/sharp-libvips-linux-riscv64@1.2.4": + resolution: + { + integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==, + } cpu: [riscv64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + "@img/sharp-libvips-linux-s390x@1.2.4": + resolution: + { + integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==, + } cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + "@img/sharp-libvips-linux-x64@1.2.4": + resolution: + { + integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==, + } cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": + resolution: + { + integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==, + } cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + "@img/sharp-libvips-linuxmusl-x64@1.2.4": + resolution: + { + integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==, + } cpu: [x64] os: [linux] - - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [musl] + + "@img/sharp-linux-arm64@0.34.5": + resolution: + { + integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] - - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [glibc] + + "@img/sharp-linux-arm@0.34.5": + resolution: + { + integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm] os: [linux] - - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [glibc] + + "@img/sharp-linux-ppc64@0.34.5": + resolution: + { + integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [ppc64] os: [linux] - - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [glibc] + + "@img/sharp-linux-riscv64@0.34.5": + resolution: + { + integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [riscv64] os: [linux] - - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [glibc] + + "@img/sharp-linux-s390x@0.34.5": + resolution: + { + integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [s390x] os: [linux] - - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [glibc] + + "@img/sharp-linux-x64@0.34.5": + resolution: + { + integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] - - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [glibc] + + "@img/sharp-linuxmusl-arm64@0.34.5": + resolution: + { + integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] - - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [musl] + + "@img/sharp-linuxmusl-x64@0.34.5": + resolution: + { + integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] - - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + libc: [musl] + + "@img/sharp-wasm32@0.34.5": + resolution: + { + integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-arm64@0.34.5": + resolution: + { + integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-ia32@0.34.5": + resolution: + { + integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-x64@0.34.5": + resolution: + { + integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [win32] - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@next/env@15.5.12': - resolution: {integrity: sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==} - - '@next/swc-darwin-arm64@15.5.12': - resolution: {integrity: sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==} - engines: {node: '>= 10'} + "@jridgewell/gen-mapping@0.3.13": + resolution: + { + integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, + } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.5.5": + resolution: + { + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, + } + + "@jridgewell/trace-mapping@0.3.31": + resolution: + { + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, + } + + "@next/env@15.5.12": + resolution: + { + integrity: sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==, + } + + "@next/swc-darwin-arm64@15.5.12": + resolution: + { + integrity: sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.12': - resolution: {integrity: sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==} - engines: {node: '>= 10'} + "@next/swc-darwin-x64@15.5.12": + resolution: + { + integrity: sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==, + } + engines: { node: ">= 10" } cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.12': - resolution: {integrity: sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==} - engines: {node: '>= 10'} + "@next/swc-linux-arm64-gnu@15.5.12": + resolution: + { + integrity: sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - - '@next/swc-linux-arm64-musl@15.5.12': - resolution: {integrity: sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==} - engines: {node: '>= 10'} + libc: [glibc] + + "@next/swc-linux-arm64-musl@15.5.12": + resolution: + { + integrity: sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - - '@next/swc-linux-x64-gnu@15.5.12': - resolution: {integrity: sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==} - engines: {node: '>= 10'} + libc: [musl] + + "@next/swc-linux-x64-gnu@15.5.12": + resolution: + { + integrity: sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - - '@next/swc-linux-x64-musl@15.5.12': - resolution: {integrity: sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==} - engines: {node: '>= 10'} + libc: [glibc] + + "@next/swc-linux-x64-musl@15.5.12": + resolution: + { + integrity: sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - - '@next/swc-win32-arm64-msvc@15.5.12': - resolution: {integrity: sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==} - engines: {node: '>= 10'} + libc: [musl] + + "@next/swc-win32-arm64-msvc@15.5.12": + resolution: + { + integrity: sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.12': - resolution: {integrity: sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==} - engines: {node: '>= 10'} + "@next/swc-win32-x64-msvc@15.5.12": + resolution: + { + integrity: sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [win32] - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@noble/secp256k1@2.3.0': - resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} - - '@rollup/rollup-android-arm-eabi@4.57.0': - resolution: {integrity: sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==} + "@noble/ciphers@1.3.0": + resolution: + { + integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==, + } + engines: { node: ^14.21.3 || >=16 } + + "@noble/curves@1.9.1": + resolution: + { + integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==, + } + engines: { node: ^14.21.3 || >=16 } + + "@noble/hashes@1.8.0": + resolution: + { + integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, + } + engines: { node: ^14.21.3 || >=16 } + + "@noble/secp256k1@2.3.0": + resolution: + { + integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==, + } + + "@rollup/rollup-android-arm-eabi@4.57.0": + resolution: + { + integrity: sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==, + } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.57.0': - resolution: {integrity: sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==} + "@rollup/rollup-android-arm64@4.57.0": + resolution: + { + integrity: sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==, + } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.0': - resolution: {integrity: sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==} + "@rollup/rollup-darwin-arm64@4.57.0": + resolution: + { + integrity: sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==, + } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.0': - resolution: {integrity: sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==} + "@rollup/rollup-darwin-x64@4.57.0": + resolution: + { + integrity: sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==, + } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.0': - resolution: {integrity: sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==} + "@rollup/rollup-freebsd-arm64@4.57.0": + resolution: + { + integrity: sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==, + } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.0': - resolution: {integrity: sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==} + "@rollup/rollup-freebsd-x64@4.57.0": + resolution: + { + integrity: sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==, + } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.0': - resolution: {integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==} + "@rollup/rollup-linux-arm-gnueabihf@4.57.0": + resolution: + { + integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==, + } cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.57.0': - resolution: {integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==} + "@rollup/rollup-linux-arm-musleabihf@4.57.0": + resolution: + { + integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==, + } cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.57.0': - resolution: {integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==} + "@rollup/rollup-linux-arm64-gnu@4.57.0": + resolution: + { + integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==, + } cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.0': - resolution: {integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==} + "@rollup/rollup-linux-arm64-musl@4.57.0": + resolution: + { + integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==, + } cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.0': - resolution: {integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==} + "@rollup/rollup-linux-loong64-gnu@4.57.0": + resolution: + { + integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==, + } cpu: [loong64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.57.0': - resolution: {integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==} + "@rollup/rollup-linux-loong64-musl@4.57.0": + resolution: + { + integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==, + } cpu: [loong64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.57.0': - resolution: {integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==} + "@rollup/rollup-linux-ppc64-gnu@4.57.0": + resolution: + { + integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==, + } cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.57.0': - resolution: {integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==} + "@rollup/rollup-linux-ppc64-musl@4.57.0": + resolution: + { + integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==, + } cpu: [ppc64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.57.0': - resolution: {integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==} + "@rollup/rollup-linux-riscv64-gnu@4.57.0": + resolution: + { + integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==, + } cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.57.0': - resolution: {integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==} + "@rollup/rollup-linux-riscv64-musl@4.57.0": + resolution: + { + integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==, + } cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.57.0': - resolution: {integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==} + "@rollup/rollup-linux-s390x-gnu@4.57.0": + resolution: + { + integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==, + } cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.57.0': - resolution: {integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==} + "@rollup/rollup-linux-x64-gnu@4.57.0": + resolution: + { + integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==, + } cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.57.0': - resolution: {integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==} + "@rollup/rollup-linux-x64-musl@4.57.0": + resolution: + { + integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==, + } cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-openbsd-x64@4.57.0': - resolution: {integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==} + "@rollup/rollup-openbsd-x64@4.57.0": + resolution: + { + integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==, + } cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.0': - resolution: {integrity: sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==} + "@rollup/rollup-openharmony-arm64@4.57.0": + resolution: + { + integrity: sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==, + } cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.0': - resolution: {integrity: sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==} + "@rollup/rollup-win32-arm64-msvc@4.57.0": + resolution: + { + integrity: sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==, + } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.0': - resolution: {integrity: sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==} + "@rollup/rollup-win32-ia32-msvc@4.57.0": + resolution: + { + integrity: sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==, + } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.0': - resolution: {integrity: sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==} + "@rollup/rollup-win32-x64-gnu@4.57.0": + resolution: + { + integrity: sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==, + } cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.0': - resolution: {integrity: sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==} + "@rollup/rollup-win32-x64-msvc@4.57.0": + resolution: + { + integrity: sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==, + } cpu: [x64] os: [win32] - '@scure/base@1.2.6': - resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - - '@scure/bip32@1.7.0': - resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - - '@scure/bip39@1.6.0': - resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.9.1': - resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - - '@testing-library/react@16.3.2': - resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} - engines: {node: '>=18'} + "@scure/base@1.2.6": + resolution: + { + integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==, + } + + "@scure/bip32@1.7.0": + resolution: + { + integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==, + } + + "@scure/bip39@1.6.0": + resolution: + { + integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==, + } + + "@standard-schema/spec@1.1.0": + resolution: + { + integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, + } + + "@swc/helpers@0.5.15": + resolution: + { + integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, + } + + "@testing-library/dom@10.4.1": + resolution: + { + integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==, + } + engines: { node: ">=18" } + + "@testing-library/jest-dom@6.9.1": + resolution: + { + integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==, + } + engines: { node: ">=14", npm: ">=6", yarn: ">=1" } + + "@testing-library/react@16.3.2": + resolution: + { + integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==, + } + engines: { node: ">=18" } peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 || ^19.0.0 - '@types/react-dom': ^18.0.0 || ^19.0.0 + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@types/react-dom': + "@types/react-dom": optional: true - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} - - '@types/express@5.0.6': - resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} - - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/node@20.19.30': - resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} - - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/qrcode@1.5.6': - resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + "@types/aria-query@5.0.4": + resolution: + { + integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==, + } + + "@types/body-parser@1.19.6": + resolution: + { + integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==, + } + + "@types/chai@5.2.3": + resolution: + { + integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==, + } + + "@types/connect@3.4.38": + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } + + "@types/deep-eql@4.0.2": + resolution: + { + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, + } + + "@types/estree@1.0.8": + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } + + "@types/express-serve-static-core@5.1.1": + resolution: + { + integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==, + } + + "@types/express@5.0.6": + resolution: + { + integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==, + } + + "@types/http-errors@2.0.5": + resolution: + { + integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==, + } + + "@types/node@20.19.30": + resolution: + { + integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==, + } + + "@types/prop-types@15.7.15": + resolution: + { + integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==, + } + + "@types/qrcode@1.5.6": + resolution: + { + integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==, + } + + "@types/qs@6.14.0": + resolution: + { + integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==, + } + + "@types/range-parser@1.2.7": + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } + + "@types/react-dom@18.3.7": + resolution: + { + integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==, + } peerDependencies: - '@types/react': ^18.0.0 - - '@types/react@18.3.28': - resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} - - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - - '@types/serve-static@2.2.0': - resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - - '@types/whatwg-mimetype@3.0.2': - resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} - - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + "@types/react": ^18.0.0 + + "@types/react@18.3.28": + resolution: + { + integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==, + } + + "@types/send@1.2.1": + resolution: + { + integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==, + } + + "@types/serve-static@2.2.0": + resolution: + { + integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==, + } + + "@types/whatwg-mimetype@3.0.2": + resolution: + { + integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==, + } + + "@vitest/coverage-v8@4.0.18": + resolution: + { + integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==, + } peerDependencies: - '@vitest/browser': 4.0.18 + "@vitest/browser": 4.0.18 vitest: 4.0.18 peerDependenciesMeta: - '@vitest/browser': + "@vitest/browser": optional: true - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} - - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + "@vitest/expect@4.0.18": + resolution: + { + integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==, + } + + "@vitest/mocker@4.0.18": + resolution: + { + integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==, + } peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -830,25 +1266,43 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} - - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + "@vitest/pretty-format@4.0.18": + resolution: + { + integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==, + } + + "@vitest/runner@4.0.18": + resolution: + { + integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==, + } + + "@vitest/snapshot@4.0.18": + resolution: + { + integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==, + } + + "@vitest/spy@4.0.18": + resolution: + { + integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==, + } + + "@vitest/utils@4.0.18": + resolution: + { + integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==, + } abitype@1.2.3: - resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + resolution: + { + integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==, + } peerDependencies: - typescript: '>=5.0.4' + typescript: ">=5.0.4" zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: @@ -857,246 +1311,441 @@ packages: optional: true accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, + } + engines: { node: ">= 0.6" } acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: ">=0.4.0" } hasBin: true ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: ">=10" } any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + resolution: + { + integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, + } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: ">= 0.4" } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: ">=12" } ast-v8-to-istanbul@0.3.10: - resolution: {integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==} + resolution: + { + integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==, + } body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==, + } + engines: { node: ">=18" } bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } peerDependencies: - esbuild: '>=0.18' + esbuild: ">=0.18" bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: ">= 0.4" } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: ">= 0.4" } camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: ">=6" } caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + resolution: + { + integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==, + } chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==, + } + engines: { node: ">=18" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: ">= 14.16.0" } client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + resolution: + { + integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, + } cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + resolution: + { + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, + } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } concurrently@9.2.1: - resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==, + } + engines: { node: ">=18" } hasBin: true confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + resolution: + { + integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, + } consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} + resolution: + { + integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, + } + engines: { node: ^14.18.0 || >=16.10.0 } content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==, + } + engines: { node: ">=18" } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} + resolution: + { + integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, + } + engines: { node: ">=6.6.0" } cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, + } + engines: { node: ">= 0.6" } css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + resolution: + { + integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==, + } csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + resolution: + { + integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, + } debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: ">=0.10.0" } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, + } + engines: { node: ">=8" } + + diacritics@1.3.0: + resolution: + { + integrity: sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==, + } dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + resolution: + { + integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==, + } dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + resolution: + { + integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==, + } dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + resolution: + { + integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==, + } dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==, + } + engines: { node: ">=12" } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: ">= 0.4" } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: ">= 0.8" } eruda@3.4.3: - resolution: {integrity: sha512-J2TsF4dXSspOXev5bJ6mljv0dRrxj21wklrDzbvPmYaEmVoC+2psylyRi70nUPFh1mTQfIBsSusUtAMZtUN+/w==} + resolution: + { + integrity: sha512-J2TsF4dXSspOXev5bJ6mljv0dRrxj21wklrDzbvPmYaEmVoC+2psylyRi70nUPFh1mTQfIBsSusUtAMZtUN+/w==, + } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: ">= 0.4" } esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==, + } + engines: { node: ">=18" } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==, + } + engines: { node: ">=12.0.0" } express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==, + } + engines: { node: ">= 18" } fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + } + engines: { node: ">=12.0.0" } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1104,213 +1753,376 @@ packages: optional: true finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} + resolution: + { + integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==, + } + engines: { node: ">= 18.0.0" } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } fix-dts-default-cjs-exports@1.0.1: - resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + resolution: + { + integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==, + } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, + } + engines: { node: ">= 0.8" } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: ">= 0.4" } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: ">= 0.4" } get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + resolution: + { + integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==, + } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: ">= 0.4" } happy-dom@20.0.0: - resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} - engines: {node: '>=20.0.0'} + resolution: + { + integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==, + } + engines: { node: ">=20.0.0" } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: ">= 0.4" } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==, + } + engines: { node: ">= 0.8" } + + i18n-iso-countries@7.14.0: + resolution: + { + integrity: sha512-nXHJZYtNrfsi1UQbyRqm3Gou431elgLjKl//CYlnBGt5aTWdRPH1PiS2T/p/n8Q8LnqYqzQJik3Q7mkwvLokeg==, + } + engines: { node: ">= 12" } iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==, + } + engines: { node: ">=0.10.0" } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: ">=8" } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + resolution: + { + integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, + } isows@1.0.7: - resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + resolution: + { + integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==, + } peerDependencies: - ws: '*' + ws: "*" istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: ">=8" } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: ">=10" } istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==, + } + engines: { node: ">=8" } joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: ">=10" } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: ">=14" } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } hasBin: true lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + resolution: + { + integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, + } hasBin: true magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + resolution: + { + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + } magicast@0.5.1: - resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + resolution: + { + integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==, + } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: ">=10" } math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: ">= 0.4" } media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, + } + engines: { node: ">= 0.8" } merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, + } + engines: { node: ">=18" } mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, + } + engines: { node: ">= 0.6" } mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==, + } + engines: { node: ">=18" } min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: ">=4" } mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + resolution: + { + integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, + } + engines: { node: ">= 0.6" } next@15.5.12: - resolution: {integrity: sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + resolution: + { + integrity: sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==, + } + engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } hasBin: true peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' + "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.51.1 + babel-plugin-react-compiler: "*" react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: - '@opentelemetry/api': + "@opentelemetry/api": optional: true - '@playwright/test': + "@playwright/test": optional: true babel-plugin-react-compiler: optional: true @@ -1318,81 +2130,138 @@ packages: optional: true object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: ">= 0.4" } obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + resolution: + { + integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==, + } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } ox@0.14.0: - resolution: {integrity: sha512-WLOB7IKnmI3Ol6RAqY7CJdZKl8QaI44LN91OGF1061YIeN6bL5IsFcdp7+oQShRyamE/8fW/CBRWhJAOzI35Dw==} + resolution: + { + integrity: sha512-WLOB7IKnmI3Ol6RAqY7CJdZKl8QaI44LN91OGF1061YIeN6bL5IsFcdp7+oQShRyamE/8fW/CBRWhJAOzI35Dw==, + } peerDependencies: - typescript: '>=5.4.0' + typescript: ">=5.4.0" peerDependenciesMeta: typescript: optional: true p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + resolution: + { + integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==, + } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, + } + engines: { node: ">=12" } pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, + } + engines: { node: ">= 6" } pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + resolution: + { + integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, + } pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==, + } + engines: { node: ">=10.13.0" } postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, + } + engines: { node: ">= 18" } peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' + jiti: ">=1.21.0" + postcss: ">=8.0.9" tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: @@ -1406,200 +2275,344 @@ packages: optional: true postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, + } + engines: { node: ^10 || ^12 || >=14 } postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, + } + engines: { node: ^10 || ^12 || >=14 } prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, + } + engines: { node: ">=14" } hasBin: true pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==, + } + engines: { node: ">=10.13.0" } hasBin: true qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==, + } + engines: { node: ">=0.6" } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==, + } + engines: { node: ">= 0.10" } react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + resolution: + { + integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, + } peerDependencies: react: ^18.3.1 react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + resolution: + { + integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, + } react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, + } + engines: { node: ">=0.10.0" } readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: ">= 14.18.0" } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: ">=8" } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } rollup@4.57.0: - resolution: {integrity: sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, + } + engines: { node: ">= 18" } rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + resolution: + { + integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, + } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + resolution: + { + integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, + } semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==, + } + engines: { node: ">=10" } hasBin: true send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==, + } + engines: { node: ">= 18" } serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==, + } + engines: { node: ">= 18" } set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + resolution: + { + integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==, + } + engines: { node: ">= 0.4" } side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: ">= 0.4" } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: ">= 0.4" } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: ">= 0.4" } side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: ">= 0.4" } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==, + } + engines: { node: ">= 12" } stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, + } + engines: { node: ">= 0.8" } std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + resolution: + { + integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==, + } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: ">=8" } styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, + } + engines: { node: ">= 12.0.0" } peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + "@babel/core": "*" + babel-plugin-macros: "*" + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" peerDependenciesMeta: - '@babel/core': + "@babel/core": optional: true babel-plugin-macros: optional: true sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==, + } + engines: { node: ">=16 || 14 >=14.17" } hasBin: true supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: ">=10" } takis-minikit-js@2.0.0-dev.1: - resolution: {integrity: sha512-VhZcoDCB74xJA37pAx6TqATruS+zhD96lY0wUlMVMbeAF7t/23klAKHQJjDPJfR7Zgy8BiZtmfFRVJOHntRyEQ==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-VhZcoDCB74xJA37pAx6TqATruS+zhD96lY0wUlMVMbeAF7t/23klAKHQJjDPJfR7Zgy8BiZtmfFRVJOHntRyEQ==, + } + engines: { node: ">= 16" } peerDependencies: react: ^17 || ^18 || ^19 siwe: ^3.0.0 @@ -1614,57 +2627,93 @@ packages: optional: true thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==, + } + engines: { node: ">=18" } tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, + } + engines: { node: ">=12.0.0" } tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==, + } + engines: { node: ">=14.0.0" } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } hasBin: true ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } tsup@8.5.1: - resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==, + } + engines: { node: ">=18" } hasBin: true peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 + "@microsoft/api-extractor": ^7.36.0 + "@swc/core": ^1 postcss: ^8.4.12 - typescript: '>=4.5.0' + typescript: ">=4.5.0" peerDependenciesMeta: - '@microsoft/api-extractor': + "@microsoft/api-extractor": optional: true - '@swc/core': + "@swc/core": optional: true postcss: optional: true @@ -1672,59 +2721,86 @@ packages: optional: true tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==, + } + engines: { node: ">=18.0.0" } hasBin: true type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, + } + engines: { node: ">= 0.6" } typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, + } + engines: { node: ">=14.17" } hasBin: true ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + resolution: + { + integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==, + } undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, + } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } viem@2.47.2: - resolution: {integrity: sha512-etDIwDgmDiGaPg8rUbJtUFuC3/nAJCbhMYyfh5dOcqNNkzBWTNcS2VluPSM5JVo+9U3b2hle2RkBEq3+xyvlvg==} + resolution: + { + integrity: sha512-etDIwDgmDiGaPg8rUbJtUFuC3/nAJCbhMYyfh5dOcqNNkzBWTNcS2VluPSM5JVo+9U3b2hle2RkBEq3+xyvlvg==, + } peerDependencies: - typescript: '>=5.0.4' + typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { + integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" less: ^4.0.0 lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 - stylus: '>=0.54.8' + stylus: ">=0.54.8" sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true jiti: optional: true @@ -1748,33 +2824,36 @@ packages: optional: true vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { + integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==, + } + engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } hasBin: true peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 - happy-dom: '>=20.0.0' - jsdom: '*' + "@edge-runtime/vm": "*" + "@opentelemetry/api": ^1.9.0 + "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 + "@vitest/browser-playwright": 4.0.18 + "@vitest/browser-preview": 4.0.18 + "@vitest/browser-webdriverio": 4.0.18 + "@vitest/ui": 4.0.18 + happy-dom: ">=20.0.0" + jsdom: "*" peerDependenciesMeta: - '@edge-runtime/vm': + "@edge-runtime/vm": optional: true - '@opentelemetry/api': + "@opentelemetry/api": optional: true - '@types/node': + "@types/node": optional: true - '@vitest/browser-playwright': + "@vitest/browser-playwright": optional: true - '@vitest/browser-preview': + "@vitest/browser-preview": optional: true - '@vitest/browser-webdriverio': + "@vitest/browser-webdriverio": optional: true - '@vitest/ui': + "@vitest/ui": optional: true happy-dom: optional: true @@ -1782,34 +2861,55 @@ packages: optional: true whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, + } + engines: { node: ">=12" } which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: ">=8" } hasBin: true wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: ">=8" } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==, + } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true @@ -1817,484 +2917,501 @@ packages: optional: true y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: ">=6" } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: ">=8" } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } snapshots: + "@adobe/css-tools@4.4.4": {} - '@adobe/css-tools@4.4.4': {} + "@adraffy/ens-normalize@1.11.1": {} - '@adraffy/ens-normalize@1.11.1': {} - - '@babel/code-frame@7.29.0': + "@babel/code-frame@7.29.0": dependencies: - '@babel/helper-validator-identifier': 7.28.5 + "@babel/helper-validator-identifier": 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/helper-string-parser@7.27.1': {} + "@babel/helper-string-parser@7.27.1": {} - '@babel/helper-validator-identifier@7.28.5': {} + "@babel/helper-validator-identifier@7.28.5": {} - '@babel/parser@7.28.6': + "@babel/parser@7.28.6": dependencies: - '@babel/types': 7.28.6 + "@babel/types": 7.28.6 - '@babel/runtime@7.28.6': {} + "@babel/runtime@7.28.6": {} - '@babel/types@7.28.6': + "@babel/types@7.28.6": dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + "@babel/helper-string-parser": 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 - '@bcoe/v8-coverage@1.0.2': {} + "@bcoe/v8-coverage@1.0.2": {} - '@emnapi/runtime@1.8.1': + "@emnapi/runtime@1.8.1": dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.2': + "@esbuild/aix-ppc64@0.27.2": optional: true - '@esbuild/android-arm64@0.27.2': + "@esbuild/android-arm64@0.27.2": optional: true - '@esbuild/android-arm@0.27.2': + "@esbuild/android-arm@0.27.2": optional: true - '@esbuild/android-x64@0.27.2': + "@esbuild/android-x64@0.27.2": optional: true - '@esbuild/darwin-arm64@0.27.2': + "@esbuild/darwin-arm64@0.27.2": optional: true - '@esbuild/darwin-x64@0.27.2': + "@esbuild/darwin-x64@0.27.2": optional: true - '@esbuild/freebsd-arm64@0.27.2': + "@esbuild/freebsd-arm64@0.27.2": optional: true - '@esbuild/freebsd-x64@0.27.2': + "@esbuild/freebsd-x64@0.27.2": optional: true - '@esbuild/linux-arm64@0.27.2': + "@esbuild/linux-arm64@0.27.2": optional: true - '@esbuild/linux-arm@0.27.2': + "@esbuild/linux-arm@0.27.2": optional: true - '@esbuild/linux-ia32@0.27.2': + "@esbuild/linux-ia32@0.27.2": optional: true - '@esbuild/linux-loong64@0.27.2': + "@esbuild/linux-loong64@0.27.2": optional: true - '@esbuild/linux-mips64el@0.27.2': + "@esbuild/linux-mips64el@0.27.2": optional: true - '@esbuild/linux-ppc64@0.27.2': + "@esbuild/linux-ppc64@0.27.2": optional: true - '@esbuild/linux-riscv64@0.27.2': + "@esbuild/linux-riscv64@0.27.2": optional: true - '@esbuild/linux-s390x@0.27.2': + "@esbuild/linux-s390x@0.27.2": optional: true - '@esbuild/linux-x64@0.27.2': + "@esbuild/linux-x64@0.27.2": optional: true - '@esbuild/netbsd-arm64@0.27.2': + "@esbuild/netbsd-arm64@0.27.2": optional: true - '@esbuild/netbsd-x64@0.27.2': + "@esbuild/netbsd-x64@0.27.2": optional: true - '@esbuild/openbsd-arm64@0.27.2': + "@esbuild/openbsd-arm64@0.27.2": optional: true - '@esbuild/openbsd-x64@0.27.2': + "@esbuild/openbsd-x64@0.27.2": optional: true - '@esbuild/openharmony-arm64@0.27.2': + "@esbuild/openharmony-arm64@0.27.2": optional: true - '@esbuild/sunos-x64@0.27.2': + "@esbuild/sunos-x64@0.27.2": optional: true - '@esbuild/win32-arm64@0.27.2': + "@esbuild/win32-arm64@0.27.2": optional: true - '@esbuild/win32-ia32@0.27.2': + "@esbuild/win32-ia32@0.27.2": optional: true - '@esbuild/win32-x64@0.27.2': + "@esbuild/win32-x64@0.27.2": optional: true - '@img/colour@1.0.0': + "@img/colour@1.0.0": optional: true - '@img/sharp-darwin-arm64@0.34.5': + "@img/sharp-darwin-arm64@0.34.5": optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + "@img/sharp-libvips-darwin-arm64": 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.5': + "@img/sharp-darwin-x64@0.34.5": optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + "@img/sharp-libvips-darwin-x64": 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + "@img/sharp-libvips-darwin-arm64@1.2.4": optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + "@img/sharp-libvips-darwin-x64@1.2.4": optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + "@img/sharp-libvips-linux-arm64@1.2.4": optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + "@img/sharp-libvips-linux-arm@1.2.4": optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + "@img/sharp-libvips-linux-ppc64@1.2.4": optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + "@img/sharp-libvips-linux-riscv64@1.2.4": optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + "@img/sharp-libvips-linux-s390x@1.2.4": optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + "@img/sharp-libvips-linux-x64@1.2.4": optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + "@img/sharp-libvips-linuxmusl-x64@1.2.4": optional: true - '@img/sharp-linux-arm64@0.34.5': + "@img/sharp-linux-arm64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + "@img/sharp-libvips-linux-arm64": 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.5': + "@img/sharp-linux-arm@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + "@img/sharp-libvips-linux-arm": 1.2.4 optional: true - '@img/sharp-linux-ppc64@0.34.5': + "@img/sharp-linux-ppc64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + "@img/sharp-libvips-linux-ppc64": 1.2.4 optional: true - '@img/sharp-linux-riscv64@0.34.5': + "@img/sharp-linux-riscv64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + "@img/sharp-libvips-linux-riscv64": 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.5': + "@img/sharp-linux-s390x@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + "@img/sharp-libvips-linux-s390x": 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.5': + "@img/sharp-linux-x64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + "@img/sharp-libvips-linux-x64": 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': + "@img/sharp-linuxmusl-arm64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': + "@img/sharp-linuxmusl-x64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 optional: true - '@img/sharp-wasm32@0.34.5': + "@img/sharp-wasm32@0.34.5": dependencies: - '@emnapi/runtime': 1.8.1 + "@emnapi/runtime": 1.8.1 optional: true - '@img/sharp-win32-arm64@0.34.5': + "@img/sharp-win32-arm64@0.34.5": optional: true - '@img/sharp-win32-ia32@0.34.5': + "@img/sharp-win32-ia32@0.34.5": optional: true - '@img/sharp-win32-x64@0.34.5': + "@img/sharp-win32-x64@0.34.5": optional: true - '@jridgewell/gen-mapping@0.3.13': + "@jridgewell/gen-mapping@0.3.13": dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/sourcemap-codec": 1.5.5 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/sourcemap-codec@1.5.5': {} + "@jridgewell/sourcemap-codec@1.5.5": {} - '@jridgewell/trace-mapping@0.3.31': + "@jridgewell/trace-mapping@0.3.31": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.5 - '@next/env@15.5.12': {} + "@next/env@15.5.12": {} - '@next/swc-darwin-arm64@15.5.12': + "@next/swc-darwin-arm64@15.5.12": optional: true - '@next/swc-darwin-x64@15.5.12': + "@next/swc-darwin-x64@15.5.12": optional: true - '@next/swc-linux-arm64-gnu@15.5.12': + "@next/swc-linux-arm64-gnu@15.5.12": optional: true - '@next/swc-linux-arm64-musl@15.5.12': + "@next/swc-linux-arm64-musl@15.5.12": optional: true - '@next/swc-linux-x64-gnu@15.5.12': + "@next/swc-linux-x64-gnu@15.5.12": optional: true - '@next/swc-linux-x64-musl@15.5.12': + "@next/swc-linux-x64-musl@15.5.12": optional: true - '@next/swc-win32-arm64-msvc@15.5.12': + "@next/swc-win32-arm64-msvc@15.5.12": optional: true - '@next/swc-win32-x64-msvc@15.5.12': + "@next/swc-win32-x64-msvc@15.5.12": optional: true - '@noble/ciphers@1.3.0': {} + "@noble/ciphers@1.3.0": {} - '@noble/curves@1.9.1': + "@noble/curves@1.9.1": dependencies: - '@noble/hashes': 1.8.0 + "@noble/hashes": 1.8.0 - '@noble/hashes@1.8.0': {} + "@noble/hashes@1.8.0": {} - '@noble/secp256k1@2.3.0': {} + "@noble/secp256k1@2.3.0": {} - '@rollup/rollup-android-arm-eabi@4.57.0': + "@rollup/rollup-android-arm-eabi@4.57.0": optional: true - '@rollup/rollup-android-arm64@4.57.0': + "@rollup/rollup-android-arm64@4.57.0": optional: true - '@rollup/rollup-darwin-arm64@4.57.0': + "@rollup/rollup-darwin-arm64@4.57.0": optional: true - '@rollup/rollup-darwin-x64@4.57.0': + "@rollup/rollup-darwin-x64@4.57.0": optional: true - '@rollup/rollup-freebsd-arm64@4.57.0': + "@rollup/rollup-freebsd-arm64@4.57.0": optional: true - '@rollup/rollup-freebsd-x64@4.57.0': + "@rollup/rollup-freebsd-x64@4.57.0": optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.0': + "@rollup/rollup-linux-arm-gnueabihf@4.57.0": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.0': + "@rollup/rollup-linux-arm-musleabihf@4.57.0": optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.0': + "@rollup/rollup-linux-arm64-gnu@4.57.0": optional: true - '@rollup/rollup-linux-arm64-musl@4.57.0': + "@rollup/rollup-linux-arm64-musl@4.57.0": optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.0': + "@rollup/rollup-linux-loong64-gnu@4.57.0": optional: true - '@rollup/rollup-linux-loong64-musl@4.57.0': + "@rollup/rollup-linux-loong64-musl@4.57.0": optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.0': + "@rollup/rollup-linux-ppc64-gnu@4.57.0": optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.0': + "@rollup/rollup-linux-ppc64-musl@4.57.0": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.0': + "@rollup/rollup-linux-riscv64-gnu@4.57.0": optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.0': + "@rollup/rollup-linux-riscv64-musl@4.57.0": optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.0': + "@rollup/rollup-linux-s390x-gnu@4.57.0": optional: true - '@rollup/rollup-linux-x64-gnu@4.57.0': + "@rollup/rollup-linux-x64-gnu@4.57.0": optional: true - '@rollup/rollup-linux-x64-musl@4.57.0': + "@rollup/rollup-linux-x64-musl@4.57.0": optional: true - '@rollup/rollup-openbsd-x64@4.57.0': + "@rollup/rollup-openbsd-x64@4.57.0": optional: true - '@rollup/rollup-openharmony-arm64@4.57.0': + "@rollup/rollup-openharmony-arm64@4.57.0": optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.0': + "@rollup/rollup-win32-arm64-msvc@4.57.0": optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.0': + "@rollup/rollup-win32-ia32-msvc@4.57.0": optional: true - '@rollup/rollup-win32-x64-gnu@4.57.0': + "@rollup/rollup-win32-x64-gnu@4.57.0": optional: true - '@rollup/rollup-win32-x64-msvc@4.57.0': + "@rollup/rollup-win32-x64-msvc@4.57.0": optional: true - '@scure/base@1.2.6': {} + "@scure/base@1.2.6": {} - '@scure/bip32@1.7.0': + "@scure/bip32@1.7.0": dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 + "@noble/curves": 1.9.1 + "@noble/hashes": 1.8.0 + "@scure/base": 1.2.6 - '@scure/bip39@1.6.0': + "@scure/bip39@1.6.0": dependencies: - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 + "@noble/hashes": 1.8.0 + "@scure/base": 1.2.6 - '@standard-schema/spec@1.1.0': {} + "@standard-schema/spec@1.1.0": {} - '@swc/helpers@0.5.15': + "@swc/helpers@0.5.15": dependencies: tslib: 2.8.1 - '@testing-library/dom@10.4.1': + "@testing-library/dom@10.4.1": dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.28.6 - '@types/aria-query': 5.0.4 + "@babel/code-frame": 7.29.0 + "@babel/runtime": 7.28.6 + "@types/aria-query": 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.9.1': + "@testing-library/jest-dom@6.9.1": dependencies: - '@adobe/css-tools': 4.4.4 + "@adobe/css-tools": 4.4.4 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + "@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - '@babel/runtime': 7.28.6 - '@testing-library/dom': 10.4.1 + "@babel/runtime": 7.28.6 + "@testing-library/dom": 10.4.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - '@types/aria-query@5.0.4': {} + "@types/aria-query@5.0.4": {} - '@types/body-parser@1.19.6': + "@types/body-parser@1.19.6": dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.19.30 + "@types/connect": 3.4.38 + "@types/node": 20.19.30 - '@types/chai@5.2.3': + "@types/chai@5.2.3": dependencies: - '@types/deep-eql': 4.0.2 + "@types/deep-eql": 4.0.2 assertion-error: 2.0.1 - '@types/connect@3.4.38': + "@types/connect@3.4.38": dependencies: - '@types/node': 20.19.30 + "@types/node": 20.19.30 - '@types/deep-eql@4.0.2': {} + "@types/deep-eql@4.0.2": {} - '@types/estree@1.0.8': {} + "@types/estree@1.0.8": {} - '@types/express-serve-static-core@5.1.1': + "@types/express-serve-static-core@5.1.1": dependencies: - '@types/node': 20.19.30 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 + "@types/node": 20.19.30 + "@types/qs": 6.14.0 + "@types/range-parser": 1.2.7 + "@types/send": 1.2.1 - '@types/express@5.0.6': + "@types/express@5.0.6": dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.1 - '@types/serve-static': 2.2.0 + "@types/body-parser": 1.19.6 + "@types/express-serve-static-core": 5.1.1 + "@types/serve-static": 2.2.0 - '@types/http-errors@2.0.5': {} + "@types/http-errors@2.0.5": {} - '@types/node@20.19.30': + "@types/node@20.19.30": dependencies: undici-types: 6.21.0 - '@types/prop-types@15.7.15': {} + "@types/prop-types@15.7.15": {} - '@types/qrcode@1.5.6': + "@types/qrcode@1.5.6": dependencies: - '@types/node': 20.19.30 + "@types/node": 20.19.30 - '@types/qs@6.14.0': {} + "@types/qs@6.14.0": {} - '@types/range-parser@1.2.7': {} + "@types/range-parser@1.2.7": {} - '@types/react-dom@18.3.7(@types/react@18.3.28)': + "@types/react-dom@18.3.7(@types/react@18.3.28)": dependencies: - '@types/react': 18.3.28 + "@types/react": 18.3.28 - '@types/react@18.3.28': + "@types/react@18.3.28": dependencies: - '@types/prop-types': 15.7.15 + "@types/prop-types": 15.7.15 csstype: 3.2.3 - '@types/send@1.2.1': + "@types/send@1.2.1": dependencies: - '@types/node': 20.19.30 + "@types/node": 20.19.30 - '@types/serve-static@2.2.0': + "@types/serve-static@2.2.0": dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 20.19.30 + "@types/http-errors": 2.0.5 + "@types/node": 20.19.30 - '@types/whatwg-mimetype@3.0.2': {} + "@types/whatwg-mimetype@3.0.2": {} - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0))': + "@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0))": dependencies: - '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.18 + "@bcoe/v8-coverage": 1.0.2 + "@vitest/utils": 4.0.18 ast-v8-to-istanbul: 0.3.10 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2305,43 +3422,43 @@ snapshots: tinyrainbow: 3.0.3 vitest: 4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0) - '@vitest/expect@4.0.18': + "@vitest/expect@4.0.18": dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + "@standard-schema/spec": 1.1.0 + "@types/chai": 5.2.3 + "@vitest/spy": 4.0.18 + "@vitest/utils": 4.0.18 chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@20.19.30)(tsx@4.21.0))': + "@vitest/mocker@4.0.18(vite@7.3.1(@types/node@20.19.30)(tsx@4.21.0))": dependencies: - '@vitest/spy': 4.0.18 + "@vitest/spy": 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.3.1(@types/node@20.19.30)(tsx@4.21.0) - '@vitest/pretty-format@4.0.18': + "@vitest/pretty-format@4.0.18": dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.18': + "@vitest/runner@4.0.18": dependencies: - '@vitest/utils': 4.0.18 + "@vitest/utils": 4.0.18 pathe: 2.0.3 - '@vitest/snapshot@4.0.18': + "@vitest/snapshot@4.0.18": dependencies: - '@vitest/pretty-format': 4.0.18 + "@vitest/pretty-format": 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.18': {} + "@vitest/spy@4.0.18": {} - '@vitest/utils@4.0.18': + "@vitest/utils@4.0.18": dependencies: - '@vitest/pretty-format': 4.0.18 + "@vitest/pretty-format": 4.0.18 tinyrainbow: 3.0.3 abitype@1.2.3(typescript@5.9.3): @@ -2375,7 +3492,7 @@ snapshots: ast-v8-to-istanbul@0.3.10: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/trace-mapping": 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -2487,6 +3604,8 @@ snapshots: detect-libc@2.1.2: optional: true + diacritics@1.3.0: {} + dijkstrajs@1.0.3: {} dom-accessibility-api@0.5.16: {} @@ -2521,32 +3640,32 @@ snapshots: esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + "@esbuild/aix-ppc64": 0.27.2 + "@esbuild/android-arm": 0.27.2 + "@esbuild/android-arm64": 0.27.2 + "@esbuild/android-x64": 0.27.2 + "@esbuild/darwin-arm64": 0.27.2 + "@esbuild/darwin-x64": 0.27.2 + "@esbuild/freebsd-arm64": 0.27.2 + "@esbuild/freebsd-x64": 0.27.2 + "@esbuild/linux-arm": 0.27.2 + "@esbuild/linux-arm64": 0.27.2 + "@esbuild/linux-ia32": 0.27.2 + "@esbuild/linux-loong64": 0.27.2 + "@esbuild/linux-mips64el": 0.27.2 + "@esbuild/linux-ppc64": 0.27.2 + "@esbuild/linux-riscv64": 0.27.2 + "@esbuild/linux-s390x": 0.27.2 + "@esbuild/linux-x64": 0.27.2 + "@esbuild/netbsd-arm64": 0.27.2 + "@esbuild/netbsd-x64": 0.27.2 + "@esbuild/openbsd-arm64": 0.27.2 + "@esbuild/openbsd-x64": 0.27.2 + "@esbuild/openharmony-arm64": 0.27.2 + "@esbuild/sunos-x64": 0.27.2 + "@esbuild/win32-arm64": 0.27.2 + "@esbuild/win32-ia32": 0.27.2 + "@esbuild/win32-x64": 0.27.2 escalade@3.2.0: {} @@ -2554,7 +3673,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 etag@1.8.1: {} @@ -2658,8 +3777,8 @@ snapshots: happy-dom@20.0.0: dependencies: - '@types/node': 20.19.30 - '@types/whatwg-mimetype': 3.0.2 + "@types/node": 20.19.30 + "@types/whatwg-mimetype": 3.0.2 whatwg-mimetype: 3.0.0 has-flag@4.0.0: {} @@ -2680,6 +3799,10 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + i18n-iso-countries@7.14.0: + dependencies: + diacritics: 1.3.0 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -2735,12 +3858,12 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/sourcemap-codec": 1.5.5 magicast@0.5.1: dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + "@babel/parser": 7.28.6 + "@babel/types": 7.28.6 source-map-js: 1.2.1 make-dir@4.0.0: @@ -2782,25 +3905,25 @@ snapshots: next@15.5.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 15.5.12 - '@swc/helpers': 0.5.15 + "@next/env": 15.5.12 + "@swc/helpers": 0.5.15 caniuse-lite: 1.0.30001769 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.6(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.12 - '@next/swc-darwin-x64': 15.5.12 - '@next/swc-linux-arm64-gnu': 15.5.12 - '@next/swc-linux-arm64-musl': 15.5.12 - '@next/swc-linux-x64-gnu': 15.5.12 - '@next/swc-linux-x64-musl': 15.5.12 - '@next/swc-win32-arm64-msvc': 15.5.12 - '@next/swc-win32-x64-msvc': 15.5.12 + "@next/swc-darwin-arm64": 15.5.12 + "@next/swc-darwin-x64": 15.5.12 + "@next/swc-linux-arm64-gnu": 15.5.12 + "@next/swc-linux-arm64-musl": 15.5.12 + "@next/swc-linux-x64-gnu": 15.5.12 + "@next/swc-linux-x64-musl": 15.5.12 + "@next/swc-win32-arm64-msvc": 15.5.12 + "@next/swc-win32-x64-msvc": 15.5.12 sharp: 0.34.5 transitivePeerDependencies: - - '@babel/core' + - "@babel/core" - babel-plugin-macros object-assign@4.1.1: {} @@ -2819,12 +3942,12 @@ snapshots: ox@0.14.0(typescript@5.9.3): dependencies: - '@adraffy/ens-normalize': 1.11.1 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 + "@adraffy/ens-normalize": 1.11.1 + "@noble/ciphers": 1.3.0 + "@noble/curves": 1.9.1 + "@noble/hashes": 1.8.0 + "@scure/bip32": 1.7.0 + "@scure/bip39": 1.6.0 abitype: 1.2.3(typescript@5.9.3) eventemitter3: 5.0.1 optionalDependencies: @@ -2944,33 +4067,33 @@ snapshots: rollup@4.57.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.0 - '@rollup/rollup-android-arm64': 4.57.0 - '@rollup/rollup-darwin-arm64': 4.57.0 - '@rollup/rollup-darwin-x64': 4.57.0 - '@rollup/rollup-freebsd-arm64': 4.57.0 - '@rollup/rollup-freebsd-x64': 4.57.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.0 - '@rollup/rollup-linux-arm-musleabihf': 4.57.0 - '@rollup/rollup-linux-arm64-gnu': 4.57.0 - '@rollup/rollup-linux-arm64-musl': 4.57.0 - '@rollup/rollup-linux-loong64-gnu': 4.57.0 - '@rollup/rollup-linux-loong64-musl': 4.57.0 - '@rollup/rollup-linux-ppc64-gnu': 4.57.0 - '@rollup/rollup-linux-ppc64-musl': 4.57.0 - '@rollup/rollup-linux-riscv64-gnu': 4.57.0 - '@rollup/rollup-linux-riscv64-musl': 4.57.0 - '@rollup/rollup-linux-s390x-gnu': 4.57.0 - '@rollup/rollup-linux-x64-gnu': 4.57.0 - '@rollup/rollup-linux-x64-musl': 4.57.0 - '@rollup/rollup-openbsd-x64': 4.57.0 - '@rollup/rollup-openharmony-arm64': 4.57.0 - '@rollup/rollup-win32-arm64-msvc': 4.57.0 - '@rollup/rollup-win32-ia32-msvc': 4.57.0 - '@rollup/rollup-win32-x64-gnu': 4.57.0 - '@rollup/rollup-win32-x64-msvc': 4.57.0 + "@rollup/rollup-android-arm-eabi": 4.57.0 + "@rollup/rollup-android-arm64": 4.57.0 + "@rollup/rollup-darwin-arm64": 4.57.0 + "@rollup/rollup-darwin-x64": 4.57.0 + "@rollup/rollup-freebsd-arm64": 4.57.0 + "@rollup/rollup-freebsd-x64": 4.57.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.57.0 + "@rollup/rollup-linux-arm-musleabihf": 4.57.0 + "@rollup/rollup-linux-arm64-gnu": 4.57.0 + "@rollup/rollup-linux-arm64-musl": 4.57.0 + "@rollup/rollup-linux-loong64-gnu": 4.57.0 + "@rollup/rollup-linux-loong64-musl": 4.57.0 + "@rollup/rollup-linux-ppc64-gnu": 4.57.0 + "@rollup/rollup-linux-ppc64-musl": 4.57.0 + "@rollup/rollup-linux-riscv64-gnu": 4.57.0 + "@rollup/rollup-linux-riscv64-musl": 4.57.0 + "@rollup/rollup-linux-s390x-gnu": 4.57.0 + "@rollup/rollup-linux-x64-gnu": 4.57.0 + "@rollup/rollup-linux-x64-musl": 4.57.0 + "@rollup/rollup-openbsd-x64": 4.57.0 + "@rollup/rollup-openharmony-arm64": 4.57.0 + "@rollup/rollup-win32-arm64-msvc": 4.57.0 + "@rollup/rollup-win32-ia32-msvc": 4.57.0 + "@rollup/rollup-win32-x64-gnu": 4.57.0 + "@rollup/rollup-win32-x64-msvc": 4.57.0 fsevents: 2.3.3 router@2.2.0: @@ -3026,34 +4149,34 @@ snapshots: sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + "@img/colour": 1.0.0 detect-libc: 2.1.2 semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 + "@img/sharp-darwin-arm64": 0.34.5 + "@img/sharp-darwin-x64": 0.34.5 + "@img/sharp-libvips-darwin-arm64": 1.2.4 + "@img/sharp-libvips-darwin-x64": 1.2.4 + "@img/sharp-libvips-linux-arm": 1.2.4 + "@img/sharp-libvips-linux-arm64": 1.2.4 + "@img/sharp-libvips-linux-ppc64": 1.2.4 + "@img/sharp-libvips-linux-riscv64": 1.2.4 + "@img/sharp-libvips-linux-s390x": 1.2.4 + "@img/sharp-libvips-linux-x64": 1.2.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 + "@img/sharp-linux-arm": 0.34.5 + "@img/sharp-linux-arm64": 0.34.5 + "@img/sharp-linux-ppc64": 0.34.5 + "@img/sharp-linux-riscv64": 0.34.5 + "@img/sharp-linux-s390x": 0.34.5 + "@img/sharp-linux-x64": 0.34.5 + "@img/sharp-linuxmusl-arm64": 0.34.5 + "@img/sharp-linuxmusl-x64": 0.34.5 + "@img/sharp-wasm32": 0.34.5 + "@img/sharp-win32-arm64": 0.34.5 + "@img/sharp-win32-ia32": 0.34.5 + "@img/sharp-win32-x64": 0.34.5 optional: true shell-quote@1.8.3: {} @@ -3119,7 +4242,7 @@ snapshots: sucrase@3.35.1: dependencies: - '@jridgewell/gen-mapping': 0.3.13 + "@jridgewell/gen-mapping": 0.3.13 commander: 4.1.1 lines-and-columns: 1.2.4 mz: 2.7.0 @@ -3227,10 +4350,10 @@ snapshots: viem@2.47.2(typescript@5.9.3): dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 + "@noble/curves": 1.9.1 + "@noble/hashes": 1.8.0 + "@scure/bip32": 1.7.0 + "@scure/bip39": 1.6.0 abitype: 1.2.3(typescript@5.9.3) isows: 1.0.7(ws@8.18.3) ox: 0.14.0(typescript@5.9.3) @@ -3251,19 +4374,19 @@ snapshots: rollup: 4.57.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.19.30 + "@types/node": 20.19.30 fsevents: 2.3.3 tsx: 4.21.0 vitest@4.0.18(@types/node@20.19.30)(happy-dom@20.0.0)(tsx@4.21.0): dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@20.19.30)(tsx@4.21.0)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + "@vitest/expect": 4.0.18 + "@vitest/mocker": 4.0.18(vite@7.3.1(@types/node@20.19.30)(tsx@4.21.0)) + "@vitest/pretty-format": 4.0.18 + "@vitest/runner": 4.0.18 + "@vitest/snapshot": 4.0.18 + "@vitest/spy": 4.0.18 + "@vitest/utils": 4.0.18 es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3278,7 +4401,7 @@ snapshots: vite: 7.3.1(@types/node@20.19.30)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.30 + "@types/node": 20.19.30 happy-dom: 20.0.0 transitivePeerDependencies: - jiti diff --git a/rust/core/src/bridge.rs b/rust/core/src/bridge.rs index 54ca73be..03e1d45e 100644 --- a/rust/core/src/bridge.rs +++ b/rust/core/src/bridge.rs @@ -12,7 +12,10 @@ use crate::{ ConstraintNode, Signal, }; use serde::{Deserialize, Serialize}; -use world_id_primitives::{FieldElement, ProofRequest, SessionId}; +use world_id_primitives::{ + FieldElement, ProofRequest, ProofResponse, RequestVersion, + ResponseItem as ProtocolResponseItem, SessionId, +}; #[cfg(feature = "native-crypto")] use crate::crypto::CryptoKey; @@ -121,6 +124,9 @@ struct BridgeRequestPayload { /// - `false`: Only accept v4 proofs. Use after migration cutoff or for new apps. allow_legacy_proofs: bool, + /// Whether World App should require a user-presence check before verification. + require_user_presence: bool, + /// Environment for the bridge request environment: Environment, @@ -249,6 +255,7 @@ pub fn proof_response_to_idkit_result( nonce: String, action: Option, action_description: Option, + user_presence_completed: bool, environment: Option, signal_hashes: &std::collections::HashMap, identity_attested: Option, @@ -281,6 +288,7 @@ pub fn proof_response_to_idkit_result( .to_owned(), action_description, responses, + user_presence_completed, environment, )) } else { @@ -290,6 +298,7 @@ pub fn proof_response_to_idkit_result( action, action_description, responses, + user_presence_completed, environment, ); result.identity_attested = identity_attested; @@ -309,21 +318,76 @@ enum BridgeResponse { Error { error_code: AppError }, /// World ID 4.0 protocol response - ResponseV2(world_id_primitives::ProofResponse), + ResponseV2(BridgeResponseV2), /// World ID 4.0 protocol response with extensions ResponseV2_1 { proof_response: world_id_primitives::ProofResponse, identity_attested: Option, + #[serde(default)] + user_presence_completed: bool, }, /// Multi-credential legacy: bridge sends v3 proofs via `legacy_responses` MultiLegacyResponse { legacy_responses: Vec, + #[serde(default)] + user_presence_completed: bool, }, /// V1 legacy (old World App 3.0, single credential) - ResponseV1(BridgeResponseV1), + ResponseV1(BridgeResponseV1WithMetadata), +} + +#[derive(Debug, Deserialize)] +struct BridgeResponseV2 { + /// The response id references request id + id: String, + /// Version corresponding to request version + version: RequestVersion, + /// Optional session identifier for session proofs + #[serde(default)] + session_id: Option, + /// Protocol-level proof response error + #[serde(default)] + error: Option, + /// Per-credential proof responses + responses: Vec, + /// Whether World App completed the requested user-presence check. + #[serde(default)] + user_presence_completed: bool, +} + +impl BridgeResponseV2 { + fn into_proof_response(self) -> ProofResponse { + ProofResponse { + id: self.id, + version: self.version, + session_id: self.session_id, + error: self.error, + responses: self.responses, + } + } +} + +#[derive(Debug, Deserialize)] +struct BridgeResponseV1WithMetadata { + #[serde(flatten)] + response: BridgeResponseV1, + /// Whether World App completed the requested user-presence check. + #[serde(default)] + user_presence_completed: bool, +} + +fn user_presence_failure_status( + require_user_presence: bool, + user_presence_completed: bool, +) -> Option { + if require_user_presence && !user_presence_completed { + Some(Status::Failed(AppError::UserPresenceFailed)) + } else { + None + } } /// Status of a verification request @@ -355,6 +419,7 @@ pub struct BridgeConnectionParams { pub legacy_signal: String, pub bridge_url: Option, pub allow_legacy_proofs: bool, + pub require_user_presence: bool, /// Optional override for the connect base URL (e.g., for staging environments) pub override_connect_base_url: Option, /// Optional deep-link callback URL appended as `return_to` on the connector URL @@ -448,6 +513,9 @@ pub struct BridgeConnection { return_to: Option, /// Resolved environment for this connection environment: Environment, + /// Whether a successful response must prove user presence was completed. + require_user_presence: bool, + // ─── Invite-code mode (WDP-73) — None for the legacy URL/QR path ──────── /// Canonical 6-char Crockford Base32 invite code shown to the user. pub(crate) invite_code: Option, @@ -552,6 +620,7 @@ pub fn build_request_payload( signal: legacy_signal_hash, timestamp, allow_legacy_proofs: params.allow_legacy_proofs, + require_user_presence: params.require_user_presence, environment: params.environment.unwrap_or_default(), return_to: params.return_to.clone(), }; @@ -702,6 +771,7 @@ impl BridgeConnection { override_connect_base_url: params.override_connect_base_url, return_to: params.return_to, environment: params.environment.unwrap_or_default(), + require_user_presence: params.require_user_presence, invite_code: None, code_expires_at: None, }) @@ -845,14 +915,34 @@ impl BridgeConnection { match bridge_response { BridgeResponse::Error { error_code } => Ok(Status::Failed(error_code)), - BridgeResponse::ResponseV2(proof_response) => { - self.handle_bridge_v2_response(proof_response, None) + BridgeResponse::ResponseV2(response) => { + let user_presence_completed = response.user_presence_completed; + self.handle_bridge_v2_response( + response.into_proof_response(), + None, + user_presence_completed, + ) } BridgeResponse::ResponseV2_1 { proof_response, identity_attested, - } => self.handle_bridge_v2_response(proof_response, identity_attested), - BridgeResponse::MultiLegacyResponse { legacy_responses } => { + user_presence_completed, + } => self.handle_bridge_v2_response( + proof_response, + identity_attested, + user_presence_completed, + ), + BridgeResponse::MultiLegacyResponse { + legacy_responses, + user_presence_completed, + } => { + if let Some(status) = user_presence_failure_status( + self.require_user_presence, + user_presence_completed, + ) { + return Ok(status); + } + let responses: Vec = legacy_responses .into_iter() .map(|item| { @@ -871,20 +961,30 @@ impl BridgeConnection { self.action.clone(), self.action_description.clone(), responses, + user_presence_completed, self.environment.as_ref(), ))) } BridgeResponse::ResponseV1(response) => { + if let Some(status) = user_presence_failure_status( + self.require_user_presence, + response.user_presence_completed, + ) { + return Ok(status); + } + // V1 responses are always protocol 3.0 // For V1 we don't have identifier, use verification_level as key let signal_hash = self.cached_signal_hashes.legacy(); - let item = response.into_response_item(signal_hash); + let user_presence_completed = response.user_presence_completed; + let item = response.response.into_response_item(signal_hash); Ok(Status::Confirmed(IDKitResult::new( "3.0", self.nonce.clone(), self.action.clone(), self.action_description.clone(), vec![item], + user_presence_completed, self.environment.as_ref(), ))) } @@ -898,7 +998,14 @@ impl BridgeConnection { &self, proof_response: world_id_primitives::ProofResponse, identity_attested: Option, + user_presence_completed: bool, ) -> Result { + if let Some(status) = + user_presence_failure_status(self.require_user_presence, user_presence_completed) + { + return Ok(status); + } + // Check for protocol-level error if let Some(error_code) = proof_response.error.as_deref() { return Ok(Status::Failed(AppError::from_code(error_code))); @@ -909,6 +1016,7 @@ impl BridgeConnection { self.nonce.clone(), self.action.clone(), self.action_description.clone(), + user_presence_completed, Some(self.environment), &self.cached_signal_hashes.signal_hashes, identity_attested, @@ -1079,6 +1187,7 @@ async fn try_create_invite_code_request( override_connect_base_url: params.override_connect_base_url.clone(), return_to: params.return_to.clone(), environment: params.environment.unwrap_or_default(), + require_user_presence: params.require_user_presence, invite_code: Some(code), code_expires_at: Some(code_expires_at), }) @@ -1106,6 +1215,8 @@ pub struct IDKitRequestConfig { /// - `true`: Accept both v3 and v4 proofs. Use during migration. /// - `false`: Only accept v4 proofs. Use after migration cutoff or for new apps. pub allow_legacy_proofs: bool, + /// Optional user-presence requirement. Defaults to false when omitted. + pub require_user_presence: Option, /// Optional override for the connect base URL (e.g., for staging environments) pub override_connect_base_url: Option, /// Optional deep-link callback URL appended as `return_to` on the connector URL @@ -1130,6 +1241,8 @@ pub struct IDKitSessionConfig { pub action_description: Option, /// Optional bridge URL (defaults to production) pub bridge_url: Option, + /// Optional user-presence requirement. Defaults to false when omitted. + pub require_user_presence: Option, /// Optional override for the connect base URL (e.g., for staging environments) pub override_connect_base_url: Option, /// Optional deep-link callback URL appended as `return_to` on the connector URL @@ -1191,6 +1304,7 @@ impl IDKitConfig { legacy_signal: String::new(), bridge_url, allow_legacy_proofs: config.allow_legacy_proofs, + require_user_presence: config.require_user_presence.unwrap_or(false), override_connect_base_url: config.override_connect_base_url.clone(), return_to: config.return_to.clone(), environment: config.environment, @@ -1216,6 +1330,7 @@ impl IDKitConfig { legacy_signal: String::new(), bridge_url, allow_legacy_proofs: false, + require_user_presence: config.require_user_presence.unwrap_or(false), override_connect_base_url: config.override_connect_base_url.clone(), return_to: config.return_to.clone(), environment: config.environment, @@ -1243,6 +1358,7 @@ impl IDKitConfig { legacy_signal: String::new(), bridge_url, allow_legacy_proofs: false, + require_user_presence: config.require_user_presence.unwrap_or(false), override_connect_base_url: config.override_connect_base_url.clone(), return_to: config.return_to.clone(), environment: config.environment, @@ -1303,6 +1419,7 @@ impl IDKitConfig { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url, allow_legacy_proofs, + require_user_presence: config.require_user_presence.unwrap_or(false), override_connect_base_url: config.override_connect_base_url.clone(), return_to: config.return_to.clone(), environment: config.environment, @@ -1327,6 +1444,7 @@ impl IDKitConfig { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url, allow_legacy_proofs: false, + require_user_presence: config.require_user_presence.unwrap_or(false), override_connect_base_url: config.override_connect_base_url.clone(), return_to: config.return_to.clone(), environment: config.environment, @@ -1353,6 +1471,7 @@ impl IDKitConfig { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url, allow_legacy_proofs: false, + require_user_presence: config.require_user_presence.unwrap_or(false), override_connect_base_url: config.override_connect_base_url.clone(), return_to: config.return_to.clone(), environment: config.environment, @@ -1797,6 +1916,7 @@ mod tests { proof_request: Some(proof_request), identity_attributes: None, allow_legacy_proofs: false, + require_user_presence: false, environment: Environment::Production, return_to: None, }; @@ -1808,6 +1928,7 @@ mod tests { assert!(json.contains("proof_request")); assert!(json.contains("rp_1234567890abcdef")); assert!(json.contains("allow_legacy_proofs")); + assert!(json.contains("require_user_presence")); } #[test] @@ -1838,6 +1959,7 @@ mod tests { legacy_signal: String::new(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, environment: Some(Environment::Production), @@ -1970,10 +2092,10 @@ mod tests { let response: BridgeResponse = serde_json::from_str(json).unwrap(); match response { BridgeResponse::ResponseV1(v1) => { - assert_eq!(v1.verification_level, VerificationLevel::Device); - assert_eq!(v1.proof, "0xproof"); - assert_eq!(v1.merkle_root, "0xroot"); - assert_eq!(v1.nullifier_hash, "0xnull"); + assert_eq!(v1.response.verification_level, VerificationLevel::Device); + assert_eq!(v1.response.proof, "0xproof"); + assert_eq!(v1.response.merkle_root, "0xroot"); + assert_eq!(v1.response.nullifier_hash, "0xnull"); } other => panic!("Expected ResponseV1, got: {other:?}"), } @@ -1993,12 +2115,57 @@ mod tests { let response: BridgeResponse = serde_json::from_str(json).unwrap(); match response { BridgeResponse::ResponseV1(v1) => { - assert_eq!(v1.verification_level, VerificationLevel::Orb); + assert_eq!(v1.response.verification_level, VerificationLevel::Orb); } other => panic!("Expected ResponseV1, got: {other:?}"), } } + #[test] + fn test_bridge_response_v2_user_presence_defaults_false() { + let json = r#"{ + "id": "request-id", + "version": 1, + "responses": [] + }"#; + + let response: BridgeResponse = serde_json::from_str(json).unwrap(); + match response { + BridgeResponse::ResponseV2(v2) => { + assert!(!v2.user_presence_completed); + } + other => panic!("Expected ResponseV2, got: {other:?}"), + } + } + + #[test] + fn test_bridge_response_v2_user_presence_explicit_true() { + let json = r#"{ + "id": "request-id", + "version": 1, + "responses": [], + "user_presence_completed": true + }"#; + + let response: BridgeResponse = serde_json::from_str(json).unwrap(); + match response { + BridgeResponse::ResponseV2(v2) => { + assert!(v2.user_presence_completed); + } + other => panic!("Expected ResponseV2, got: {other:?}"), + } + } + + #[test] + fn test_required_user_presence_fails_when_not_completed() { + assert_eq!( + user_presence_failure_status(true, false), + Some(Status::Failed(AppError::UserPresenceFailed)) + ); + assert_eq!(user_presence_failure_status(true, true), None); + assert_eq!(user_presence_failure_status(false, false), None); + } + #[test] fn test_bridge_response_error_deserialization() { let json = r#"{"error_code": "user_rejected"}"#; @@ -2125,7 +2292,9 @@ mod tests { let response: BridgeResponse = serde_json::from_str(json).unwrap(); match response { - BridgeResponse::MultiLegacyResponse { legacy_responses } => { + BridgeResponse::MultiLegacyResponse { + legacy_responses, .. + } => { assert_eq!(legacy_responses.len(), 1); assert_eq!( legacy_responses[0].verification_level, @@ -2158,7 +2327,9 @@ mod tests { let response: BridgeResponse = serde_json::from_str(json).unwrap(); match response { - BridgeResponse::MultiLegacyResponse { legacy_responses } => { + BridgeResponse::MultiLegacyResponse { + legacy_responses, .. + } => { assert_eq!(legacy_responses.len(), 2); assert_eq!( legacy_responses[0].verification_level, @@ -2210,6 +2381,7 @@ mod tests { ), ("invalid_timestamp", AppError::InvalidTimestamp), ("rp_signature_expired", AppError::RpSignatureExpired), + ("user_presence_failed", AppError::UserPresenceFailed), ]; for (code, expected) in cases { @@ -2222,6 +2394,39 @@ mod tests { } } + #[cfg(feature = "ffi")] + #[test] + fn test_request_config_defaults_user_presence_requirement_to_false() { + let signature = "0x".to_string() + &"00".repeat(64) + "1b"; + let rp_context = RpContext::new( + "rp_1234567890abcdef", + "0x0000000000000000000000000000000000000000000000000000000000000001", + 1_700_000_000, + 1_700_003_600, + &signature, + ) + .unwrap(); + let config = IDKitConfig::Request(IDKitRequestConfig { + app_id: "app_test".to_string(), + action: "test-action".to_string(), + rp_context: std::sync::Arc::new(rp_context), + action_description: None, + bridge_url: None, + allow_legacy_proofs: false, + require_user_presence: None, + override_connect_base_url: None, + return_to: None, + environment: None, + connect_url_mode: None, + }); + + let params = config + .to_params(ConstraintNode::Any { any: Vec::new() }) + .unwrap(); + + assert!(!params.require_user_presence); + } + #[test] fn test_selfie_check_legacy_preset_serializes_face_verification_level() { let preset = crate::preset::Preset::selfie_check_legacy(Some("face-signal".to_string())); @@ -2252,6 +2457,7 @@ mod tests { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, @@ -2293,6 +2499,7 @@ mod tests { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, @@ -2334,6 +2541,7 @@ mod tests { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url: None, allow_legacy_proofs: bridge_params.allow_legacy_proofs_override.unwrap_or(false), + require_user_presence: false, override_connect_base_url: None, return_to: None, environment: Some(Environment::Production), @@ -2379,6 +2587,7 @@ mod tests { legacy_signal: bridge_params.legacy_signal.unwrap_or_default(), bridge_url: None, allow_legacy_proofs: bridge_params.allow_legacy_proofs_override.unwrap_or(false), + require_user_presence: false, override_connect_base_url: None, return_to: None, environment: Some(Environment::Production), @@ -2446,6 +2655,7 @@ mod tests { legacy_signal: "test-signal".to_string(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, @@ -2492,6 +2702,7 @@ mod tests { legacy_signal: "test-signal".to_string(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, environment: None, @@ -2501,10 +2712,66 @@ mod tests { // native=true includes timestamp let payload = build_request_payload(¶ms, true).unwrap(); assert_eq!(payload["timestamp"], "2023-11-14T22:13:20Z"); + assert_eq!(payload["require_user_presence"], serde_json::json!(false)); // native=false omits timestamp let payload_bridge = build_request_payload(¶ms, false).unwrap(); assert!(payload_bridge.get("timestamp").is_none()); + assert_eq!( + payload_bridge["require_user_presence"], + serde_json::json!(false) + ); + } + + #[test] + fn test_build_request_payload_serializes_user_presence_requirement() { + let app_id = AppId::new("app_test").unwrap(); + let sig = "0x".to_string() + &"00".repeat(64) + "1b"; + let rp_context = RpContext::new( + "rp_1234567890abcdef", + "0x0000000000000000000000000000000000000000000000000000000000000001", + 1_700_000_000, + 1_700_003_600, + &sig, + ) + .unwrap(); + + let item = CredentialRequest::new( + CredentialType::ProofOfHuman, + Some(Signal::from_string("test")), + ); + let constraints = ConstraintNode::item(item); + + let params = BridgeConnectionParams { + app_id, + kind: RequestKind::Uniqueness { + action: "my-action".to_string(), + }, + constraints: Some(constraints), + rp_context, + action_description: None, + legacy_verification_level: VerificationLevel::Orb, + legacy_signal: "test-signal".to_string(), + bridge_url: None, + allow_legacy_proofs: false, + require_user_presence: true, + override_connect_base_url: None, + return_to: None, + environment: None, + identity_attributes: None, + }; + + let bridge_payload = build_request_payload(¶ms, false).unwrap(); + assert_eq!( + bridge_payload["require_user_presence"], + serde_json::json!(true) + ); + + let native_payload = build_request_payload(¶ms, true).unwrap(); + assert_eq!( + native_payload["require_user_presence"], + serde_json::json!(true) + ); } #[test] @@ -2532,6 +2799,7 @@ mod tests { legacy_signal: "test-signal".to_string(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: Some("idkitsample://callback".to_string()), environment: None, @@ -2568,6 +2836,7 @@ mod tests { legacy_signal: "test-signal".to_string(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, environment: None, @@ -2609,6 +2878,7 @@ mod tests { legacy_signal: address.to_string(), bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: None, @@ -2648,6 +2918,7 @@ mod tests { override_connect_base_url: None, return_to, environment: Environment::Production, + require_user_presence: false, invite_code: None, code_expires_at: None, } diff --git a/rust/core/src/error.rs b/rust/core/src/error.rs index 3b67d629..6101aa48 100644 --- a/rust/core/src/error.rs +++ b/rust/core/src/error.rs @@ -154,6 +154,10 @@ pub enum AppError { #[error("RP signature expired")] RpSignatureExpired, + /// User presence check failed or was not completed + #[error("User presence check failed")] + UserPresenceFailed, + /// Identity attributes did not match the required values #[error("Identity attributes not matched")] IdentityAttributesNotMatched, @@ -191,6 +195,7 @@ impl AppError { "timestamp_too_far_in_future" => Self::TimestampTooFarInFuture, "invalid_timestamp" => Self::InvalidTimestamp, "rp_signature_expired" => Self::RpSignatureExpired, + "user_presence_failed" => Self::UserPresenceFailed, "identity_attributes_not_matched" => Self::IdentityAttributesNotMatched, _ => Self::GenericError, } diff --git a/rust/core/src/types.rs b/rust/core/src/types.rs index cfbe2da7..a2526df5 100644 --- a/rust/core/src/types.rs +++ b/rust/core/src/types.rs @@ -711,6 +711,9 @@ pub struct IDKitResult { /// Array of credential responses (always successful - errors at `BridgeResponse` level) pub responses: Vec, + /// Whether World App completed the requested user-presence check. + pub user_presence_completed: bool, + /// The environment used for this request ("production" or "staging") pub environment: String, @@ -729,6 +732,7 @@ impl IDKitResult { action: Option, action_description: Option, responses: Vec, + user_presence_completed: bool, environment: impl Into, ) -> Self { Self { @@ -738,6 +742,7 @@ impl IDKitResult { action_description, session_id: None, responses, + user_presence_completed, environment: environment.into(), identity_attested: None, } @@ -751,6 +756,7 @@ impl IDKitResult { session_id: String, action_description: Option, responses: Vec, + user_presence_completed: bool, environment: impl Into, ) -> Self { Self { @@ -760,6 +766,7 @@ impl IDKitResult { action_description, session_id: Some(session_id), responses, + user_presence_completed, environment: environment.into(), identity_attested: None, } @@ -1375,6 +1382,7 @@ mod tests { None, None, responses, + false, "production", ); assert_eq!(result.protocol_version, "3.0"); diff --git a/rust/core/src/wasm_bindings.rs b/rust/core/src/wasm_bindings.rs index 4b6ea081..739a4199 100644 --- a/rust/core/src/wasm_bindings.rs +++ b/rust/core/src/wasm_bindings.rs @@ -312,6 +312,8 @@ struct ProofResponseToIDKitResultOptions { signal_hashes: HashMap, #[serde(default)] identity_attested: Option, + #[serde(default)] + user_presence_completed: bool, } fn app_error_code(error: crate::error::AppError) -> Result { @@ -354,6 +356,7 @@ pub fn proof_response_to_idkit_result_wasm( options.nonce, options.action, options.action_description, + options.user_presence_completed, options.environment, &options.signal_hashes, options.identity_attested, @@ -546,6 +549,7 @@ enum IDKitConfigWasm { action_description: Option, bridge_url: Option, allow_legacy_proofs: bool, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -555,6 +559,7 @@ enum IDKitConfigWasm { rp_context: RpContext, action_description: Option, bridge_url: Option, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -565,6 +570,7 @@ enum IDKitConfigWasm { rp_context: RpContext, action_description: Option, bridge_url: Option, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -585,6 +591,7 @@ impl IDKitConfigWasm { action_description, bridge_url, allow_legacy_proofs, + require_user_presence, override_connect_base_url, return_to, environment, @@ -610,6 +617,7 @@ impl IDKitConfigWasm { legacy_signal: String::new(), bridge_url, allow_legacy_proofs: *allow_legacy_proofs, + require_user_presence: *require_user_presence, override_connect_base_url: override_connect_base_url.clone(), return_to: return_to.clone(), @@ -625,6 +633,7 @@ impl IDKitConfigWasm { rp_context, action_description, bridge_url, + require_user_presence, override_connect_base_url, return_to, environment, @@ -648,6 +657,7 @@ impl IDKitConfigWasm { legacy_signal: String::new(), bridge_url, allow_legacy_proofs: false, + require_user_presence: *require_user_presence, override_connect_base_url: override_connect_base_url.clone(), return_to: return_to.clone(), @@ -664,6 +674,7 @@ impl IDKitConfigWasm { rp_context, action_description, bridge_url, + require_user_presence, override_connect_base_url, return_to, environment, @@ -689,6 +700,7 @@ impl IDKitConfigWasm { legacy_signal: String::new(), bridge_url, allow_legacy_proofs: false, + require_user_presence: *require_user_presence, override_connect_base_url: override_connect_base_url.clone(), return_to: return_to.clone(), @@ -725,6 +737,16 @@ impl IDKitConfigWasm { } } +fn validate_v1_preset_support(preset: &Preset) -> Result<(), &'static str> { + if matches!(preset, Preset::IdentityCheck { .. }) { + return Err( + "IdentityCheck presets are not supported for nativePayloadV1FromPreset. Use nativePayloadFromPreset with a World ID 4.0-compatible client instead.", + ); + } + + Ok(()) +} + /// Unified builder for creating `IDKit` requests and sessions (WASM) #[wasm_bindgen(js_name = IDKitBuilder)] pub struct IDKitBuilderWasm { @@ -744,6 +766,7 @@ impl IDKitBuilderWasm { action_description: Option, bridge_url: Option, allow_legacy_proofs: bool, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -756,6 +779,7 @@ impl IDKitBuilderWasm { action_description, bridge_url, allow_legacy_proofs, + require_user_presence, override_connect_base_url, return_to, environment, @@ -771,6 +795,7 @@ impl IDKitBuilderWasm { rp_context: RpContextWasm, action_description: Option, bridge_url: Option, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -781,6 +806,7 @@ impl IDKitBuilderWasm { rp_context: rp_context.into_inner(), action_description, bridge_url, + require_user_presence, override_connect_base_url, return_to, environment, @@ -797,6 +823,7 @@ impl IDKitBuilderWasm { rp_context: RpContextWasm, action_description: Option, bridge_url: Option, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -808,6 +835,7 @@ impl IDKitBuilderWasm { rp_context: rp_context.into_inner(), action_description, bridge_url, + require_user_presence, override_connect_base_url, return_to, environment, @@ -933,6 +961,8 @@ impl IDKitBuilderWasm { let preset: Preset = serde_wasm_bindgen::from_value(preset_json) .map_err(|e| JsValue::from_str(&format!("Invalid preset: {e}")))?; + validate_v1_preset_support(&preset).map_err(JsValue::from_str)?; + let params = self.config.to_params_from_preset(preset)?; let payload = crate::bridge::build_native_v1_payload(¶ms) @@ -1058,6 +1088,7 @@ pub fn request( action_description: Option, bridge_url: Option, allow_legacy_proofs: bool, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -1069,6 +1100,7 @@ pub fn request( action_description, bridge_url, allow_legacy_proofs, + require_user_presence, override_connect_base_url, return_to, environment, @@ -1081,11 +1113,13 @@ pub fn request( /// `session_`. #[must_use] #[wasm_bindgen(js_name = createSession)] +#[allow(clippy::too_many_arguments)] pub fn create_session( app_id: String, rp_context: RpContextWasm, action_description: Option, bridge_url: Option, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -1095,6 +1129,7 @@ pub fn create_session( rp_context, action_description, bridge_url, + require_user_presence, override_connect_base_url, return_to, environment, @@ -1114,6 +1149,7 @@ pub fn prove_session( rp_context: RpContextWasm, action_description: Option, bridge_url: Option, + require_user_presence: bool, override_connect_base_url: Option, return_to: Option, environment: Option, @@ -1124,6 +1160,7 @@ pub fn prove_session( rp_context, action_description, bridge_url, + require_user_presence, override_connect_base_url, return_to, environment, @@ -1419,6 +1456,8 @@ export interface IDKitResultV3 { action_description?: string; /** Array of V3 credential responses */ responses: ResponseItemV3[]; + /** Whether World App completed the requested user-presence check. */ + user_presence_completed: boolean; /** The environment used for this request ("production" or "staging") */ environment: string; } @@ -1435,8 +1474,12 @@ export interface IDKitResultV4 { action_description?: string; /** Array of V4 credential responses */ responses: ResponseItemV4[]; + /** Whether World App completed the requested user-presence check. */ + user_presence_completed: boolean; /** The environment used for this request ("production" or "staging") */ environment: string; + /** Whether identity attributes were attested. Only present on IdentityCheck responses. */ + identity_attested?: boolean; } /** V4 result for session proofs */ @@ -1451,6 +1494,8 @@ export interface IDKitResultSession { session_id: `session_${string}`; /** Array of session credential responses */ responses: ResponseItemSession[]; + /** Whether World App completed the requested user-presence check. */ + user_presence_completed: boolean; /** The environment used for this request ("production" or "staging") */ environment: string; } @@ -1471,6 +1516,7 @@ export interface ProofResponseToIDKitResultOptions { environment?: "production" | "staging"; signal_hashes?: Record; identity_attested?: boolean; + user_presence_completed?: boolean; } /** Converts a protocol ProofResponse payload into the public IDKitResult shape. */ @@ -1488,6 +1534,8 @@ export interface IDKitSessionConfig { bridge_url?: string; /** Optional deep-link callback URL appended as `return_to` on the connector URL */ return_to?: string; + /** Require World App to perform a user-presence check before verification. Defaults to false. */ + require_user_presence?: boolean; } /** RpContext for proof requests */ @@ -1528,6 +1576,7 @@ export type IDKitErrorCode = | "timestamp_too_far_in_future" | "invalid_timestamp" | "rp_signature_expired" + | "user_presence_failed" | "identity_attributes_not_matched" | "generic_error"; @@ -1542,6 +1591,16 @@ export type Status = // Export preset types #[wasm_bindgen(typescript_custom_section)] const TS_PRESET: &str = r#" +export type DocumentType = "passport" | "eid" | "mnc"; + +export type IdentityAttribute = + | { type: "document_type"; value: DocumentType } + | { type: "document_number"; value: string } + | { type: "issuing_country"; value: string } + | { type: "full_name"; value: string } + | { type: "minimum_age"; value: number } + | { type: "nationality"; value: string }; + export interface OrbLegacyPreset { /** This preset only returns World ID 3.0 proofs. Use it for compatibility with older IDKit versions. */ type: "OrbLegacy"; @@ -1573,6 +1632,23 @@ export interface DeviceLegacyPreset { signal?: string; } +export interface IdentityCheckPreset { + /** This preset requires World ID 4.0-compatible clients. */ + type: "IdentityCheck"; + attributes: IdentityAttribute[]; + require_proof_of_humanity: boolean; +} + +export type Preset = + | OrbLegacyPreset + | SecureDocumentLegacyPreset + | DocumentLegacyPreset + | SelfieCheckLegacyPreset + | DeviceLegacyPreset + | IdentityCheckPreset + | ProofOfHumanPreset + | PassportPreset; + export interface ProofOfHumanPreset { /** Requests a World ID 4.0 proof-of-human credential with legacy Orb fallback. */ type: "ProofOfHuman"; @@ -1585,14 +1661,16 @@ export interface PassportPreset { signal?: string; } -export type Preset = OrbLegacyPreset | SecureDocumentLegacyPreset | DocumentLegacyPreset | SelfieCheckLegacyPreset | DeviceLegacyPreset | ProofOfHumanPreset | PassportPreset; - export function orbLegacy(signal?: string): Preset; export function secureDocumentLegacy(signal?: string): Preset; export function documentLegacy(signal?: string): Preset; /** Preview: Selfie Check is currently in preview. Contact us if you need it enabled. */ export function selfieCheckLegacy(signal?: string): Preset; export function deviceLegacy(signal?: string): Preset; +export function identityCheck(params: { + attributes: IdentityAttribute[]; + require_proof_of_humanity: boolean; +}): Preset; export function proofOfHuman(signal?: string): Preset; export function passport(signal?: string): Preset; "#; @@ -1645,6 +1723,7 @@ export function createSession( rp_context: RpContextWasm, action_description?: string, bridge_url?: string, + require_user_presence?: boolean, override_connect_base_url?: string, return_to?: string, environment?: string @@ -1663,6 +1742,7 @@ export function proveSession( rp_context: RpContextWasm, action_description?: string, bridge_url?: string, + require_user_presence?: boolean, override_connect_base_url?: string, return_to?: string, environment?: string @@ -1671,13 +1751,28 @@ export function proveSession( #[cfg(test)] mod tests { - use super::IDKitConfigWasm; - use crate::{ConstraintNode, RpContext}; + use super::{validate_v1_preset_support, IDKitConfigWasm}; + use crate::{types::IdentityAttribute, ConstraintNode, Preset, RpContext}; fn sample_rp_context() -> RpContext { RpContext::new("rp_123456789abcdef0", "0x01", 1, 2, "0x1234").expect("valid rp_context") } + fn sample_request_config() -> IDKitConfigWasm { + IDKitConfigWasm::Request { + app_id: "app_staging_test".to_string(), + action: "test-action".to_string(), + rp_context: sample_rp_context(), + action_description: None, + bridge_url: None, + allow_legacy_proofs: false, + require_user_presence: false, + override_connect_base_url: None, + return_to: None, + environment: None, + } + } + #[test] fn request_params_preserve_return_to() { let config = IDKitConfigWasm::Request { @@ -1687,6 +1782,7 @@ mod tests { action_description: None, bridge_url: None, allow_legacy_proofs: false, + require_user_presence: false, override_connect_base_url: None, return_to: Some("idkit://callback?step=request".to_string()), environment: None, @@ -1702,6 +1798,28 @@ mod tests { ); } + #[test] + fn request_params_preserve_user_presence_requirement() { + let config = IDKitConfigWasm::Request { + app_id: "app_staging_test".to_string(), + action: "test-action".to_string(), + rp_context: sample_rp_context(), + action_description: None, + bridge_url: None, + allow_legacy_proofs: false, + require_user_presence: true, + override_connect_base_url: None, + return_to: None, + environment: None, + }; + + let params = config + .to_params(Some(ConstraintNode::Any { any: Vec::new() })) + .expect("request params"); + + assert!(params.require_user_presence); + } + #[test] fn create_session_params_preserve_return_to() { let config = IDKitConfigWasm::CreateSession { @@ -1709,6 +1827,7 @@ mod tests { rp_context: sample_rp_context(), action_description: None, bridge_url: None, + require_user_presence: false, override_connect_base_url: None, return_to: Some("idkit://callback?step=create".to_string()), environment: None, @@ -1732,6 +1851,7 @@ mod tests { rp_context: sample_rp_context(), action_description: None, bridge_url: None, + require_user_presence: false, override_connect_base_url: None, return_to: Some("idkit://callback?step=prove".to_string()), environment: None, @@ -1746,4 +1866,36 @@ mod tests { Some("idkit://callback?step=prove") ); } + + #[test] + fn native_payload_v1_from_preset_rejects_identity_check() { + let preset = Preset::identity_check(vec![IdentityAttribute::MinimumAge(21)], false); + + assert!(validate_v1_preset_support(&preset) + .expect_err("identity check should be rejected for v1") + .contains("IdentityCheck presets are not supported")); + } + + #[test] + fn native_payload_v1_from_preset_rejects_identity_check_with_orb() { + let preset = Preset::identity_check( + vec![IdentityAttribute::Nationality("JPN".to_string())], + true, + ); + + assert!(validate_v1_preset_support(&preset) + .expect_err("identity check with orb should be rejected for v1") + .contains("IdentityCheck presets are not supported")); + } + + #[test] + fn native_payload_v1_from_preset_allows_legacy_presets() { + let config = sample_request_config(); + let preset = Preset::device_legacy(Some("device-signal".to_string())); + + validate_v1_preset_support(&preset).expect("legacy preset should be allowed for v1"); + config + .to_params_from_preset(preset) + .expect("legacy preset should produce a v1 payload"); + } } diff --git a/swift/Examples/BasicVerification.swift b/swift/Examples/BasicVerification.swift index 478abfd6..22d774b7 100644 --- a/swift/Examples/BasicVerification.swift +++ b/swift/Examples/BasicVerification.swift @@ -27,6 +27,7 @@ func basicVerification() async throws { actionDescription: "Example verification", bridgeUrl: nil, allowLegacyProofs: false, + requireUserPresence: false, overrideConnectBaseUrl: nil, returnTo: nil, environment: .staging, diff --git a/swift/Examples/IDKitSampleApp/IDKitSampleApp/ContentView.swift b/swift/Examples/IDKitSampleApp/IDKitSampleApp/ContentView.swift index 34400382..8b11e00e 100644 --- a/swift/Examples/IDKitSampleApp/IDKitSampleApp/ContentView.swift +++ b/swift/Examples/IDKitSampleApp/IDKitSampleApp/ContentView.swift @@ -216,6 +216,7 @@ final class SampleModel: ObservableObject { actionDescription: "Local iOS sample", bridgeUrl: nil, allowLegacyProofs: false, + requireUserPresence: false, overrideConnectBaseUrl: nil, returnTo: returnToURL, environment: { diff --git a/swift/README.md b/swift/README.md index 70171361..b2d2dc9a 100644 --- a/swift/README.md +++ b/swift/README.md @@ -38,6 +38,7 @@ let config = IDKitRequestConfig( actionDescription: "Log in", bridgeUrl: nil, allowLegacyProofs: false, + requireUserPresence: false, overrideConnectBaseUrl: nil, returnTo: nil, environment: .staging diff --git a/swift/Sources/IDKit/IDKit.swift b/swift/Sources/IDKit/IDKit.swift index 7313cc59..c0bbcb1a 100644 --- a/swift/Sources/IDKit/IDKit.swift +++ b/swift/Sources/IDKit/IDKit.swift @@ -1,27 +1,127 @@ import Foundation -public typealias IDKitRequestConfig = IdKitRequestConfig -public typealias IDKitSessionConfig = IdKitSessionConfig public typealias IDKitResult = IdKitResult +/// Configuration for uniqueness proof requests. +public struct IDKitRequestConfig { + public let appId: String + public let action: String + public let rpContext: RpContext + public let actionDescription: String? + public let bridgeUrl: String? + public let allowLegacyProofs: Bool + public let requireUserPresence: Bool + public let overrideConnectBaseUrl: String? + public let returnTo: String? + public let environment: Environment? + public let connectUrlMode: ConnectUrlMode? + + public init( + appId: String, + action: String, + rpContext: RpContext, + actionDescription: String? = nil, + bridgeUrl: String? = nil, + allowLegacyProofs: Bool = false, + requireUserPresence: Bool = false, + overrideConnectBaseUrl: String? = nil, + returnTo: String? = nil, + environment: Environment? = nil, + connectUrlMode: ConnectUrlMode? = nil + ) { + self.appId = appId + self.action = action + self.rpContext = rpContext + self.actionDescription = actionDescription + self.bridgeUrl = bridgeUrl + self.allowLegacyProofs = allowLegacyProofs + self.requireUserPresence = requireUserPresence + self.overrideConnectBaseUrl = overrideConnectBaseUrl + self.returnTo = returnTo + self.environment = environment + self.connectUrlMode = connectUrlMode + } + + fileprivate var native: IdKitRequestConfig { + IdKitRequestConfig( + appId: appId, + action: action, + rpContext: rpContext, + actionDescription: actionDescription, + bridgeUrl: bridgeUrl, + allowLegacyProofs: allowLegacyProofs, + requireUserPresence: requireUserPresence, + overrideConnectBaseUrl: overrideConnectBaseUrl, + returnTo: returnTo, + environment: environment, + connectUrlMode: connectUrlMode + ) + } +} + +/// Configuration for session requests. +public struct IDKitSessionConfig { + public let appId: String + public let rpContext: RpContext + public let actionDescription: String? + public let bridgeUrl: String? + public let requireUserPresence: Bool + public let overrideConnectBaseUrl: String? + public let returnTo: String? + public let environment: Environment? + + public init( + appId: String, + rpContext: RpContext, + actionDescription: String? = nil, + bridgeUrl: String? = nil, + requireUserPresence: Bool = false, + overrideConnectBaseUrl: String? = nil, + returnTo: String? = nil, + environment: Environment? = nil + ) { + self.appId = appId + self.rpContext = rpContext + self.actionDescription = actionDescription + self.bridgeUrl = bridgeUrl + self.requireUserPresence = requireUserPresence + self.overrideConnectBaseUrl = overrideConnectBaseUrl + self.returnTo = returnTo + self.environment = environment + } + + fileprivate var native: IdKitSessionConfig { + IdKitSessionConfig( + appId: appId, + rpContext: rpContext, + actionDescription: actionDescription, + bridgeUrl: bridgeUrl, + requireUserPresence: requireUserPresence, + overrideConnectBaseUrl: overrideConnectBaseUrl, + returnTo: returnTo, + environment: environment + ) + } +} + /// Main entry point for IDKit Swift SDK. public enum IDKit { public static let version = "4.0.9" /// Creates a builder for uniqueness proof requests. public static func request(config: IDKitRequestConfig) -> IDKitBuilder { - IDKitBuilder(inner: IdKitBuilder.fromRequest(config: config)) + IDKitBuilder(inner: IdKitBuilder.fromRequest(config: config.native)) } // TODO: Re-enable when World ID 4.0 is live // /// Creates a builder for creating a new session. // public static func createSession(config: IDKitSessionConfig) -> IDKitBuilder { - // IDKitBuilder(inner: IdKitBuilder.fromCreateSession(config: config)) + // IDKitBuilder(inner: IdKitBuilder.fromCreateSession(config: config.native)) // } // /// Creates a builder for proving an existing session. // public static func proveSession(sessionId: String, config: IDKitSessionConfig) -> IDKitBuilder { - // IDKitBuilder(inner: IdKitBuilder.fromProveSession(sessionId: sessionId, config: config)) + // IDKitBuilder(inner: IdKitBuilder.fromProveSession(sessionId: sessionId, config: config.native)) // } /// Hashes a string signal to the canonical 0x-prefixed field element string. @@ -124,6 +224,7 @@ public enum IDKitErrorCode: String, Equatable { case timestampTooFarInFuture = "timestamp_too_far_in_future" case invalidTimestamp = "invalid_timestamp" case rpSignatureExpired = "rp_signature_expired" + case userPresenceFailed = "user_presence_failed" case identityAttributesNotMatched = "identity_attributes_not_matched" case genericError = "generic_error" case timeout = "timeout" @@ -175,6 +276,8 @@ public enum IDKitErrorCode: String, Equatable { .invalidTimestamp case .rpSignatureExpired: .rpSignatureExpired + case .userPresenceFailed: + .userPresenceFailed case .identityAttributesNotMatched: .identityAttributesNotMatched case .genericError: diff --git a/swift/Tests/IDKitTests/IDKitTests.swift b/swift/Tests/IDKitTests/IDKitTests.swift index 720c39aa..f94c54ba 100644 --- a/swift/Tests/IDKitTests/IDKitTests.swift +++ b/swift/Tests/IDKitTests/IDKitTests.swift @@ -17,7 +17,7 @@ private actor StatusPoller { } } -private func sampleResult(sessionId: String? = nil) -> IDKitResult { +private func sampleResult(sessionId: String? = nil, userPresenceCompleted: Bool = false) -> IDKitResult { IDKitResult( protocolVersion: "4.0", nonce: "0x1234", @@ -25,6 +25,7 @@ private func sampleResult(sessionId: String? = nil) -> IDKitResult { actionDescription: "Sample action", sessionId: sessionId, responses: [], + userPresenceCompleted: userPresenceCompleted, environment: "production", identityAttested: nil ) @@ -50,6 +51,7 @@ func idkitEntrypoints() throws { actionDescription: nil, bridgeUrl: nil, allowLegacyProofs: false, + requireUserPresence: false, overrideConnectBaseUrl: nil, returnTo: nil, environment: nil, @@ -62,6 +64,7 @@ func idkitEntrypoints() throws { // rpContext: try sampleRpContext(), // actionDescription: nil, // bridgeUrl: nil, + // requireUserPresence: false, // overrideConnectBaseUrl: nil, // returnTo: nil, // environment: nil @@ -92,6 +95,7 @@ func statusMapping() { #expect(IDKitRequest.mapStatus(.failed(error: .timestampTooFarInFuture)) == .failed(.timestampTooFarInFuture)) #expect(IDKitRequest.mapStatus(.failed(error: .invalidTimestamp)) == .failed(.invalidTimestamp)) #expect(IDKitRequest.mapStatus(.failed(error: .rpSignatureExpired)) == .failed(.rpSignatureExpired)) + #expect(IDKitRequest.mapStatus(.failed(error: .userPresenceFailed)) == .failed(.userPresenceFailed)) #expect(IDKitRequest.mapStatus(.networkingError(error: .connectionFailed)) == .networkingError(.connectionFailed)) }