From d5c28b9a7b594a3e199628a703752a2bdbd26833 Mon Sep 17 00:00:00 2001 From: Berend Sliedrecht Date: Thu, 12 Feb 2026 14:39:04 +0100 Subject: [PATCH 1/2] feat(nodejs): koffi wrapper Signed-off-by: Berend Sliedrecht --- package.json | 11 +- packages/anoncreds-nodejs/package.json | 12 +- .../anoncreds-nodejs/src/NodeJSAnoncreds.ts | 401 +++--- packages/anoncreds-nodejs/src/ffi/alloc.ts | 36 +- .../anoncreds-nodejs/src/ffi/conversion.ts | 36 +- .../anoncreds-nodejs/src/ffi/primitives.ts | 34 +- .../anoncreds-nodejs/src/ffi/serialize.ts | 59 +- .../anoncreds-nodejs/src/ffi/structures.ts | 111 +- .../src/library/NativeBindingInterface.ts | 35 +- .../anoncreds-nodejs/src/library/bindings.ts | 389 +++--- .../anoncreds-nodejs/src/library/register.ts | 42 +- packages/anoncreds-nodejs/tests/api.test.ts | 93 +- .../anoncreds-nodejs/tests/bindings.test.ts | 354 ++--- packages/anoncreds-nodejs/tests/setup.ts | 2 + packages/anoncreds-shared/src/Anoncreds.ts | 3 +- packages/anoncreds-shared/src/api/Nonce.ts | 7 + packages/anoncreds-shared/src/api/index.ts | 1 + pnpm-lock.yaml | 1158 ++++++++++++++--- pnpm-workspace.yaml | 23 +- vitest.config.ts | 11 + 20 files changed, 1837 insertions(+), 981 deletions(-) create mode 100644 packages/anoncreds-nodejs/tests/setup.ts create mode 100644 packages/anoncreds-shared/src/api/Nonce.ts create mode 100644 vitest.config.ts diff --git a/package.json b/package.json index f0088c97..bbda3ac2 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "https://github.com/anoncreds/anoncreds-wrapper-javascript" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "scripts": { "style:check": "biome check --unsafe .", @@ -15,7 +15,7 @@ "types:check": "pnpm -r check-types", "build": "pnpm -r build", "clean": "pnpm -r clean", - "test": "node --import tsx --test packages/**/tests/*.test.ts", + "test": "vitest", "release": "pnpm build && pnpm changeset publish --no-git-tag", "changeset-version": "pnpm changeset version && pnpm style:fix" }, @@ -24,8 +24,9 @@ "@changesets/cli": "catalog:", "@types/node": "catalog:", "rimraf": "catalog:", - "tsx": "catalog:", - "typescript": "catalog:" + "typescript": "catalog:", + "vite-tsconfig-paths": "catalog:", + "vitest": "catalog:" }, - "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247" + "packageManager": "pnpm@10.29.2" } diff --git a/packages/anoncreds-nodejs/package.json b/packages/anoncreds-nodejs/package.json index c4a279eb..4fdb9996 100644 --- a/packages/anoncreds-nodejs/package.json +++ b/packages/anoncreds-nodejs/package.json @@ -24,17 +24,13 @@ "install": "node scripts/install.js" }, "dependencies": { - "@2060.io/ffi-napi": "^4.0.9", - "@2060.io/ref-napi": "^3.0.6", "@hyperledger/anoncreds-shared": "workspace:*", - "ref-array-di": "1.2.2", - "ref-struct-di": "1.1.1" + "koffi": "catalog:" }, "devDependencies": { "@types/node": "catalog:", - "@types/ref-array-di": "^1.2.3", - "@types/ref-struct-di": "^1.1.6", - "typescript": "catalog:" + "typescript": "catalog:", + "vitest": "catalog:" }, "binary": { "version": "v0.2.3", @@ -42,6 +38,6 @@ "packageName": "library-{platform}-{arch}.tar.gz" }, "engines": { - "node": ">= 18" + "node": ">= 20" } } diff --git a/packages/anoncreds-nodejs/src/NodeJSAnoncreds.ts b/packages/anoncreds-nodejs/src/NodeJSAnoncreds.ts index 5a48a71e..0d4419e5 100644 --- a/packages/anoncreds-nodejs/src/NodeJSAnoncreds.ts +++ b/packages/anoncreds-nodejs/src/NodeJSAnoncreds.ts @@ -1,3 +1,4 @@ +import { TextDecoder, TextEncoder } from 'node:util' import type { Anoncreds, AnoncredsErrorObject, @@ -6,62 +7,74 @@ import type { NativeCredentialRevocationConfig, NativeNonRevokedIntervalOverride, } from '@hyperledger/anoncreds-shared' -import type { TypedArray } from 'ref-array-di' -import type { StructObject } from 'ref-struct-di' - -import { TextDecoder, TextEncoder } from 'util' -import { AnoncredsError, ByteBuffer, ObjectHandle } from '@hyperledger/anoncreds-shared' - +import { AnoncredsError, ObjectHandle } from '@hyperledger/anoncreds-shared' import { - CredRevInfoStruct, - CredentialEntryListStruct, - CredentialEntryStruct, - CredentialProveListStruct, - CredentialProveStruct, - NonRevokedIntervalOverrideListStruct, - NonRevokedIntervalOverrideStruct, - ObjectHandleArray, - ObjectHandleListStruct, - StringListStruct, + type ByteBufferStructType, allocateByteBuffer, allocateInt8Buffer, allocatePointer, allocateStringBuffer, - byteBufferToBuffer, + byteBufferToUint8Array, serializeArguments, } from './ffi' -import { getNativeAnoncreds } from './library' +import { getNativeAnonCreds } from './library' -function handleReturnPointer(returnValue: Buffer, cleanupCallback?: (buffer: Buffer) => void): Return { - if (returnValue.address() === 0) { +function handleReturnPointer(returnValue: [unknown] | unknown): Return { + const value = Array.isArray(returnValue) ? returnValue[0] : returnValue + if (value === null || value === undefined) { throw AnoncredsError.customError({ message: 'Unexpected null pointer' }) } - const ret = returnValue.deref() as Return - if (cleanupCallback) cleanupCallback(returnValue) - - return ret + return value as Return } export class NodeJSAnoncreds implements Anoncreds { - private handleError() { - const nativeError = allocateStringBuffer() - getNativeAnoncreds().anoncreds_get_current_error(nativeError) - const anoncredsErrorObject = JSON.parse(nativeError.deref() as string) as AnoncredsErrorObject + public get nativeAnoncreds() { + return getNativeAnonCreds() + } + + /** + * Fetch the error from the native library and throw it as a JS error + * + * NOTE: + * Checks whether the error code of the returned error matches the error code that was passed to the function. + * If it doesn't, we throw an error with the original errorCode, and a custom message explaining we weren't able + * to retrieve the error message from the native library. This should however not break functionality as long as + * error codes are used rather than error messages for error handling. + * + */ + private getAnoncredsError(errorCode: number): AnoncredsError { + const error = this.getCurrentError() + if (error.code !== errorCode) { + return new AnoncredsError({ + code: errorCode, + message: + 'Error details have already been overwritten on the native side, unable to retrieve error message for the error', + }) + } + + return new AnoncredsError(error) + } - if (anoncredsErrorObject.code === 0) return + public getCurrentError(): AnoncredsErrorObject { + const error = allocateStringBuffer() + this.nativeAnoncreds.anoncreds_get_current_error(error) + const serializedError = handleReturnPointer(error) - throw new AnoncredsError(anoncredsErrorObject) + return JSON.parse(serializedError) as AnoncredsErrorObject } - public get nativeAnoncreds() { - return getNativeAnoncreds() + private handleError(errorCode: number) { + if (errorCode === 0) return + + throw this.getAnoncredsError(errorCode) } public generateNonce(): string { const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_generate_nonce(ret) - this.handleError() + + const errorCode = this.nativeAnoncreds.anoncreds_generate_nonce(ret) + this.handleError(errorCode) return handleReturnPointer(ret) } @@ -76,8 +89,8 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_create_schema(name, version, issuerId, attributeNames, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_create_schema(name, version, issuerId, attributeNames, ret) + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -86,8 +99,12 @@ export class NodeJSAnoncreds implements Anoncreds { const { objectHandle, name } = serializeArguments(options) const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_revocation_registry_definition_get_attribute(objectHandle, name, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_revocation_registry_definition_get_attribute( + objectHandle, + name, + ret + ) + this.handleError(errorCode) return handleReturnPointer(ret) } @@ -96,8 +113,8 @@ export class NodeJSAnoncreds implements Anoncreds { const { objectHandle, name } = serializeArguments(options) const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_credential_get_attribute(objectHandle, name, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_credential_get_attribute(objectHandle, name, ret) + this.handleError(errorCode) return handleReturnPointer(ret) } @@ -120,7 +137,7 @@ export class NodeJSAnoncreds implements Anoncreds { const credentialDefinitionPrivatePtr = allocatePointer() const keyCorrectnessProofPtr = allocatePointer() - this.nativeAnoncreds.anoncreds_create_credential_definition( + const errorCode = this.nativeAnoncreds.anoncreds_create_credential_definition( schemaId, schema, tag, @@ -131,7 +148,7 @@ export class NodeJSAnoncreds implements Anoncreds { credentialDefinitionPrivatePtr, keyCorrectnessProofPtr ) - this.handleError() + this.handleError(errorCode) return { credentialDefinition: new ObjectHandle(handleReturnPointer(credentialDefinitionPtr)), @@ -152,24 +169,48 @@ export class NodeJSAnoncreds implements Anoncreds { const { credentialDefinition, credentialDefinitionPrivate, credentialOffer, credentialRequest } = serializeArguments(options) - const attributeNames = this.convertAttributeNames(options.attributeRawValues) - const attributeRawValues = this.convertAttributeRawValues(options.attributeRawValues) - const attributeEncodedValues = this.convertAttributeEncodedValues(options.attributeEncodedValues) - const revocationConfiguration = this.convertRevocationConfiguration(options.revocationConfiguration) + const attributeNames = { + count: Object.keys(options.attributeRawValues).length, + data: Object.keys(options.attributeRawValues), + } + + const attributeRawValues = { + count: Object.keys(options.attributeRawValues).length, + data: Object.values(options.attributeRawValues), + } + + const attributeEncodedValues = options.attributeEncodedValues + ? { + count: Object.keys(options.attributeEncodedValues).length, + data: Object.values(options.attributeEncodedValues), + } + : {} + + let revocationConfiguration = null + if (options.revocationConfiguration) { + const { revocationStatusList, revocationRegistryDefinitionPrivate, revocationRegistryDefinition, registryIndex } = + serializeArguments(options.revocationConfiguration) + revocationConfiguration = { + reg_def: revocationRegistryDefinition, + reg_def_private: revocationRegistryDefinitionPrivate, + status_list: revocationStatusList, + reg_idx: registryIndex, + } + } const credentialPtr = allocatePointer() - this.nativeAnoncreds.anoncreds_create_credential( + const errorCode = this.nativeAnoncreds.anoncreds_create_credential( credentialDefinition, credentialDefinitionPrivate, credentialOffer, credentialRequest, attributeNames, attributeRawValues, - attributeEncodedValues as unknown as Buffer, - revocationConfiguration?.ref().address() ?? 0, + attributeEncodedValues, + revocationConfiguration, credentialPtr ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(credentialPtr)) } @@ -179,8 +220,8 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_encode_credential_attributes(attributeRawValues, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_encode_credential_attributes(attributeRawValues, ret) + this.handleError(errorCode) const result = handleReturnPointer(ret) @@ -198,7 +239,7 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_process_credential( + const errorCode = this.nativeAnoncreds.anoncreds_process_credential( credential, credentialRequestMetadata, linkSecret, @@ -206,7 +247,7 @@ export class NodeJSAnoncreds implements Anoncreds { options.revocationRegistryDefinition?.handle ?? 0, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -219,8 +260,13 @@ export class NodeJSAnoncreds implements Anoncreds { const { schemaId, credentialDefinitionId, keyCorrectnessProof } = serializeArguments(options) const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_create_credential_offer(schemaId, credentialDefinitionId, keyCorrectnessProof, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_create_credential_offer( + schemaId, + credentialDefinitionId, + keyCorrectnessProof, + ret + ) + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -239,7 +285,7 @@ export class NodeJSAnoncreds implements Anoncreds { const credentialRequestPtr = allocatePointer() const credentialRequestMetadataPtr = allocatePointer() - this.nativeAnoncreds.anoncreds_create_credential_request( + const errorCode = this.nativeAnoncreds.anoncreds_create_credential_request( entropy, proverDid, credentialDefinition, @@ -249,7 +295,7 @@ export class NodeJSAnoncreds implements Anoncreds { credentialRequestPtr, credentialRequestMetadataPtr ) - this.handleError() + this.handleError(errorCode) return { credentialRequest: new ObjectHandle(handleReturnPointer(credentialRequestPtr)), @@ -260,8 +306,8 @@ export class NodeJSAnoncreds implements Anoncreds { public createLinkSecret(): string { const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_create_link_secret(ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_create_link_secret(ret) + this.handleError(errorCode) return handleReturnPointer(ret) } @@ -277,15 +323,15 @@ export class NodeJSAnoncreds implements Anoncreds { }): ObjectHandle { const { presentationRequest, linkSecret } = serializeArguments(options) - const selfAttestNames = StringListStruct({ + const selfAttestNames = { count: Object.keys(options.selfAttest).length, - data: Object.keys(options.selfAttest) as unknown as TypedArray, - }) + data: Object.keys(options.selfAttest), + } - const selfAttestValues = StringListStruct({ + const selfAttestValues = { count: Object.values(options.selfAttest).length, - data: Object.values(options.selfAttest) as unknown as TypedArray, - }) + data: Object.values(options.selfAttest), + } const credentialEntryList = this.convertCredentialList(options.credentials) const credentialProveList = this.convertCredentialProves(options.credentialsProve) @@ -294,7 +340,7 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_create_presentation( + const errorCode = this.nativeAnoncreds.anoncreds_create_presentation( presentationRequest, credentialEntryList, credentialProveList, @@ -307,7 +353,7 @@ export class NodeJSAnoncreds implements Anoncreds { credentialDefinitionIds, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -340,20 +386,20 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocateInt8Buffer() - this.nativeAnoncreds.anoncreds_verify_presentation( + const errorCode = this.nativeAnoncreds.anoncreds_verify_presentation( presentation, presentationRequest, schemas, schemaIds, credentialDefinitions, credentialDefinitionIds, - revocationRegistryDefinitions, - revocationRegistryDefinitionIds, - revocationStatusLists, + revocationRegistryDefinitions ?? {}, + revocationRegistryDefinitionIds ?? {}, + revocationStatusLists ?? {}, nonRevokedIntervalOverrideList, ret ) - this.handleError() + this.handleError(errorCode) return Boolean(handleReturnPointer(ret)) } @@ -379,7 +425,7 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_create_revocation_status_list( + const errorCode = this.nativeAnoncreds.anoncreds_create_revocation_status_list( credentialDefinition, revocationRegistryDefinitionId, revocationRegistryDefinition, @@ -389,7 +435,7 @@ export class NodeJSAnoncreds implements Anoncreds { timestamp ?? -1, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -401,12 +447,12 @@ export class NodeJSAnoncreds implements Anoncreds { const { currentRevocationStatusList, timestamp } = serializeArguments(options) const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_update_revocation_status_list_timestamp_only( + const errorCode = this.nativeAnoncreds.anoncreds_update_revocation_status_list_timestamp_only( timestamp, currentRevocationStatusList, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -431,17 +477,17 @@ export class NodeJSAnoncreds implements Anoncreds { } = serializeArguments(options) const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_update_revocation_status_list( + const errorCode = this.nativeAnoncreds.anoncreds_update_revocation_status_list( credentialDefinition, revocationRegistryDefinition, revocationRegistryDefinitionPrivate, currentRevocationStatusList, - issued, - revoked, + issued ?? {}, + revoked ?? {}, timestamp ?? -1, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -468,7 +514,7 @@ export class NodeJSAnoncreds implements Anoncreds { const revocationRegistryDefinitionPtr = allocatePointer() const revocationRegistryDefinitionPrivate = allocatePointer() - this.nativeAnoncreds.anoncreds_create_revocation_registry_def( + const errorCode = this.nativeAnoncreds.anoncreds_create_revocation_registry_def( credentialDefinition, credentialDefinitionId, issuerId, @@ -479,7 +525,7 @@ export class NodeJSAnoncreds implements Anoncreds { revocationRegistryDefinitionPtr, revocationRegistryDefinitionPrivate ) - this.handleError() + this.handleError(errorCode) return { revocationRegistryDefinition: new ObjectHandle(handleReturnPointer(revocationRegistryDefinitionPtr)), @@ -504,7 +550,7 @@ export class NodeJSAnoncreds implements Anoncreds { const oldRevocationStatusList = options.oldRevocationStatusList ?? new ObjectHandle(0) const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_create_or_update_revocation_state( + const errorCode = this.nativeAnoncreds.anoncreds_create_or_update_revocation_state( revocationRegistryDefinition, revocationStatusList, revocationRegistryIndex, @@ -513,7 +559,7 @@ export class NodeJSAnoncreds implements Anoncreds { oldRevocationStatusList.handle, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -535,18 +581,18 @@ export class NodeJSAnoncreds implements Anoncreds { const revocationConfiguration = this.convertRevocationConfiguration(options.revocationConfiguration) const credentialPtr = allocatePointer() - this.nativeAnoncreds.anoncreds_create_w3c_credential( + const errorCode = this.nativeAnoncreds.anoncreds_create_w3c_credential( credentialDefinition, credentialDefinitionPrivate, credentialOffer, credentialRequest, attributeNames, attributeRawValues, - revocationConfiguration?.ref().address() ?? 0, + revocationConfiguration ?? 0, w3cVersion, credentialPtr ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(credentialPtr)) } @@ -562,7 +608,7 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_process_w3c_credential( + const errorCode = this.nativeAnoncreds.anoncreds_process_w3c_credential( credential, credentialRequestMetadata, linkSecret, @@ -570,7 +616,7 @@ export class NodeJSAnoncreds implements Anoncreds { options.revocationRegistryDefinition?.handle ?? 0, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -593,7 +639,7 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_create_w3c_presentation( + const errorCode = this.nativeAnoncreds.anoncreds_create_w3c_presentation( presentationRequest, credentialEntryList, credentialProveList, @@ -605,7 +651,7 @@ export class NodeJSAnoncreds implements Anoncreds { w3cVersion, ret ) - this.handleError() + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -638,20 +684,20 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocateInt8Buffer() - this.nativeAnoncreds.anoncreds_verify_w3c_presentation( + const errorCode = this.nativeAnoncreds.anoncreds_verify_w3c_presentation( presentation, presentationRequest, schemas, schemaIds, credentialDefinitions, credentialDefinitionIds, - revocationRegistryDefinitions, - revocationRegistryDefinitionIds, - revocationStatusLists, + revocationRegistryDefinitions ?? {}, + revocationRegistryDefinitionIds ?? {}, + revocationStatusLists ?? {}, nonRevokedIntervalOverrideList, ret ) - this.handleError() + this.handleError(errorCode) return Boolean(handleReturnPointer(ret)) } @@ -661,8 +707,8 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_credential_to_w3c(objectHandle, issuerId, w3cVersion, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_credential_to_w3c(objectHandle, issuerId, w3cVersion, ret) + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -672,8 +718,8 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_credential_from_w3c(objectHandle, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_credential_from_w3c(objectHandle, ret) + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -682,8 +728,8 @@ export class NodeJSAnoncreds implements Anoncreds { const { objectHandle } = serializeArguments(options) const ret = allocatePointer() - this.nativeAnoncreds.anoncreds_w3c_credential_get_integrity_proof_details(objectHandle, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_w3c_credential_get_integrity_proof_details(objectHandle, ret) + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -692,8 +738,8 @@ export class NodeJSAnoncreds implements Anoncreds { const { objectHandle, name } = serializeArguments(options) const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_w3c_credential_proof_get_attribute(objectHandle, name, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_w3c_credential_proof_get_attribute(objectHandle, name, ret) + this.handleError(errorCode) return handleReturnPointer(ret) } @@ -711,26 +757,17 @@ export class NodeJSAnoncreds implements Anoncreds { } public setDefaultLogger(): void { - this.nativeAnoncreds.anoncreds_set_default_logger() - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_set_default_logger() + this.handleError(errorCode) } - // This should be called when a function returns a non-zero code - public getCurrentError(): string { - const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_get_current_error(ret) - this.handleError() - - return handleReturnPointer(ret) - } - - private objectFromJson(method: (byteBuffer: Buffer, ret: Buffer) => unknown, options: { json: string }) { + private objectFromJson(cb: (byteBuffer: ByteBufferStructType, ret: [unknown]) => number, options: { json: string }) { const ret = allocatePointer() - const byteBuffer = ByteBuffer.fromUint8Array(new TextEncoder().encode(options.json)) - this.handleError() + const byteBuffer = new TextEncoder().encode(options.json) - method(byteBuffer as unknown as Buffer, ret) + const errorCode = cb({ data: byteBuffer, len: byteBuffer.length }, ret) + this.handleError(errorCode) return new ObjectHandle(handleReturnPointer(ret)) } @@ -796,18 +833,19 @@ export class NodeJSAnoncreds implements Anoncreds { } public getJson(options: { objectHandle: ObjectHandle }) { + const { objectHandle } = serializeArguments(options) + const ret = allocateByteBuffer() - const { objectHandle } = serializeArguments(options) - this.nativeAnoncreds.anoncreds_object_get_json(objectHandle, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_object_get_json(objectHandle, ret) + this.handleError(errorCode) - const returnValue = handleReturnPointer<{ data: Buffer; len: number }>(ret) - const jsonAsArray = new Uint8Array(byteBufferToBuffer(returnValue)) + const returnValue = handleReturnPointer<{ data: Uint8Array; len: number }>(ret) + const jsonAsArray = byteBufferToUint8Array(returnValue) const output = new TextDecoder().decode(jsonAsArray) - this.nativeAnoncreds.anoncreds_buffer_free(returnValue.data) + this.nativeAnoncreds.anoncreds_buffer_free(returnValue) return output } @@ -817,87 +855,72 @@ export class NodeJSAnoncreds implements Anoncreds { const ret = allocateStringBuffer() - this.nativeAnoncreds.anoncreds_object_get_type_name(objectHandle, ret) - this.handleError() + const errorCode = this.nativeAnoncreds.anoncreds_object_get_type_name(objectHandle, ret) + this.handleError(errorCode) return handleReturnPointer(ret) } public objectFree(options: { objectHandle: ObjectHandle }) { this.nativeAnoncreds.anoncreds_object_free(options.objectHandle.handle) - this.handleError() } private convertCredentialList(credentials: NativeCredentialEntry[]) { - const credentialEntries = credentials.map((value) => - CredentialEntryStruct({ - credential: value.credential.handle, - timestamp: value.timestamp ?? -1, - rev_state: value.revocationState?.handle ?? 0, - }) - ) + const credentialEntries = credentials.map((value) => ({ + credential: value.credential.handle, + timestamp: value.timestamp ?? -1, + rev_state: value.revocationState?.handle ?? 0, + })) - return CredentialEntryListStruct({ + return { count: credentialEntries.length, - data: credentialEntries as unknown as TypedArray< - StructObject<{ - credential: number - timestamp: number - rev_state: number - }> - >, - }) as unknown as Buffer + data: credentialEntries, + } } private convertCredentialProves(credentialsProve: NativeCredentialProve[]) { const credentialProves = credentialsProve.map((value) => { const { entryIndex: entry_idx, isPredicate: is_predicate, reveal, referent } = serializeArguments(value) - return CredentialProveStruct({ entry_idx, referent, is_predicate, reveal }) + return { entry_idx, referent, is_predicate, reveal } }) - return CredentialProveListStruct({ + return { count: credentialProves.length, - data: credentialProves as unknown as TypedArray< - StructObject<{ - entry_idx: string | number - referent: string - is_predicate: number - reveal: number - }> - >, - }) as unknown as Buffer + data: credentialProves, + } } private convertSchemas(schemas: Record) { const schemaKeys = Object.keys(schemas) - const schemaIds = StringListStruct({ + const schemaIds = { count: schemaKeys.length, - data: schemaKeys as unknown as TypedArray, - }) as unknown as Buffer + data: schemaKeys, + } const schemaValues = Object.values(schemas) - const schemasList = ObjectHandleListStruct({ - count: schemaValues.length, - data: ObjectHandleArray(schemaValues.map((o) => o.handle)), - }) as unknown as Buffer + return { schemaIds, - schemas: schemasList, + schemas: { + count: schemaValues.length, + data: schemaValues.map((o) => o.handle), + }, } } private convertCredDefs(credentialDefinitions: Record) { const credentialDefinitionKeys = Object.keys(credentialDefinitions) - const credentialDefinitionIds = StringListStruct({ + const credentialDefinitionIds = { count: credentialDefinitionKeys.length, - data: credentialDefinitionKeys as unknown as TypedArray, - }) as unknown as Buffer + data: credentialDefinitionKeys, + } const credentialDefinitionValues = Object.values(credentialDefinitions) - const credentialDefinitionsList = ObjectHandleListStruct({ + const credentialDefinitionsList = { count: credentialDefinitionValues.length, - data: ObjectHandleArray(credentialDefinitionValues.map((o) => o.handle)), - }) as unknown as Buffer + data: credentialDefinitionValues.map((o) => o.handle), + } + return { credentialDefinitionIds, credentialDefinitions: credentialDefinitionsList, @@ -908,45 +931,39 @@ export class NodeJSAnoncreds implements Anoncreds { const nativeNonRevokedIntervalOverrides = nonRevokedIntervalOverrides?.map((value) => { const { requestedFromTimestamp, revocationRegistryDefinitionId, overrideRevocationStatusListTimestamp } = serializeArguments(value) - return NonRevokedIntervalOverrideStruct({ + return { rev_reg_def_id: revocationRegistryDefinitionId, requested_from_ts: requestedFromTimestamp, override_rev_status_list_ts: overrideRevocationStatusListTimestamp, - }) + } }) - return NonRevokedIntervalOverrideListStruct({ + return { count: nonRevokedIntervalOverrides?.length ?? 0, - data: nativeNonRevokedIntervalOverrides as unknown as TypedArray< - StructObject<{ - rev_reg_def_id: string - requested_from_ts: number - override_rev_status_list_ts: number - }> - >, - }) as unknown as Buffer + data: nativeNonRevokedIntervalOverrides, + } } private convertAttributeNames(attributeRawValues: Record) { - return StringListStruct({ + return { count: Object.keys(attributeRawValues).length, - data: Object.keys(attributeRawValues) as unknown as TypedArray, - }) as unknown as Buffer + data: Object.keys(attributeRawValues), + } } private convertAttributeRawValues(attributeRawValues: Record) { - return StringListStruct({ + return { count: Object.keys(attributeRawValues).length, - data: Object.values(attributeRawValues) as unknown as TypedArray, - }) as unknown as Buffer + data: Object.values(attributeRawValues), + } } private convertAttributeEncodedValues(attributeEncodedValues?: Record) { return attributeEncodedValues - ? StringListStruct({ + ? { count: Object.keys(attributeEncodedValues).length, - data: Object.values(attributeEncodedValues) as unknown as TypedArray, - }) + data: Object.values(attributeEncodedValues), + } : undefined } @@ -955,12 +972,12 @@ export class NodeJSAnoncreds implements Anoncreds { const { revocationRegistryDefinition, revocationRegistryDefinitionPrivate, revocationStatusList, registryIndex } = serializeArguments(revocationConfiguration) - return CredRevInfoStruct({ + return { reg_def: revocationRegistryDefinition, reg_def_private: revocationRegistryDefinitionPrivate, status_list: revocationStatusList, reg_idx: registryIndex, - }) + } } } } diff --git a/packages/anoncreds-nodejs/src/ffi/alloc.ts b/packages/anoncreds-nodejs/src/ffi/alloc.ts index 04a7c7f6..6dbac79c 100644 --- a/packages/anoncreds-nodejs/src/ffi/alloc.ts +++ b/packages/anoncreds-nodejs/src/ffi/alloc.ts @@ -1,17 +1,35 @@ -import { alloc } from '@2060.io/ref-napi' +export const allocatePointer = () => { + return [undefined] as [unknown] +} -import { FFI_INT8, FFI_OBJECT_HANDLE, FFI_STRING } from '../ffi/primitives' +export const allocateStringBuffer = () => { + return [undefined] as [unknown] +} -import { ByteBufferStruct, CredRevInfoStruct } from './structures' +export const allocateInt32Buffer = () => { + return [0] as [number] +} -// TODO: more allocations here +export const allocateInt8Buffer = () => { + return [0] as [number] +} -export const allocateStringBuffer = (): Buffer => alloc(FFI_STRING) +export const allocateByteBuffer = () => { + return {} as unknown +} -export const allocatePointer = (): Buffer => alloc(FFI_OBJECT_HANDLE) +export const allocateSecretBuffer = () => { + return {} as unknown +} -export const allocateInt8Buffer = (): Buffer => alloc(FFI_INT8) +export const allocateEncryptedBuffer = () => { + return {} as unknown +} -export const allocateCredRevInfoStructPointer = (): Buffer => alloc(CredRevInfoStruct) +export const allocateAeadParams = () => { + return {} as unknown +} -export const allocateByteBuffer = (): Buffer => alloc(ByteBufferStruct) +export const allocateLocalKeyHandle = allocatePointer + +export const allocateStringListHandle = allocatePointer diff --git a/packages/anoncreds-nodejs/src/ffi/conversion.ts b/packages/anoncreds-nodejs/src/ffi/conversion.ts index 57bcc7d1..870f6133 100644 --- a/packages/anoncreds-nodejs/src/ffi/conversion.ts +++ b/packages/anoncreds-nodejs/src/ffi/conversion.ts @@ -1,5 +1,35 @@ -import { reinterpret } from '@2060.io/ref-napi' +import type { ObjectHandle } from '@hyperledger/anoncreds-shared' +import koffi from 'koffi' +import { FFI_UINT8 } from './primitives' -export const byteBufferToBuffer = (buffer: { data: Buffer; len: number }) => reinterpret(buffer.data, buffer.len) +export const stringListToStringListStruct = (stringList: Array) => { + return { + count: stringList.length, + data: stringList, + } +} -export const secretBufferToBuffer = byteBufferToBuffer +export const byteBufferToUint8Array = (byteBuffer: { data: Uint8Array; len: number }): Uint8Array => { + const { data, len } = byteBuffer + + if (data instanceof Uint8Array) { + return data.slice(0, len) + } + + const decoded: Uint8Array = koffi.decode(data, FFI_UINT8, len) + return decoded +} + +export const objectHandleListToObjectHandleListStruct = (objectHandleList: Array) => { + return { + count: objectHandleList.length, + data: objectHandleList.map((h) => h.handle), + } +} + +export const i32ListToI32ListStruct = (i32List: Array) => { + return { + count: i32List.length, + data: i32List, + } +} diff --git a/packages/anoncreds-nodejs/src/ffi/primitives.ts b/packages/anoncreds-nodejs/src/ffi/primitives.ts index 5f6fea62..651f7a10 100644 --- a/packages/anoncreds-nodejs/src/ffi/primitives.ts +++ b/packages/anoncreds-nodejs/src/ffi/primitives.ts @@ -1,21 +1,13 @@ -import { refType, types } from '@2060.io/ref-napi' - -// Primitives - -export const FFI_ISIZE = 'size_t' -export const FFI_INT8 = 'int8' -export const FFI_INT32 = 'int32' -export const FFI_INT64 = 'int64' -export const FFI_UINT = 'uint' -export const FFI_UINT8 = 'uint8' -export const FFI_ERRORCODE = FFI_UINT -export const FFI_OBJECT_HANDLE = FFI_ISIZE -export const FFI_VOID = types.void -export const FFI_STRING = 'string' - -// Pointers - -export const FFI_ISIZE_PTR = refType(FFI_ISIZE) -export const FFI_INT8_PTR = refType(FFI_INT8) -export const FFI_OBJECT_HANDLE_PTR = refType(FFI_OBJECT_HANDLE) -export const FFI_STRING_PTR = refType(FFI_STRING) +import * as koffi from 'koffi' + +export const FFI_UINT8 = koffi.types.uint8_t +export const FFI_UINT64 = koffi.types.uint64_t +export const FFI_USIZE = koffi.types.size_t +export const FFI_INT8 = koffi.types.int8_t +export const FFI_INT32 = koffi.types.int32_t +export const FFI_INT64 = koffi.types.int64_t +export const FFI_STRING = koffi.types.string +export const FFI_VOID = koffi.types.void +export const FFI_OBJECT_HANDLE = FFI_USIZE + +export const FFI_ERROR_CODE = FFI_INT64 diff --git a/packages/anoncreds-nodejs/src/ffi/serialize.ts b/packages/anoncreds-nodejs/src/ffi/serialize.ts index 2e7b0c34..64c8b307 100644 --- a/packages/anoncreds-nodejs/src/ffi/serialize.ts +++ b/packages/anoncreds-nodejs/src/ffi/serialize.ts @@ -1,22 +1,15 @@ -import type { Pointer } from '@2060.io/ref-napi' -import type { TypedArray } from 'ref-array-di' -import type { StructObject } from 'ref-struct-di' -import type { ByteBufferStruct } from './structures' - -import { NULL } from '@2060.io/ref-napi' import { ObjectHandle } from '@hyperledger/anoncreds-shared' -import { I32ListStruct, Int32List, ObjectHandleListStruct, StringListStruct } from './structures' +import { + i32ListToI32ListStruct, + objectHandleListToObjectHandleListStruct, + stringListToStringListStruct, +} from './conversion' +import { ByteBufferStruct, I32ListStruct, StringListStruct } from './structures' type Argument = Record | unknown[] | Date | Uint8Array | SerializedArgument | boolean | ObjectHandle -type SerializedArgument = - | string - | number - | ArrayBuffer - | Buffer - | StructObject<{ count: number | string; data: TypedArray }> - | StructObject<{ count: number | string; data: Pointer> }> +type SerializedArgument = string | number | Uint8Array | Record | null type SerializedArguments = Record @@ -32,13 +25,13 @@ export type SerializedOptions = Required<{ : Type[Property] extends Record ? string : Type[Property] extends string[] - ? Buffer + ? string[] : Type[Property] extends string[] | undefined - ? Buffer + ? string[] : Type[Property] extends number[] - ? Buffer + ? number[] : Type[Property] extends number[] | undefined - ? Buffer + ? number[] : Type[Property] extends Date ? number : Type[Property] extends Date | undefined @@ -47,14 +40,14 @@ export type SerializedOptions = Required<{ ? string : Type[Property] extends number | undefined ? number - : Type[Property] extends Buffer - ? Buffer + : Type[Property] extends Uint8Array + ? Uint8Array : Type[Property] extends ObjectHandle ? number : Type[Property] extends ObjectHandle[] - ? Buffer + ? number[] : Type[Property] extends ObjectHandle[] | undefined - ? Buffer + ? number[] : Type[Property] extends ObjectHandle | undefined ? number : Type[Property] extends Uint8Array @@ -68,13 +61,10 @@ export type SerializedOptions = Required<{ : unknown }> -// TODO: this method needs to be reworked. -// It is very messy -// cannot handle complex data structures well const serialize = (arg: Argument): SerializedArgument => { switch (typeof arg) { case 'undefined': - return NULL + return null case 'boolean': return Number(arg) case 'string': @@ -89,29 +79,22 @@ const serialize = (arg: Argument): SerializedArgument => { } if (Array.isArray(arg)) { if (arg.every((it) => typeof it === 'string')) { - return StringListStruct({ count: arg.length, data: arg as unknown as TypedArray }) + return stringListToStringListStruct(arg) } if (arg.every((it) => it instanceof ObjectHandle)) { - return ObjectHandleListStruct({ - count: arg.length, - data: (arg as ObjectHandle[]).map((i: ObjectHandle) => i.handle) as unknown as TypedArray, - }) + return objectHandleListToObjectHandleListStruct(arg) } if (arg.every((it) => typeof it === 'number')) { - return I32ListStruct({ - count: arg.length, - data: Int32List(arg as number[]) as unknown as TypedArray, - }) + return i32ListToI32ListStruct(arg) } } - // TODO: add more serialization here for classes and uint8arrays return JSON.stringify(arg) default: throw new Error('could not serialize value') } } -const serializeArguments = = Record>( +export const serializeArguments = = Record>( args: T ): SerializedOptions => { const retVal: SerializedArguments = {} @@ -120,5 +103,3 @@ const serializeArguments = = Record } - -export { serializeArguments } diff --git a/packages/anoncreds-nodejs/src/ffi/structures.ts b/packages/anoncreds-nodejs/src/ffi/structures.ts index 3db0933b..750365ad 100644 --- a/packages/anoncreds-nodejs/src/ffi/structures.ts +++ b/packages/anoncreds-nodejs/src/ffi/structures.ts @@ -1,113 +1,68 @@ -import * as ref from '@2060.io/ref-napi' -import RefArray from 'ref-array-di' -import RefStruct from 'ref-struct-di' +import koffi from 'koffi' +import { FFI_INT8, FFI_INT32, FFI_INT64, FFI_OBJECT_HANDLE, FFI_STRING, FFI_UINT8, FFI_USIZE } from './primitives' -import { FFI_INT8, FFI_INT32, FFI_INT64, FFI_ISIZE, FFI_OBJECT_HANDLE, FFI_STRING } from './primitives' - -const CStruct = RefStruct(ref) -const CArray = RefArray(ref) - -export const StringArray = CArray('string') - -const FFI_INT32_ARRAY = CArray('int32') - -const FFI_INT64_ARRAY = CArray('int64') - -export const ByteBufferArray = CArray('uint8') -export const ByteBufferArrayPtr = ref.refType(FFI_STRING) - -export const Int64List = FFI_INT64_ARRAY -export const Int32List = FFI_INT32_ARRAY - -export const StringArrayPtr = ref.refType(StringArray) - -export const ByteBufferStruct = CStruct({ +export const ByteBufferStruct = koffi.struct('ByteBufferStruct', { len: FFI_INT64, - data: ByteBufferArrayPtr, -}) - -export const ByteBufferStructPtr = ref.refType(ByteBufferStruct) - -export const StringListStruct = CStruct({ - count: ref.types.size_t, - data: StringArray, + data: koffi.pointer(FFI_UINT8), }) -export const StringListStructPtr = ref.refType(StringListStruct) +export type ByteBufferStructType = { + len: number + data: Uint8Array +} -export const I64ListStruct = CStruct({ - count: FFI_ISIZE, - data: FFI_INT64_ARRAY, +export const StringListStruct = koffi.struct('StringListStruct', { + count: FFI_USIZE, + data: koffi.pointer(FFI_STRING), }) -export const I32ListStruct = CStruct({ - count: FFI_ISIZE, - data: FFI_INT32_ARRAY, +export const I32ListStruct = koffi.struct('I32ListStruct', { + count: FFI_USIZE, + data: koffi.pointer(FFI_INT32), }) -export const CredRevInfoStruct = CStruct({ +export const CredRevInfoStruct = koffi.struct('CredRevInfoStruct', { reg_def: FFI_OBJECT_HANDLE, reg_def_private: FFI_OBJECT_HANDLE, status_list: FFI_OBJECT_HANDLE, reg_idx: FFI_INT64, }) -export const CredentialEntryStruct = CStruct({ - credential: FFI_ISIZE, - timestamp: FFI_INT64, - rev_state: FFI_ISIZE, +export const CredentialEntryStruct = koffi.struct('CredentialEntryStruct', { + credential: FFI_OBJECT_HANDLE, + timestamp: FFI_INT32, + rev_state: FFI_OBJECT_HANDLE, }) -export const CredentialEntryArray = CArray(CredentialEntryStruct) - -export const CredentialEntryListStruct = CStruct({ - count: FFI_ISIZE, - data: CredentialEntryArray, +export const CredentialEntryStructList = koffi.struct('CredentialEntryStructList', { + count: FFI_USIZE, + data: koffi.pointer(CredentialEntryStruct), }) -export const CredentialProveStruct = CStruct({ +export const CredentialProveStruct = koffi.struct('CredentialProveStruct', { entry_idx: FFI_INT64, referent: FFI_STRING, is_predicate: FFI_INT8, reveal: FFI_INT8, }) -export const CredentialProveArray = CArray(CredentialProveStruct) - -export const CredentialProveListStruct = CStruct({ - count: FFI_ISIZE, - data: CredentialProveArray, -}) - -export const ObjectHandleArray = CArray('size_t') - -export const ObjectHandleListStruct = CStruct({ - count: FFI_ISIZE, - data: ObjectHandleArray, +export const CredentialProveStructList = koffi.struct('CredentialProveStructList', { + count: FFI_USIZE, + data: koffi.pointer(CredentialProveStruct), }) -export const RevocationEntryStruct = CStruct({ - def_entry_idx: FFI_INT64, - entry: FFI_ISIZE, - timestamp: FFI_INT64, +export const ObjectHandleList = koffi.struct('ObjectHandleList', { + count: FFI_USIZE, + data: koffi.pointer(FFI_OBJECT_HANDLE), }) -export const RevocationEntryArray = CArray(RevocationEntryStruct) - -export const RevocationEntryListStruct = CStruct({ - count: FFI_ISIZE, - data: RevocationEntryArray, -}) - -export const NonRevokedIntervalOverrideStruct = CStruct({ +export const NonrevokedIntervalOverrideStruct = koffi.struct('NonrevokedIntervalOverrideStruct', { rev_reg_def_id: FFI_STRING, requested_from_ts: FFI_INT32, override_rev_status_list_ts: FFI_INT32, }) -export const NonRevokedIntervalOverrideArray = CArray(NonRevokedIntervalOverrideStruct) - -export const NonRevokedIntervalOverrideListStruct = CStruct({ - count: FFI_ISIZE, - data: NonRevokedIntervalOverrideArray, +export const NonrevokedIntervalOverrideStructList = koffi.struct('NonrevokedIntervalOverrideStructList', { + count: FFI_USIZE, + data: koffi.pointer(NonrevokedIntervalOverrideStruct), }) diff --git a/packages/anoncreds-nodejs/src/library/NativeBindingInterface.ts b/packages/anoncreds-nodejs/src/library/NativeBindingInterface.ts index bb0a9fa9..15ecbb0d 100644 --- a/packages/anoncreds-nodejs/src/library/NativeBindingInterface.ts +++ b/packages/anoncreds-nodejs/src/library/NativeBindingInterface.ts @@ -1,34 +1,5 @@ import type { nativeBindings } from './bindings' -// We need a mapping from string type value => type (property 'string' maps to type string) -interface StringTypeMapping { - pointer: Buffer - 'char*': Buffer - string: string - int64: number - int32: number - int8: number - int: number - size_t: number -} - -// Needed so TS stops complaining about index signatures -type ShapeOf = { - [Property in keyof T]: T[Property] -} -type StringTypeArrayToTypes = { - [Item in keyof List]: List[Item] extends keyof StringTypeMapping ? StringTypeMapping[List[Item]] : Buffer -} - -// biome-ignore lint/suspicious/noExplicitAny: -type TypedMethods> = { - [Property in keyof Base]: ( - // biome-ignore lint/suspicious/noExplicitAny: - ...args: StringTypeArrayToTypes extends any[] ? StringTypeArrayToTypes : [] - ) => StringTypeMapping[Base[Property][0]] -} -type Mutable = { - -readonly [K in keyof T]: Mutable -} - -export type NativeMethods = TypedMethods>> +// TODO: make this typed +// biome-ignore lint/suspicious/noExplicitAny: cannot use unknown, can be inferred from the `bindings.ts` but quite complex +export type NativeMethods = Record any> diff --git a/packages/anoncreds-nodejs/src/library/bindings.ts b/packages/anoncreds-nodejs/src/library/bindings.ts index 5105d3b2..d55e8743 100644 --- a/packages/anoncreds-nodejs/src/library/bindings.ts +++ b/packages/anoncreds-nodejs/src/library/bindings.ts @@ -1,42 +1,51 @@ +import * as koffi from 'koffi' import { ByteBufferStruct, - ByteBufferStructPtr, - CredentialEntryListStruct, - CredentialProveListStruct, - FFI_ERRORCODE, + CredRevInfoStruct, + CredentialEntryStructList, + CredentialProveStructList, + FFI_ERROR_CODE, FFI_INT8, - FFI_INT8_PTR, FFI_INT64, FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE_PTR, FFI_STRING, - FFI_STRING_PTR, FFI_VOID, I32ListStruct, - NonRevokedIntervalOverrideListStruct, - ObjectHandleListStruct, + NonrevokedIntervalOverrideStructList, + ObjectHandleList, StringListStruct, } from '../ffi' -export const nativeBindings = { - // first element is method return type, second element is list of method argument types +export const nativeBindings: Record]> = { + // Version and utilities + anoncreds_version: [koffi.pointer(FFI_STRING), []], + anoncreds_set_default_logger: [FFI_ERROR_CODE, []], + + // Error handling + anoncreds_get_current_error: [FFI_ERROR_CODE, [koffi.out(koffi.pointer(FFI_STRING))]], + + // Nonce + anoncreds_generate_nonce: [FFI_ERROR_CODE, [koffi.out(koffi.pointer(FFI_STRING))]], + + // Buffer and memory management anoncreds_buffer_free: [FFI_VOID, [ByteBufferStruct]], - anoncreds_create_credential: [ - FFI_ERRORCODE, - [ - FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE, - StringListStruct, - StringListStruct, - StringListStruct, - FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE_PTR, - ], + anoncreds_string_free: [FFI_VOID, [koffi.pointer(FFI_STRING)]], + anoncreds_object_free: [FFI_VOID, [FFI_OBJECT_HANDLE]], + + // Object operations + anoncreds_object_get_json: [FFI_ERROR_CODE, [FFI_OBJECT_HANDLE, koffi.out(koffi.pointer(ByteBufferStruct))]], + anoncreds_object_get_type_name: [FFI_ERROR_CODE, [FFI_OBJECT_HANDLE, koffi.out(koffi.pointer(FFI_STRING))]], + + // Schema operations + anoncreds_create_schema: [ + FFI_ERROR_CODE, + [FFI_STRING, FFI_STRING, FFI_STRING, StringListStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], ], + anoncreds_schema_from_json: [FFI_ERROR_CODE, [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))]], + + // Credential definition operations anoncreds_create_credential_definition: [ - FFI_ERRORCODE, + FFI_ERROR_CODE, [ FFI_STRING, FFI_OBJECT_HANDLE, @@ -44,207 +53,297 @@ export const nativeBindings = { FFI_STRING, FFI_STRING, FFI_INT8, - FFI_OBJECT_HANDLE_PTR, - FFI_OBJECT_HANDLE_PTR, - FFI_OBJECT_HANDLE_PTR, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_create_credential_offer: [ - FFI_ERRORCODE, - [FFI_STRING, FFI_STRING, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE_PTR], + anoncreds_credential_definition_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], ], - anoncreds_create_credential_request: [ - FFI_ERRORCODE, + anoncreds_credential_definition_private_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Key correctness proof + anoncreds_key_correctness_proof_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Revocation registry operations + anoncreds_create_revocation_registry_def: [ + FFI_ERROR_CODE, [ + FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING, - FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING, - FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE_PTR, - FFI_OBJECT_HANDLE_PTR, + FFI_INT64, + FFI_STRING, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_create_link_secret: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE_PTR]], - anoncreds_create_or_update_revocation_state: [ - FFI_ERRORCODE, + anoncreds_revocation_registry_definition_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + anoncreds_revocation_registry_definition_private_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + anoncreds_revocation_registry_definition_get_attribute: [ + FFI_ERROR_CODE, + [FFI_OBJECT_HANDLE, FFI_STRING, koffi.out(koffi.pointer(FFI_STRING))], + ], + anoncreds_revocation_registry_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Revocation status list operations + anoncreds_create_revocation_status_list: [ + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE, - FFI_INT64, FFI_STRING, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, - FFI_OBJECT_HANDLE_PTR, + FFI_STRING, + FFI_INT8, + FFI_INT64, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_create_presentation: [ - FFI_ERRORCODE, + anoncreds_update_revocation_status_list: [ + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, - CredentialEntryListStruct, - CredentialProveListStruct, - StringListStruct, - StringListStruct, - FFI_STRING, - ObjectHandleListStruct, - StringListStruct, - ObjectHandleListStruct, - StringListStruct, - FFI_OBJECT_HANDLE_PTR, + FFI_OBJECT_HANDLE, + FFI_OBJECT_HANDLE, + FFI_OBJECT_HANDLE, + I32ListStruct, + I32ListStruct, + FFI_INT64, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_create_revocation_registry_def: [ - FFI_ERRORCODE, + anoncreds_update_revocation_status_list_timestamp_only: [ + FFI_ERROR_CODE, + [FFI_INT64, FFI_OBJECT_HANDLE, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + anoncreds_revocation_status_list_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Revocation state operations + anoncreds_create_or_update_revocation_state: [ + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, + FFI_OBJECT_HANDLE, + FFI_INT64, FFI_STRING, + FFI_OBJECT_HANDLE, + FFI_OBJECT_HANDLE, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), + ], + ], + anoncreds_revocation_state_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Link secret operations + anoncreds_create_link_secret: [FFI_ERROR_CODE, [koffi.out(koffi.pointer(FFI_STRING))]], + + // Credential offer operations + anoncreds_create_credential_offer: [ + FFI_ERROR_CODE, + [FFI_STRING, FFI_STRING, FFI_OBJECT_HANDLE, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + anoncreds_credential_offer_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Credential request operations + anoncreds_create_credential_request: [ + FFI_ERROR_CODE, + [ FFI_STRING, FFI_STRING, + FFI_OBJECT_HANDLE, FFI_STRING, - FFI_INT64, FFI_STRING, - FFI_OBJECT_HANDLE_PTR, - FFI_OBJECT_HANDLE_PTR, + FFI_OBJECT_HANDLE, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_create_schema: [ - FFI_ERRORCODE, - [FFI_STRING, FFI_STRING, FFI_STRING, StringListStruct, FFI_OBJECT_HANDLE_PTR], - ], - anoncreds_credential_get_attribute: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING_PTR]], - anoncreds_encode_credential_attributes: [FFI_ERRORCODE, [StringListStruct, FFI_STRING_PTR]], - anoncreds_generate_nonce: [FFI_ERRORCODE, [FFI_STRING_PTR]], - anoncreds_get_current_error: [FFI_ERRORCODE, [FFI_STRING_PTR]], - anoncreds_object_free: [FFI_VOID, [FFI_OBJECT_HANDLE]], - anoncreds_string_free: [FFI_VOID, [FFI_STRING_PTR]], - anoncreds_object_get_json: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, ByteBufferStructPtr]], - anoncreds_object_get_type_name: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, FFI_STRING_PTR]], - anoncreds_presentation_request_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_process_credential: [ - FFI_ERRORCODE, - [FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_STRING, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE_PTR], + anoncreds_credential_request_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], ], - anoncreds_revocation_registry_definition_get_attribute: [ - FFI_ERRORCODE, - [FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING_PTR], + anoncreds_credential_request_metadata_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], ], - anoncreds_set_default_logger: [FFI_ERRORCODE, []], - anoncreds_verify_presentation: [ - FFI_ERRORCODE, + + // Credential operations + anoncreds_create_credential: [ + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, - ObjectHandleListStruct, + FFI_OBJECT_HANDLE, + FFI_OBJECT_HANDLE, StringListStruct, - ObjectHandleListStruct, StringListStruct, - ObjectHandleListStruct, StringListStruct, - ObjectHandleListStruct, - NonRevokedIntervalOverrideListStruct, - FFI_INT8_PTR, + koffi.pointer(CredRevInfoStruct), + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_create_revocation_status_list: [ - FFI_ERRORCODE, + anoncreds_credential_from_json: [FFI_ERROR_CODE, [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))]], + anoncreds_credential_get_attribute: [ + FFI_ERROR_CODE, + [FFI_OBJECT_HANDLE, FFI_STRING, koffi.out(koffi.pointer(FFI_STRING))], + ], + anoncreds_process_credential: [ + FFI_ERROR_CODE, [ + FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_STRING, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, - FFI_STRING, - FFI_INT8, - FFI_INT64, - FFI_OBJECT_HANDLE_PTR, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_update_revocation_status_list_timestamp_only: [ - FFI_ERRORCODE, - [FFI_INT64, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE_PTR], - ], - anoncreds_update_revocation_status_list: [ - FFI_ERRORCODE, + anoncreds_encode_credential_attributes: [FFI_ERROR_CODE, [StringListStruct, koffi.out(koffi.pointer(FFI_STRING))]], + + // W3C Credential operations + anoncreds_create_w3c_credential: [ + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, - I32ListStruct, - I32ListStruct, - FFI_INT64, - FFI_OBJECT_HANDLE_PTR, + StringListStruct, + StringListStruct, + koffi.pointer(CredRevInfoStruct), + FFI_STRING, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_version: [FFI_STRING, []], - anoncreds_credential_request_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_credential_request_metadata_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_presentation_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_credential_offer_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_revocation_registry_definition_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_revocation_registry_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_revocation_status_list_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_revocation_state_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_credential_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_credential_definition_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_credential_definition_private_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_revocation_registry_definition_private_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_key_correctness_proof_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_schema_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_create_w3c_credential: [ - FFI_ERRORCODE, + anoncreds_w3c_credential_from_json: [FFI_ERROR_CODE, [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))]], + anoncreds_credential_to_w3c: [ + FFI_ERROR_CODE, + [FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + anoncreds_credential_from_w3c: [FFI_ERROR_CODE, [FFI_OBJECT_HANDLE, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))]], + anoncreds_process_w3c_credential: [ + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, + FFI_STRING, + FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), + ], + ], + anoncreds_w3c_credential_get_integrity_proof_details: [ + FFI_ERROR_CODE, + [FFI_OBJECT_HANDLE, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + anoncreds_w3c_credential_proof_get_attribute: [ + FFI_ERROR_CODE, + [FFI_OBJECT_HANDLE, FFI_STRING, koffi.out(koffi.pointer(FFI_STRING))], + ], + + // Presentation request operations + anoncreds_presentation_request_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], + + // Presentation operations + anoncreds_create_presentation: [ + FFI_ERROR_CODE, + [ FFI_OBJECT_HANDLE, + CredentialEntryStructList, + CredentialProveStructList, StringListStruct, StringListStruct, - FFI_OBJECT_HANDLE, FFI_STRING, - FFI_OBJECT_HANDLE_PTR, + ObjectHandleList, + StringListStruct, + ObjectHandleList, + StringListStruct, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], - anoncreds_process_w3c_credential: [ - FFI_ERRORCODE, - [FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_STRING, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE_PTR], + anoncreds_presentation_from_json: [FFI_ERROR_CODE, [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))]], + anoncreds_verify_presentation: [ + FFI_ERROR_CODE, + [ + FFI_OBJECT_HANDLE, + FFI_OBJECT_HANDLE, + ObjectHandleList, + StringListStruct, + ObjectHandleList, + StringListStruct, + ObjectHandleList, + StringListStruct, + ObjectHandleList, + NonrevokedIntervalOverrideStructList, + koffi.out(koffi.pointer(FFI_INT8)), + ], ], + + // W3C Presentation operations anoncreds_create_w3c_presentation: [ - FFI_ERRORCODE, + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, - CredentialEntryListStruct, - CredentialProveListStruct, + CredentialEntryStructList, + CredentialProveStructList, FFI_STRING, - ObjectHandleListStruct, + ObjectHandleList, StringListStruct, - ObjectHandleListStruct, + ObjectHandleList, StringListStruct, FFI_STRING, - FFI_OBJECT_HANDLE_PTR, + koffi.out(koffi.pointer(FFI_OBJECT_HANDLE)), ], ], + anoncreds_w3c_presentation_from_json: [ + FFI_ERROR_CODE, + [ByteBufferStruct, koffi.out(koffi.pointer(FFI_OBJECT_HANDLE))], + ], anoncreds_verify_w3c_presentation: [ - FFI_ERRORCODE, + FFI_ERROR_CODE, [ FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE, - ObjectHandleListStruct, + ObjectHandleList, StringListStruct, - ObjectHandleListStruct, + ObjectHandleList, StringListStruct, - ObjectHandleListStruct, + ObjectHandleList, StringListStruct, - ObjectHandleListStruct, - NonRevokedIntervalOverrideListStruct, - FFI_INT8_PTR, + ObjectHandleList, + NonrevokedIntervalOverrideStructList, + koffi.out(koffi.pointer(FFI_INT8)), ], ], - anoncreds_credential_to_w3c: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING, FFI_OBJECT_HANDLE_PTR]], - anoncreds_credential_from_w3c: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE_PTR]], - anoncreds_w3c_credential_get_integrity_proof_details: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, FFI_OBJECT_HANDLE_PTR]], - anoncreds_w3c_credential_proof_get_attribute: [FFI_ERRORCODE, [FFI_OBJECT_HANDLE, FFI_STRING, FFI_STRING_PTR]], - anoncreds_w3c_presentation_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], - anoncreds_w3c_credential_from_json: [FFI_ERRORCODE, [ByteBufferStruct, FFI_STRING_PTR]], } as const diff --git a/packages/anoncreds-nodejs/src/library/register.ts b/packages/anoncreds-nodejs/src/library/register.ts index 27eb967d..856d2eba 100644 --- a/packages/anoncreds-nodejs/src/library/register.ts +++ b/packages/anoncreds-nodejs/src/library/register.ts @@ -1,10 +1,8 @@ +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import koffi from 'koffi' import type { NativeMethods } from './NativeBindingInterface' - -import fs from 'fs' -import os from 'os' -import path from 'path' -import { Library } from '@2060.io/ffi-napi' - import { nativeBindings } from './bindings' const LIBNAME = 'anoncreds' @@ -51,26 +49,32 @@ const getLibrary = () => { if (pathFromEnvironment) platformPaths.unshift(pathFromEnvironment) // Create the path + file - const libaries = platformPaths.map((p) => + const libraries = platformPaths.map((p) => path.join(p, `${extensions[platform].prefix ?? ''}${LIBNAME}${extensions[platform].extension}`) ) - // Gaurd so we quit if there is no valid path for the library - if (!libaries.some(doesPathExist)) - throw new Error(`Could not find ${LIBNAME} with these paths: ${libaries.join(' ')}`) + // Guard so we quit if there is no valid path for the library + if (!libraries.some((libraryPath) => doesPathExist(libraryPath))) + throw new Error(`Could not find ${LIBNAME} with these paths: ${libraries.join(' ')}`) // Get the first valid library // Casting here as a string because there is a guard of none of the paths - const validLibraryPath = libaries.find((l) => doesPathExist(l)) as string + const validLibraryPath = libraries.find((l) => doesPathExist(l)) as string + + // Load the library using koffi + const lib = koffi.load(validLibraryPath) + + // Bind all the native functions + const methods: Partial = {} + for (const [name, [returnType, argumentTypes]] of Object.entries(nativeBindings)) { + methods[name as keyof NativeMethods] = lib.func(name, returnType, argumentTypes) + } - // TODO - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - return Library(validLibraryPath, nativeBindings) + return methods as NativeMethods } -let nativeAnoncreds: NativeMethods | undefined -export const getNativeAnoncreds = () => { - if (!nativeAnoncreds) nativeAnoncreds = getLibrary() as unknown as NativeMethods - return nativeAnoncreds +let nativeAnonCreds: NativeMethods | undefined +export const getNativeAnonCreds = () => { + if (!nativeAnonCreds) nativeAnonCreds = getLibrary() + return nativeAnonCreds } diff --git a/packages/anoncreds-nodejs/tests/api.test.ts b/packages/anoncreds-nodejs/tests/api.test.ts index 9cd8067e..9d5daccf 100644 --- a/packages/anoncreds-nodejs/tests/api.test.ts +++ b/packages/anoncreds-nodejs/tests/api.test.ts @@ -6,6 +6,7 @@ import { CredentialRevocationConfig, CredentialRevocationState, LinkSecret, + Nonce, Presentation, PresentationRequest, RevocationRegistryDefinition, @@ -13,19 +14,15 @@ import { Schema, W3cCredential, W3cPresentation, - anoncreds, } from '@hyperledger/anoncreds-shared' import { setup } from './utils' -import { deepStrictEqual, ok, strictEqual, throws } from 'node:assert' -import { before, describe, test } from 'node:test' +import { beforeAll, describe, expect, test } from 'vitest' describe('API', () => { - before(setup) - test('create and verify presentation', () => { - const nonce = anoncreds.generateNonce() + const nonce = Nonce.generate() const presentationRequest = PresentationRequest.fromJson({ nonce, @@ -178,10 +175,10 @@ describe('API', () => { selfAttest: { attr3_referent: '8-800-300' }, }) - ok(typeof presentation.handle.handle === 'number') + expect(typeof presentation.handle.handle).toBe('number') // Without revocation timestamp override, it shall fail - throws(() => + expect(() => presentation.verify({ presentationRequest, schemas: { 'mock:uri': schema }, @@ -189,7 +186,7 @@ describe('API', () => { revocationRegistryDefinitions: { 'mock:uri': revocationRegistryDefinition }, revocationStatusLists: [revocationStatusList], }) - ) + ).toThrow() const verify = presentation.verify({ presentationRequest, @@ -206,7 +203,7 @@ describe('API', () => { ], }) - ok(verify) + expect(verify).toBeTruthy() }) test('create and verify presentation (no revocation use case)', () => { @@ -259,17 +256,17 @@ describe('API', () => { const credJson = credential.toJson() - strictEqual(credJson.cred_def_id, 'mock:uri') - strictEqual(credJson.schema_id, 'mock:uri') + expect(credJson.cred_def_id).toBe('mock:uri') + expect(credJson.schema_id).toBe('mock:uri') const credReceivedJson = credential.toJson() - strictEqual(credReceivedJson.cred_def_id, 'mock:uri') - strictEqual(credReceivedJson.schema_id, 'mock:uri') + expect(credReceivedJson.cred_def_id).toBe('mock:uri') + expect(credReceivedJson.schema_id).toBe('mock:uri') - ok(credReceivedJson.signature) - strictEqual(credReceivedJson.witness, null) + expect(credReceivedJson.signature).toBeDefined() + expect(credReceivedJson.witness).toBeNull() - const nonce = anoncreds.generateNonce() + const nonce = Nonce.generate() const presentationRequest = PresentationRequest.fromJson({ nonce, @@ -334,7 +331,7 @@ describe('API', () => { selfAttest: { attr3_referent: '8-800-300' }, }) - ok(typeof presentation.handle.handle === 'number') + expect(typeof presentation.handle.handle).toBe('number') const verify = presentation.verify({ presentationRequest, @@ -342,14 +339,14 @@ describe('API', () => { credentialDefinitions: { 'mock:uri': credentialDefinition }, }) - ok(verify) + expect(verify).toBeTruthy() }) }) test('create and verify presentation passing only JSON objects as parameters', () => { setup() - const nonce = anoncreds.generateNonce() + const nonce = Nonce.generate() // a schema can be created from JSON const schema = Schema.fromJson({ @@ -359,7 +356,7 @@ test('create and verify presentation passing only JSON objects as parameters', ( attrNames: ['name', 'age', 'sex', 'height'], }) - deepStrictEqual(schema.toJson(), { + expect(schema.toJson()).toStrictEqual({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -447,18 +444,18 @@ test('create and verify presentation passing only JSON objects as parameters', ( const credJson = credential.toJson() - strictEqual(credJson.cred_def_id, 'mock:uri') - strictEqual(credJson.schema_id, 'mock:uri') - strictEqual(credJson.rev_reg_id, 'mock:uri') + expect(credJson.cred_def_id).toBe('mock:uri') + expect(credJson.schema_id).toBe('mock:uri') + expect(credJson.rev_reg_id).toBe('mock:uri') const credReceivedJson = credential.toJson() - strictEqual(credReceivedJson.cred_def_id, 'mock:uri') - strictEqual(credReceivedJson.schema_id, 'mock:uri') - strictEqual(credReceivedJson.rev_reg_id, 'mock:uri') + expect(credReceivedJson.cred_def_id).toBe('mock:uri') + expect(credReceivedJson.schema_id).toBe('mock:uri') + expect(credReceivedJson.rev_reg_id).toBe('mock:uri') - ok(credReceivedJson.signature) - ok(credReceivedJson.witness) + expect(credReceivedJson.signature).toBeDefined() + expect(credReceivedJson.witness).toBeDefined() const presentationRequest = { nonce, @@ -523,7 +520,7 @@ test('create and verify presentation passing only JSON objects as parameters', ( selfAttest: { attr3_referent: '8-800-300' }, }) - ok(typeof presentation.handle.handle === 'number') + expect(typeof presentation.handle.handle).toBe('number') const verify = Presentation.fromJson(presentation.toJson()).verify({ presentationRequest, @@ -533,14 +530,14 @@ test('create and verify presentation passing only JSON objects as parameters', ( revocationStatusLists: [revocationStatusList.toJson()], }) - ok(verify) + expect(verify).toBeTruthy() }) describe('API W3C', () => { - before(setup) + beforeAll(setup) test('create and verify w3c presentation', () => { - const nonce = anoncreds.generateNonce() + const nonce = Nonce.generate() const presentationRequest = PresentationRequest.fromJson({ nonce, @@ -631,20 +628,20 @@ describe('API W3C', () => { }) const legacyCredential = credential.toLegacy() - strictEqual(legacyCredential.schemaId, 'mock:uri') - strictEqual(legacyCredential.credentialDefinitionId, 'mock:uri') + expect(legacyCredential.schemaId).toBe('mock:uri') + expect(legacyCredential.credentialDefinitionId).toBe('mock:uri') const legacyCredentialFrom = Credential.fromW3c({ credential }) - strictEqual(legacyCredentialFrom.schemaId, 'mock:uri') - strictEqual(legacyCredentialFrom.credentialDefinitionId, 'mock:uri') + expect(legacyCredentialFrom.schemaId).toBe('mock:uri') + expect(legacyCredentialFrom.credentialDefinitionId).toBe('mock:uri') const w3cCredential = W3cCredential.fromLegacy({ credential: legacyCredential, issuerId: 'mock:uri' }) - strictEqual(w3cCredential.schemaId, 'mock:uri') - strictEqual(w3cCredential.credentialDefinitionId, 'mock:uri') + expect(w3cCredential.schemaId).toBe('mock:uri') + expect(w3cCredential.credentialDefinitionId).toBe('mock:uri') const convertedW3cCredential = legacyCredential.toW3c({ issuerId: 'mock:uri' }) - strictEqual(convertedW3cCredential.schemaId, 'mock:uri') - strictEqual(convertedW3cCredential.credentialDefinitionId, 'mock:uri') + expect(convertedW3cCredential.schemaId).toBe('mock:uri') + expect(convertedW3cCredential.credentialDefinitionId).toBe('mock:uri') const credentialReceived = credential.process({ credentialDefinition, @@ -696,10 +693,10 @@ describe('API W3C', () => { schemas: { 'mock:uri': schema }, }) - ok(typeof presentation.handle.handle === 'number') + expect(typeof presentation.handle.handle).toBe('number') // Without revocation timestamp override, it shall fail - throws(() => { + expect(() => { presentation.verify({ presentationRequest, schemas: { 'mock:uri': schema }, @@ -707,7 +704,7 @@ describe('API W3C', () => { revocationRegistryDefinitions: { 'mock:uri': revocationRegistryDefinition }, revocationStatusLists: [revocationStatusList], }) - }) + }).toThrow() const verify = presentation.verify({ presentationRequest, @@ -724,7 +721,7 @@ describe('API W3C', () => { ], }) - ok(verify) + expect(verify).toBeTruthy() }) test('create and verify w3c presentation (no revocation use case)', () => { @@ -775,7 +772,7 @@ describe('API W3C', () => { linkSecret, }) - const nonce = anoncreds.generateNonce() + const nonce = Nonce.generate() const presentationRequest = PresentationRequest.fromJson({ nonce, @@ -827,7 +824,7 @@ describe('API W3C', () => { schemas: { 'mock:uri': schema }, }) - ok(typeof presentation.handle.handle === 'number') + expect(typeof presentation.handle.handle).toBe('number') const verify = presentation.verify({ presentationRequest, @@ -835,6 +832,6 @@ describe('API W3C', () => { credentialDefinitions: { 'mock:uri': credentialDefinition }, }) - ok(verify) + expect(verify).toBeTruthy() }) }) diff --git a/packages/anoncreds-nodejs/tests/bindings.test.ts b/packages/anoncreds-nodejs/tests/bindings.test.ts index c81290b4..7b19ad3c 100644 --- a/packages/anoncreds-nodejs/tests/bindings.test.ts +++ b/packages/anoncreds-nodejs/tests/bindings.test.ts @@ -1,26 +1,23 @@ -import { deepStrictEqual, ok, strictEqual } from 'node:assert' -import { before, describe, test } from 'node:test' -import { anoncreds } from '@hyperledger/anoncreds-shared' -import { setup } from './utils' +import { NativeAnoncreds } from '@hyperledger/anoncreds-shared' +import { describe, expect, test } from 'vitest' const ENTROPY = 'entropy' describe('bindings', () => { - before(setup) - test('current error', () => { - const error = anoncreds.getCurrentError() + const error = NativeAnoncreds.instance.getCurrentError() - deepStrictEqual(JSON.parse(error), { + expect(error).toStrictEqual({ code: 0, message: null, }) }) test('generate nonce', () => { - const nonce = anoncreds.generateNonce() + const nonce = NativeAnoncreds.instance.generateNonce() - ok(!Number.isNaN(Number(nonce))) + expect(nonce).toBeTypeOf('string') + expect(nonce.length).toBeGreaterThan(1) }) test('create schema', () => { @@ -30,11 +27,12 @@ describe('bindings', () => { version: '1', attributeNames: ['attr-1'], } - const schemaObj = anoncreds.createSchema(obj) - const json = anoncreds.getJson({ objectHandle: schemaObj }) + const schemaObj = NativeAnoncreds.instance.createSchema(obj) + + const json = NativeAnoncreds.instance.getJson({ objectHandle: schemaObj }) - deepStrictEqual(JSON.parse(json), { + expect(JSON.parse(json)).toStrictEqual({ name: 'schema-1', version: '1', issuerId: 'mock:uri', @@ -43,7 +41,7 @@ describe('bindings', () => { }) test('create credential definition', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -51,7 +49,7 @@ describe('bindings', () => { }) const { keyCorrectnessProof, credentialDefinition, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -60,40 +58,43 @@ describe('bindings', () => { tag: 'TAG', }) - const credDefJson = anoncreds.getJson({ objectHandle: credentialDefinition }) - strictEqual(JSON.parse(credDefJson).tag, 'TAG') - strictEqual(JSON.parse(credDefJson).type, 'CL') - strictEqual(JSON.parse(credDefJson).schemaId, 'mock:uri') - strictEqual(JSON.parse(credDefJson).issuerId, 'mock:uri') + const credDefJson = JSON.parse(NativeAnoncreds.instance.getJson({ objectHandle: credentialDefinition })) - const credDefPvtJson = anoncreds.getJson({ objectHandle: credentialDefinitionPrivate }) + expect(credDefJson).toMatchObject({ + tag: 'TAG', + type: 'CL', + schemaId: 'mock:uri', + issuerId: 'mock:uri', + }) + + const credDefPvtJson = JSON.parse(NativeAnoncreds.instance.getJson({ objectHandle: credentialDefinitionPrivate })) - ok(JSON.parse(credDefPvtJson).value) + expect(credDefPvtJson).toHaveProperty('value') - const keyCorrectnessProofJson = anoncreds.getJson({ objectHandle: keyCorrectnessProof }) + const keyCorrectnessProofJson = JSON.parse(NativeAnoncreds.instance.getJson({ objectHandle: keyCorrectnessProof })) - ok(JSON.parse(keyCorrectnessProofJson).c) - ok(JSON.parse(keyCorrectnessProofJson).xr_cap) + expect(keyCorrectnessProofJson).toHaveProperty('c') + expect(keyCorrectnessProofJson).toHaveProperty('xr_cap') }) test('encode credential attributes', () => { - const encoded = anoncreds.encodeCredentialAttributes({ attributeRawValues: ['value2', 'value1'] }) + const encoded = NativeAnoncreds.instance.encodeCredentialAttributes({ attributeRawValues: ['value2', 'value1'] }) - deepStrictEqual(encoded, [ + expect(encoded).toMatchObject([ '2360207505573967335061705667247358223962382058438765247085581582985596391831', '27404702143883897701950953229849815393032792099783647152371385368148256400014', ]) }) test('create revocation registry', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', attributeNames: ['attr-1'], }) - const { credentialDefinition } = anoncreds.createCredentialDefinition({ + const { credentialDefinition } = NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -102,7 +103,7 @@ describe('bindings', () => { tag: 'TAG', }) - const { revocationRegistryDefinition } = anoncreds.createRevocationRegistryDefinition({ + const { revocationRegistryDefinition } = NativeAnoncreds.instance.createRevocationRegistryDefinition({ credentialDefinitionId: 'mock:uri', credentialDefinition, issuerId: 'mock:uri', @@ -111,33 +112,41 @@ describe('bindings', () => { maximumCredentialNumber: 100, }) - const maximumCredentialNumber = anoncreds.revocationRegistryDefinitionGetAttribute({ + const maximumCredentialNumber = NativeAnoncreds.instance.revocationRegistryDefinitionGetAttribute({ objectHandle: revocationRegistryDefinition, name: 'max_cred_num', }) - strictEqual(maximumCredentialNumber, '100') - const json = anoncreds.getJson({ objectHandle: revocationRegistryDefinition }) - strictEqual(JSON.parse(json).credDefId, 'mock:uri') - strictEqual(JSON.parse(json).revocDefType, 'CL_ACCUM') - strictEqual(JSON.parse(json).tag, 'default') - strictEqual(JSON.parse(json).value.maxCredNum, 100) + expect(maximumCredentialNumber).toStrictEqual('100') + + const json = JSON.parse(NativeAnoncreds.instance.getJson({ objectHandle: revocationRegistryDefinition })) + + expect(json).toMatchObject({ + credDefId: 'mock:uri', + revocDefType: 'CL_ACCUM', + tag: 'default', + value: { + maxCredNum: 100, + }, + }) }) test('create link secret', () => { - const linkSecret = anoncreds.createLinkSecret() - ok(typeof linkSecret === 'string') + const linkSecret = NativeAnoncreds.instance.createLinkSecret() + + expect(linkSecret.length).toBeGreaterThan(1) + expect(linkSecret).toBeTypeOf('string') }) test('create credential offer', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', attributeNames: ['attr-1'], }) - const { keyCorrectnessProof } = anoncreds.createCredentialDefinition({ + const { keyCorrectnessProof } = NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', schema: schemaObj, issuerId: 'mock:uri', @@ -146,29 +155,30 @@ describe('bindings', () => { tag: 'TAG', }) - const credOfferObj = anoncreds.createCredentialOffer({ + const credOfferObj = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const json = anoncreds.getJson({ objectHandle: credOfferObj }) - strictEqual(JSON.parse(json).cred_def_id, 'mock:uri') - strictEqual(JSON.parse(json).schema_id, 'mock:uri') - - ok(JSON.parse(json).nonce) - ok(JSON.parse(json).key_correctness_proof) + const json = JSON.parse(NativeAnoncreds.instance.getJson({ objectHandle: credOfferObj })) + expect(json).toMatchObject({ + cred_def_id: 'mock:uri', + schema_id: 'mock:uri', + nonce: expect.anything(), + key_correctness_proof: expect.anything(), + }) }) test('create credential request', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', attributeNames: ['attr-1'], }) - const { credentialDefinition, keyCorrectnessProof } = anoncreds.createCredentialDefinition({ + const { credentialDefinition, keyCorrectnessProof } = NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -177,16 +187,16 @@ describe('bindings', () => { tag: 'TAG', }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequest, credentialRequestMetadata } = anoncreds.createCredentialRequest({ + const { credentialRequest, credentialRequestMetadata } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -194,22 +204,23 @@ describe('bindings', () => { credentialOffer, }) - const credReqJson = anoncreds.getJson({ objectHandle: credentialRequest }) - - strictEqual(JSON.parse(credReqJson).cred_def_id, 'mock:uri') + const credReqJson = NativeAnoncreds.instance.getJson({ objectHandle: credentialRequest }) + const credReqParsed = JSON.parse(credReqJson) - ok(JSON.parse(credReqJson).blinded_ms) - ok(JSON.parse(credReqJson).nonce) + expect(credReqParsed.cred_def_id).toBe('mock:uri') + expect(credReqParsed.blinded_ms).toBeDefined() + expect(credReqParsed.nonce).toBeDefined() - const credReqMetadataJson = anoncreds.getJson({ objectHandle: credentialRequestMetadata }) - strictEqual(JSON.parse(credReqMetadataJson).link_secret_name, linkSecretId) + const credReqMetadataJson = NativeAnoncreds.instance.getJson({ objectHandle: credentialRequestMetadata }) + const credReqMetadataParsed = JSON.parse(credReqMetadataJson) - ok(JSON.parse(credReqMetadataJson).link_secret_blinding_data) - ok(JSON.parse(credReqMetadataJson).nonce) + expect(credReqMetadataParsed.link_secret_name).toBe(linkSecretId) + expect(credReqMetadataParsed.link_secret_blinding_data).toBeDefined() + expect(credReqMetadataParsed.nonce).toBeDefined() }) test('create and receive credential', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -217,7 +228,7 @@ describe('bindings', () => { }) const { credentialDefinition, keyCorrectnessProof, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -227,7 +238,7 @@ describe('bindings', () => { }) const { revocationRegistryDefinition, revocationRegistryDefinitionPrivate } = - anoncreds.createRevocationRegistryDefinition({ + NativeAnoncreds.instance.createRevocationRegistryDefinition({ credentialDefinitionId: 'mock:uri', credentialDefinition, issuerId: 'mock:uri', @@ -236,15 +247,15 @@ describe('bindings', () => { maximumCredentialNumber: 10, }) - const tailsPath = anoncreds.revocationRegistryDefinitionGetAttribute({ + const tailsPath = NativeAnoncreds.instance.revocationRegistryDefinitionGetAttribute({ objectHandle: revocationRegistryDefinition, name: 'tails_location', }) - ok(tailsPath) + expect(tailsPath).toBeDefined() const timeCreateRevStatusList = 12 - const revocationStatusList = anoncreds.createRevocationStatusList({ + const revocationStatusList = NativeAnoncreds.instance.createRevocationStatusList({ credentialDefinition, revocationRegistryDefinitionId: 'mock:uri', revocationRegistryDefinition, @@ -254,16 +265,16 @@ describe('bindings', () => { timestamp: timeCreateRevStatusList, }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequestMetadata, credentialRequest } = anoncreds.createCredentialRequest({ + const { credentialRequestMetadata, credentialRequest } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -271,7 +282,7 @@ describe('bindings', () => { credentialOffer, }) - const credential = anoncreds.createCredential({ + const credential = NativeAnoncreds.instance.createCredential({ credentialDefinition, credentialDefinitionPrivate, credentialOffer, @@ -285,7 +296,7 @@ describe('bindings', () => { }, }) - const credReceived = anoncreds.processCredential({ + const credReceived = NativeAnoncreds.instance.processCredential({ credential, credentialDefinition, credentialRequestMetadata, @@ -293,24 +304,25 @@ describe('bindings', () => { revocationRegistryDefinition, }) - const credJson = anoncreds.getJson({ objectHandle: credential }) + const credJson = NativeAnoncreds.instance.getJson({ objectHandle: credential }) + const credParsed = JSON.parse(credJson) - strictEqual(JSON.parse(credJson).cred_def_id, 'mock:uri') - strictEqual(JSON.parse(credJson).schema_id, 'mock:uri') - strictEqual(JSON.parse(credJson).rev_reg_id, 'mock:uri') + expect(credParsed.cred_def_id).toBe('mock:uri') + expect(credParsed.schema_id).toBe('mock:uri') + expect(credParsed.rev_reg_id).toBe('mock:uri') - const credReceivedJson = anoncreds.getJson({ objectHandle: credReceived }) + const credReceivedJson = NativeAnoncreds.instance.getJson({ objectHandle: credReceived }) + const credReceivedParsed = JSON.parse(credReceivedJson) - strictEqual(JSON.parse(credReceivedJson).cred_def_id, 'mock:uri') - strictEqual(JSON.parse(credReceivedJson).schema_id, 'mock:uri') - strictEqual(JSON.parse(credReceivedJson).rev_reg_id, 'mock:uri') - - ok(JSON.parse(credReceivedJson).signature) - ok(JSON.parse(credReceivedJson).witness) + expect(credReceivedParsed.cred_def_id).toBe('mock:uri') + expect(credReceivedParsed.schema_id).toBe('mock:uri') + expect(credReceivedParsed.rev_reg_id).toBe('mock:uri') + expect(credReceivedParsed.signature).toBeDefined() + expect(credReceivedParsed.witness).toBeDefined() }) test('create and receive w3c credential', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -318,7 +330,7 @@ describe('bindings', () => { }) const { credentialDefinition, keyCorrectnessProof, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -328,7 +340,7 @@ describe('bindings', () => { }) const { revocationRegistryDefinition, revocationRegistryDefinitionPrivate } = - anoncreds.createRevocationRegistryDefinition({ + NativeAnoncreds.instance.createRevocationRegistryDefinition({ credentialDefinitionId: 'mock:uri', credentialDefinition, issuerId: 'mock:uri', @@ -337,14 +349,14 @@ describe('bindings', () => { maximumCredentialNumber: 10, }) - const tailsPath = anoncreds.revocationRegistryDefinitionGetAttribute({ + const tailsPath = NativeAnoncreds.instance.revocationRegistryDefinitionGetAttribute({ objectHandle: revocationRegistryDefinition, name: 'tails_location', }) - ok(tailsPath) + expect(tailsPath).toBeDefined() const timeCreateRevStatusList = 12 - const revocationStatusList = anoncreds.createRevocationStatusList({ + const revocationStatusList = NativeAnoncreds.instance.createRevocationStatusList({ credentialDefinition, revocationRegistryDefinitionId: 'mock:uri', revocationRegistryDefinition, @@ -354,16 +366,16 @@ describe('bindings', () => { timestamp: timeCreateRevStatusList, }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequestMetadata, credentialRequest } = anoncreds.createCredentialRequest({ + const { credentialRequestMetadata, credentialRequest } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -371,7 +383,7 @@ describe('bindings', () => { credentialOffer, }) - const credential = anoncreds.createW3cCredential({ + const credential = NativeAnoncreds.instance.createW3cCredential({ credentialDefinition, credentialDefinitionPrivate, credentialOffer, @@ -387,7 +399,7 @@ describe('bindings', () => { encoding: undefined, }) - const credReceived = anoncreds.processW3cCredential({ + const credReceived = NativeAnoncreds.instance.processW3cCredential({ credential, credentialDefinition, credentialRequestMetadata, @@ -395,13 +407,14 @@ describe('bindings', () => { revocationRegistryDefinition, }) - anoncreds.getJson({ objectHandle: credReceived }) + const credReceivedJson = NativeAnoncreds.instance.getJson({ objectHandle: credReceived }) + expect(credReceivedJson).toBeDefined() }) test('create and verify presentation', () => { - const nonce = anoncreds.generateNonce() + const nonce = NativeAnoncreds.instance.generateNonce() - const presentationRequest = anoncreds.presentationRequestFromJson({ + const presentationRequest = NativeAnoncreds.instance.presentationRequestFromJson({ json: JSON.stringify({ nonce, name: 'pres_req_1', @@ -428,9 +441,9 @@ describe('bindings', () => { }), }) - strictEqual(anoncreds.getTypeName({ objectHandle: presentationRequest }), 'PresentationRequest') + expect(NativeAnoncreds.instance.getTypeName({ objectHandle: presentationRequest })).toBe('PresentationRequest') - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -438,7 +451,7 @@ describe('bindings', () => { }) const { credentialDefinition, keyCorrectnessProof, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -448,7 +461,7 @@ describe('bindings', () => { }) const { revocationRegistryDefinition, revocationRegistryDefinitionPrivate } = - anoncreds.createRevocationRegistryDefinition({ + NativeAnoncreds.instance.createRevocationRegistryDefinition({ credentialDefinitionId: 'mock:uri', credentialDefinition, issuerId: 'mock:uri', @@ -457,13 +470,13 @@ describe('bindings', () => { maximumCredentialNumber: 10, }) - const tailsPath = anoncreds.revocationRegistryDefinitionGetAttribute({ + const tailsPath = NativeAnoncreds.instance.revocationRegistryDefinitionGetAttribute({ objectHandle: revocationRegistryDefinition, name: 'tails_location', }) const timeCreateRevStatusList = 12 - const revocationStatusList = anoncreds.createRevocationStatusList({ + const revocationStatusList = NativeAnoncreds.instance.createRevocationStatusList({ credentialDefinition, revocationRegistryDefinitionId: 'mock:uri', revocationRegistryDefinition, @@ -473,16 +486,16 @@ describe('bindings', () => { timestamp: timeCreateRevStatusList, }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequestMetadata, credentialRequest } = anoncreds.createCredentialRequest({ + const { credentialRequestMetadata, credentialRequest } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -490,7 +503,7 @@ describe('bindings', () => { credentialOffer, }) - const credential = anoncreds.createCredential({ + const credential = NativeAnoncreds.instance.createCredential({ credentialDefinition, credentialDefinitionPrivate, credentialOffer, @@ -504,7 +517,7 @@ describe('bindings', () => { }, }) - const credentialReceived = anoncreds.processCredential({ + const credentialReceived = NativeAnoncreds.instance.processCredential({ credential, credentialDefinition, credentialRequestMetadata, @@ -512,21 +525,21 @@ describe('bindings', () => { revocationRegistryDefinition, }) - const revRegIndex = anoncreds.credentialGetAttribute({ + const revRegIndex = NativeAnoncreds.instance.credentialGetAttribute({ objectHandle: credentialReceived, name: 'rev_reg_index', }) const revocationRegistryIndex = revRegIndex === null ? 0 : Number.parseInt(revRegIndex) - const revocationState = anoncreds.createOrUpdateRevocationState({ + const revocationState = NativeAnoncreds.instance.createOrUpdateRevocationState({ revocationRegistryDefinition, revocationStatusList, revocationRegistryIndex, tailsPath, }) - const presentation = anoncreds.createPresentation({ + const presentation = NativeAnoncreds.instance.createPresentation({ presentationRequest, credentials: [ { @@ -567,9 +580,9 @@ describe('bindings', () => { selfAttest: { attr3_referent: '8-800-300' }, }) - ok(typeof presentation.handle === 'number') + expect(typeof presentation.handle).toBe('number') - const verify = anoncreds.verifyPresentation({ + const verify = NativeAnoncreds.instance.verifyPresentation({ presentation, presentationRequest, schemas: [schemaObj], @@ -581,13 +594,13 @@ describe('bindings', () => { revocationStatusLists: [revocationStatusList], }) - ok(verify) + expect(verify).toBeTruthy() }) test('create and verify w3c presentation', () => { - const nonce = anoncreds.generateNonce() + const nonce = NativeAnoncreds.instance.generateNonce() - const presentationRequest = anoncreds.presentationRequestFromJson({ + const presentationRequest = NativeAnoncreds.instance.presentationRequestFromJson({ json: JSON.stringify({ nonce, name: 'pres_req_1', @@ -608,9 +621,9 @@ describe('bindings', () => { }), }) - strictEqual(anoncreds.getTypeName({ objectHandle: presentationRequest }), 'PresentationRequest') + expect(NativeAnoncreds.instance.getTypeName({ objectHandle: presentationRequest })).toBe('PresentationRequest') - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -618,7 +631,7 @@ describe('bindings', () => { }) const { credentialDefinition, keyCorrectnessProof, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -628,7 +641,7 @@ describe('bindings', () => { }) const { revocationRegistryDefinition, revocationRegistryDefinitionPrivate } = - anoncreds.createRevocationRegistryDefinition({ + NativeAnoncreds.instance.createRevocationRegistryDefinition({ credentialDefinitionId: 'mock:uri', credentialDefinition, issuerId: 'mock:uri', @@ -637,13 +650,13 @@ describe('bindings', () => { maximumCredentialNumber: 10, }) - const tailsPath = anoncreds.revocationRegistryDefinitionGetAttribute({ + const tailsPath = NativeAnoncreds.instance.revocationRegistryDefinitionGetAttribute({ objectHandle: revocationRegistryDefinition, name: 'tails_location', }) const timeCreateRevStatusList = 12 - const revocationStatusList = anoncreds.createRevocationStatusList({ + const revocationStatusList = NativeAnoncreds.instance.createRevocationStatusList({ credentialDefinition, revocationRegistryDefinitionId: 'mock:uri', revocationRegistryDefinition, @@ -653,16 +666,16 @@ describe('bindings', () => { timestamp: timeCreateRevStatusList, }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequestMetadata, credentialRequest } = anoncreds.createCredentialRequest({ + const { credentialRequestMetadata, credentialRequest } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -670,7 +683,7 @@ describe('bindings', () => { credentialOffer, }) - const credential = anoncreds.createW3cCredential({ + const credential = NativeAnoncreds.instance.createW3cCredential({ credentialDefinition, credentialDefinitionPrivate, credentialOffer, @@ -686,7 +699,7 @@ describe('bindings', () => { encoding: undefined, }) - const credentialReceived = anoncreds.processW3cCredential({ + const credentialReceived = NativeAnoncreds.instance.processW3cCredential({ credential, credentialDefinition, credentialRequestMetadata, @@ -694,25 +707,25 @@ describe('bindings', () => { revocationRegistryDefinition, }) - const credentialProofDetails = anoncreds.w3cCredentialGetIntegrityProofDetails({ + const credentialProofDetails = NativeAnoncreds.instance.w3cCredentialGetIntegrityProofDetails({ objectHandle: credentialReceived, }) - const revRegIndex = anoncreds.w3cCredentialProofGetAttribute({ + const revRegIndex = NativeAnoncreds.instance.w3cCredentialProofGetAttribute({ objectHandle: credentialProofDetails, name: 'rev_reg_index', }) const revocationRegistryIndex = revRegIndex === null ? 0 : Number.parseInt(revRegIndex) - const revocationState = anoncreds.createOrUpdateRevocationState({ + const revocationState = NativeAnoncreds.instance.createOrUpdateRevocationState({ revocationRegistryDefinition, revocationStatusList, revocationRegistryIndex, tailsPath, }) - const presentation = anoncreds.createW3cPresentation({ + const presentation = NativeAnoncreds.instance.createW3cPresentation({ presentationRequest, credentials: [ { @@ -746,9 +759,9 @@ describe('bindings', () => { schemas: { 'mock:uri': schemaObj }, }) - ok(typeof presentation.handle === 'number') + expect(typeof presentation.handle).toBe('number') - const verify = anoncreds.verifyW3cPresentation({ + const verify = NativeAnoncreds.instance.verifyW3cPresentation({ presentation, presentationRequest, schemas: [schemaObj], @@ -760,11 +773,11 @@ describe('bindings', () => { revocationStatusLists: [revocationStatusList], }) - ok(verify) + expect(verify).toBeTruthy() }) test('create and verify presentation (no revocation use case)', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -772,7 +785,7 @@ describe('bindings', () => { }) const { credentialDefinition, keyCorrectnessProof, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -781,16 +794,16 @@ describe('bindings', () => { tag: 'TAG', }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequestMetadata, credentialRequest } = anoncreds.createCredentialRequest({ + const { credentialRequestMetadata, credentialRequest } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -798,7 +811,7 @@ describe('bindings', () => { credentialOffer, }) - const credential = anoncreds.createCredential({ + const credential = NativeAnoncreds.instance.createCredential({ credentialDefinition, credentialDefinitionPrivate, credentialOffer, @@ -806,29 +819,30 @@ describe('bindings', () => { attributeRawValues: { name: 'Alex', height: '175', age: '28', sex: 'male' }, }) - const credReceived = anoncreds.processCredential({ + const credReceived = NativeAnoncreds.instance.processCredential({ credential, credentialDefinition, credentialRequestMetadata, linkSecret, }) - const credJson = anoncreds.getJson({ objectHandle: credential }) - - strictEqual(JSON.parse(credJson).cred_def_id, 'mock:uri') - strictEqual(JSON.parse(credJson).schema_id, 'mock:uri') + const credJson = NativeAnoncreds.instance.getJson({ objectHandle: credential }) + const credParsed = JSON.parse(credJson) - const credReceivedJson = anoncreds.getJson({ objectHandle: credReceived }) + expect(credParsed.cred_def_id).toBe('mock:uri') + expect(credParsed.schema_id).toBe('mock:uri') - strictEqual(JSON.parse(credReceivedJson).cred_def_id, 'mock:uri') - strictEqual(JSON.parse(credReceivedJson).schema_id, 'mock:uri') + const credReceivedJson = NativeAnoncreds.instance.getJson({ objectHandle: credReceived }) + const credReceivedParsed = JSON.parse(credReceivedJson) - ok(JSON.parse(credReceivedJson).signature) - strictEqual(JSON.parse(credReceivedJson).witness, null) + expect(credReceivedParsed.cred_def_id).toBe('mock:uri') + expect(credReceivedParsed.schema_id).toBe('mock:uri') + expect(credReceivedParsed.signature).toBeDefined() + expect(credReceivedParsed.witness).toBeNull() - const nonce = anoncreds.generateNonce() + const nonce = NativeAnoncreds.instance.generateNonce() - const presentationRequest = anoncreds.presentationRequestFromJson({ + const presentationRequest = NativeAnoncreds.instance.presentationRequestFromJson({ json: JSON.stringify({ nonce, name: 'pres_req_1', @@ -854,7 +868,7 @@ describe('bindings', () => { }), }) - const presentation = anoncreds.createPresentation({ + const presentation = NativeAnoncreds.instance.createPresentation({ presentationRequest, credentials: [ { @@ -893,9 +907,9 @@ describe('bindings', () => { selfAttest: { attr3_referent: '8-800-300' }, }) - ok(typeof presentation.handle === 'number') + expect(typeof presentation.handle).toBe('number') - const verify = anoncreds.verifyPresentation({ + const verify = NativeAnoncreds.instance.verifyPresentation({ presentation, presentationRequest, schemas: [schemaObj], @@ -904,11 +918,11 @@ describe('bindings', () => { credentialDefinitionIds: ['mock:uri'], }) - ok(verify) + expect(verify).toBeTruthy() }) test('create and verify w3c presentation (no revocation use case)', () => { - const schemaObj = anoncreds.createSchema({ + const schemaObj = NativeAnoncreds.instance.createSchema({ name: 'schema-1', issuerId: 'mock:uri', version: '1', @@ -916,7 +930,7 @@ describe('bindings', () => { }) const { credentialDefinition, keyCorrectnessProof, credentialDefinitionPrivate } = - anoncreds.createCredentialDefinition({ + NativeAnoncreds.instance.createCredentialDefinition({ schemaId: 'mock:uri', issuerId: 'mock:uri', schema: schemaObj, @@ -925,16 +939,16 @@ describe('bindings', () => { tag: 'TAG', }) - const credentialOffer = anoncreds.createCredentialOffer({ + const credentialOffer = NativeAnoncreds.instance.createCredentialOffer({ schemaId: 'mock:uri', credentialDefinitionId: 'mock:uri', keyCorrectnessProof, }) - const linkSecret = anoncreds.createLinkSecret() + const linkSecret = NativeAnoncreds.instance.createLinkSecret() const linkSecretId = 'link secret id' - const { credentialRequestMetadata, credentialRequest } = anoncreds.createCredentialRequest({ + const { credentialRequestMetadata, credentialRequest } = NativeAnoncreds.instance.createCredentialRequest({ entropy: ENTROPY, credentialDefinition, linkSecret, @@ -942,7 +956,7 @@ describe('bindings', () => { credentialOffer, }) - const credential = anoncreds.createW3cCredential({ + const credential = NativeAnoncreds.instance.createW3cCredential({ credentialDefinition, credentialDefinitionPrivate, credentialOffer, @@ -950,16 +964,16 @@ describe('bindings', () => { attributeRawValues: { name: 'Alex', height: '175', age: '28', sex: 'male' }, }) - const credReceived = anoncreds.processW3cCredential({ + const credReceived = NativeAnoncreds.instance.processW3cCredential({ credential, credentialDefinition, credentialRequestMetadata, linkSecret, }) - const nonce = anoncreds.generateNonce() + const nonce = NativeAnoncreds.instance.generateNonce() - const presentationRequest = anoncreds.presentationRequestFromJson({ + const presentationRequest = NativeAnoncreds.instance.presentationRequestFromJson({ json: JSON.stringify({ nonce, name: 'pres_req_1', @@ -979,7 +993,7 @@ describe('bindings', () => { }), }) - const presentation = anoncreds.createW3cPresentation({ + const presentation = NativeAnoncreds.instance.createW3cPresentation({ presentationRequest, credentials: [ { @@ -1011,9 +1025,9 @@ describe('bindings', () => { schemas: { 'mock:uri': schemaObj }, }) - ok(typeof presentation.handle === 'number') + expect(typeof presentation.handle).toBe('number') - const verify = anoncreds.verifyW3cPresentation({ + const verify = NativeAnoncreds.instance.verifyW3cPresentation({ presentation, presentationRequest, schemas: [schemaObj], @@ -1022,6 +1036,6 @@ describe('bindings', () => { credentialDefinitionIds: ['mock:uri'], }) - ok(verify) + expect(verify).toBeTruthy() }) }) diff --git a/packages/anoncreds-nodejs/tests/setup.ts b/packages/anoncreds-nodejs/tests/setup.ts new file mode 100644 index 00000000..b59dba8b --- /dev/null +++ b/packages/anoncreds-nodejs/tests/setup.ts @@ -0,0 +1,2 @@ +// Register anoncreds +import '@hyperledger/anoncreds-nodejs' diff --git a/packages/anoncreds-shared/src/Anoncreds.ts b/packages/anoncreds-shared/src/Anoncreds.ts index 49530436..b62b2eb0 100644 --- a/packages/anoncreds-shared/src/Anoncreds.ts +++ b/packages/anoncreds-shared/src/Anoncreds.ts @@ -2,6 +2,7 @@ // This will make sure that when wrapping both methods to shared functionality import type { ObjectHandle } from './ObjectHandle' +import type { AnoncredsErrorObject } from './error' export type NativeCredentialEntry = { credential: ObjectHandle @@ -38,7 +39,7 @@ export type NativeCredentialRevocationConfig = { export type Anoncreds = { version(): string - getCurrentError(): string + getCurrentError(): AnoncredsErrorObject setDefaultLogger(): void generateNonce(): string diff --git a/packages/anoncreds-shared/src/api/Nonce.ts b/packages/anoncreds-shared/src/api/Nonce.ts new file mode 100644 index 00000000..98ec32b8 --- /dev/null +++ b/packages/anoncreds-shared/src/api/Nonce.ts @@ -0,0 +1,7 @@ +import { NativeAnoncreds } from "../register"; + +export class Nonce { + public static generate(): string { + return NativeAnoncreds.instance.generateNonce() + } +} diff --git a/packages/anoncreds-shared/src/api/index.ts b/packages/anoncreds-shared/src/api/index.ts index e5e3239c..15171d1b 100644 --- a/packages/anoncreds-shared/src/api/index.ts +++ b/packages/anoncreds-shared/src/api/index.ts @@ -8,6 +8,7 @@ export * from './CredentialOffer' export * from './CredentialRequest' export * from './CredentialRequestMetadata' export * from './LinkSecret' +export * from './Nonce' export * from './PresentationRequest' export * from './Presentation' export * from './Schema' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 458373f6..acf63d63 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,15 +15,21 @@ catalogs: '@types/node': specifier: ^20.12.11 version: 20.17.23 + koffi: + specifier: ^2.15.1 + version: 2.15.1 rimraf: specifier: ^5.0.5 version: 5.0.10 - tsx: - specifier: ^4.19.2 - version: 4.19.3 typescript: specifier: ~5.4.5 version: 5.4.5 + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4 + vitest: + specifier: ^4.0.12 + version: 4.0.18 importers: @@ -41,12 +47,15 @@ importers: rimraf: specifier: 'catalog:' version: 5.0.10 - tsx: - specifier: 'catalog:' - version: 4.19.3 typescript: specifier: 'catalog:' version: 5.4.5 + vite-tsconfig-paths: + specifier: 'catalog:' + version: 5.1.4(typescript@5.4.5)(vite@7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3)) + vitest: + specifier: 'catalog:' + version: 4.0.18(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3) examples/anoncreds-react-native-example: dependencies: @@ -81,34 +90,22 @@ importers: packages/anoncreds-nodejs: dependencies: - '@2060.io/ffi-napi': - specifier: ^4.0.9 - version: 4.0.9 - '@2060.io/ref-napi': - specifier: ^3.0.6 - version: 3.0.6 '@hyperledger/anoncreds-shared': specifier: workspace:* version: link:../anoncreds-shared - ref-array-di: - specifier: 1.2.2 - version: 1.2.2 - ref-struct-di: - specifier: 1.1.1 - version: 1.1.1 + koffi: + specifier: 'catalog:' + version: 2.15.1 devDependencies: '@types/node': specifier: 'catalog:' version: 20.17.23 - '@types/ref-array-di': - specifier: ^1.2.3 - version: 1.2.8 - '@types/ref-struct-di': - specifier: ^1.1.6 - version: 1.1.12 typescript: specifier: 'catalog:' version: 5.4.5 + vitest: + specifier: 'catalog:' + version: 4.0.18(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3) packages/anoncreds-react-native: dependencies: @@ -146,14 +143,6 @@ packages: graphql: optional: true - '@2060.io/ffi-napi@4.0.9': - resolution: {integrity: sha512-JfVREbtkJhMXSUpya3JCzDumdjeZDCKv4PemiWK+pts5CYgdoMidxeySVlFeF5pHqbBpox4I0Be7sDwAq4N0VQ==} - engines: {node: '>=18'} - - '@2060.io/ref-napi@3.0.6': - resolution: {integrity: sha512-8VAIXLdKL85E85jRYpPcZqATBL6fGnC/XjBGNeSgRSMJtrAMSmfRksqIq5AmuZkA2eeJXMWCiN6UQOUdozcymg==} - engines: {node: '>= 18.0'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -891,24 +880,28 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@1.9.4': resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@1.9.4': resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@1.9.4': resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@1.9.4': resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} @@ -983,153 +976,309 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.0': resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.0': resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {node: '>=0.10.0'} + engines: {'0': node >=0.10.0} '@expo/cli@0.22.18': resolution: {integrity: sha512-TWGKHWTYU9xE7YETPk2zQzLPl+bldpzZCa0Cqg0QeENpu03ZEnMxUqrgHwrbWGTf7ONTYC1tODBkFCFw/qgPGA==} @@ -1262,6 +1411,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -1356,6 +1508,144 @@ packages: '@types/react': optional: true + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + '@segment/loosely-validate-event@2.0.0': resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} @@ -1368,6 +1658,9 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1380,6 +1673,15 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1410,15 +1712,6 @@ packages: '@types/react@18.3.18': resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} - '@types/ref-array-di@1.2.8': - resolution: {integrity: sha512-+re5xrhRXDUR3sicMvN9N3C+6mklq5kd7FkN3ciRWio3BAvUDh2OEUTTG+619r10dqc6de25LIDtgpHtXCKGbA==} - - '@types/ref-napi@3.0.12': - resolution: {integrity: sha512-UZPKghRaLlWx2lPAphpdtYe62TbGBaPeqUM6gF1vI6FPRIu/Tff/WMAzpJRFU3jJIiD8HiXpVt2RjcFHtA6YRg==} - - '@types/ref-struct-di@1.1.12': - resolution: {integrity: sha512-R2RNkGIROGoJTbXYTXrsXybnsQD4iAy26ih/G6HCeCB9luWFQKkr537XGz0uGJ1kH8y8RMkdbQmD/wBulrOPHw==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1436,6 +1729,35 @@ packages: peerDependencies: '@urql/core': ^5.0.0 + '@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 + peerDependenciesMeta: + msw: + optional: true + 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==} + '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} @@ -1520,9 +1842,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-index@1.0.0: - resolution: {integrity: sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw==} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1530,6 +1849,10 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} @@ -1717,6 +2040,10 @@ packages: caniuse-lite@1.0.30001702: resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1865,10 +2192,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -2005,6 +2328,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2013,22 +2339,16 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - esbuild@0.25.0: resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} hasBin: true + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2048,15 +2368,14 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2065,9 +2384,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -2083,6 +2399,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + expo-asset@11.0.4: resolution: {integrity: sha512-CdIywU0HrR3wsW5c3n0cT3jW9hccZdnqGsRqY+EY/RWzJbDXtDfAQVEiFHO3mDK7oveUwrP2jK/6ZRNek41/sg==} peerDependencies: @@ -2147,9 +2467,6 @@ packages: exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2179,6 +2496,15 @@ packages: fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-retry@4.1.1: resolution: {integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==} @@ -2299,15 +2625,9 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-from-current-process-h@1.0.2: - resolution: {integrity: sha512-syloC6fsCt62ELLrr1VKBM1ggOpMdetX9hTrdW77UQdcApPHLmf7CI7OKcN1c9kYuNxKcDe4iJ4FY9sX3aw2xw==} - get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - get-uv-event-loop-napi-h@1.0.6: - resolution: {integrity: sha512-t5c9VNR84nRoF+eLiz6wFrEp1SE2Acg0wS+Ysa2zF0eROes+LzOfuTaVHxGy8AbS8rq7FHEJzjnCZo1BupwdJg==} - getenv@1.0.0: resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} engines: {node: '>=6'} @@ -2332,6 +2652,9 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2622,6 +2945,9 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + koffi@2.15.1: + resolution: {integrity: sha512-mnc0C0crx/xMSljb5s9QbnLrlFHprioFO1hkXyuSuO/QtbpLDa0l/uM21944UfQunMKmp3/r789DTDxVyyH6aA==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -2658,24 +2984,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.27.0: resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.27.0: resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.27.0: resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.27.0: resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} @@ -2734,6 +3064,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -2922,6 +3255,11 @@ packages: mz@2.7.0: 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} + hasBin: true + nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2941,15 +3279,9 @@ packages: nested-error-stacks@2.0.1: resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-addon-api@3.2.1: - resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -2967,10 +3299,6 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -3004,6 +3332,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -3138,6 +3469,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3149,6 +3483,10 @@ packages: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -3173,6 +3511,10 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -3278,12 +3620,6 @@ packages: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} - ref-array-di@1.2.2: - resolution: {integrity: sha512-jhCmhqWa7kvCVrWhR/d7RemkppqPUdxEil1CtTtm7FkZV8LcHHCK3Or9GinUiFP5WY3k0djUkMvhBhx49Jb2iA==} - - ref-struct-di@1.1.1: - resolution: {integrity: sha512-2Xyn/0Qgz89VT+++WP0sTosdm9oeowLP23wRJYhG4BFdMUrLj3jhwHZNEytYNYgtPKLNTP3KJX4HEgBvM1/Y2g==} - regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -3374,6 +3710,11 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3452,6 +3793,9 @@ packages: resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3505,6 +3849,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -3520,6 +3867,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} @@ -3646,6 +3996,21 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + 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'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -3667,6 +4032,16 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3691,9 +4066,6 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -3779,9 +4151,91 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@7.3.1: + 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' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + 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: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -3822,6 +4276,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wonka@6.3.5: resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} @@ -3928,26 +4387,6 @@ snapshots: '@0no-co/graphql.web@1.1.2': {} - '@2060.io/ffi-napi@4.0.9': - dependencies: - '@2060.io/ref-napi': 3.0.6 - debug: 4.4.0 - get-uv-event-loop-napi-h: 1.0.6 - node-addon-api: 3.2.1 - node-gyp-build: 4.8.4 - ref-struct-di: 1.1.1 - transitivePeerDependencies: - - supports-color - - '@2060.io/ref-napi@3.0.6': - dependencies: - debug: 4.4.0 - get-symbol-from-current-process-h: 1.0.2 - node-addon-api: 3.2.1 - node-gyp-build: 4.8.4 - transitivePeerDependencies: - - supports-color - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -5027,78 +5466,156 @@ snapshots: '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/aix-ppc64@0.27.3': + optional: true + '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm64@0.27.3': + optional: true + '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-arm@0.27.3': + optional: true + '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/android-x64@0.27.3': + optional: true + '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.27.3': + optional: true + '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/darwin-x64@0.27.3': + optional: true + '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.27.3': + optional: true + '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.27.3': + optional: true + '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm64@0.27.3': + optional: true + '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-arm@0.27.3': + optional: true + '@esbuild/linux-ia32@0.25.0': optional: true + '@esbuild/linux-ia32@0.27.3': + optional: true + '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-loong64@0.27.3': + optional: true + '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-mips64el@0.27.3': + optional: true + '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-ppc64@0.27.3': + optional: true + '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.27.3': + optional: true + '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-s390x@0.27.3': + optional: true + '@esbuild/linux-x64@0.25.0': optional: true + '@esbuild/linux-x64@0.27.3': + optional: true + '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-arm64@0.27.3': + optional: true + '@esbuild/netbsd-x64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.27.3': + optional: true + '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-arm64@0.27.3': + optional: true + '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.27.3': + optional: true + '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-arm64@0.27.3': + optional: true + '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-ia32@0.27.3': + optional: true + '@esbuild/win32-x64@0.25.0': optional: true + '@esbuild/win32-x64@0.27.3': + optional: true + '@expo/bunyan@4.0.1': dependencies: uuid: 8.3.2 @@ -5480,6 +5997,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -5670,6 +6189,81 @@ snapshots: optionalDependencies: '@types/react': 18.3.18 + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + '@segment/loosely-validate-event@2.0.0': dependencies: component-type: 1.2.2 @@ -5685,6 +6279,8 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@standard-schema/spec@1.1.0': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.9 @@ -5706,6 +6302,15 @@ snapshots: dependencies: '@babel/types': 7.26.9 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.13.9 @@ -5741,18 +6346,6 @@ snapshots: '@types/prop-types': 15.7.14 csstype: 3.1.3 - '@types/ref-array-di@1.2.8': - dependencies: - '@types/ref-napi': 3.0.12 - - '@types/ref-napi@3.0.12': - dependencies: - '@types/node': 20.17.23 - - '@types/ref-struct-di@1.1.12': - dependencies: - '@types/ref-napi': 3.0.12 - '@types/stack-utils@2.0.3': {} '@types/yargs-parser@21.0.3': {} @@ -5773,6 +6366,45 @@ snapshots: '@urql/core': 5.1.1 wonka: 6.3.5 + '@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 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + '@xmldom/xmldom@0.7.13': {} '@xmldom/xmldom@0.8.10': {} @@ -5836,17 +6468,12 @@ snapshots: argparse@2.0.1: {} - array-index@1.0.0: - dependencies: - debug: 2.6.9 - es6-symbol: 3.1.4 - transitivePeerDependencies: - - supports-color - array-union@2.1.0: {} asap@2.0.6: {} + assertion-error@2.0.1: {} + ast-types@0.15.2: dependencies: tslib: 2.8.1 @@ -6088,6 +6715,8 @@ snapshots: caniuse-lite@1.0.30001702: {} + chai@6.2.2: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -6249,11 +6878,6 @@ snapshots: csstype@3.1.3: {} - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - debug@2.6.9: dependencies: ms: 2.0.0 @@ -6357,6 +6981,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -6368,24 +6994,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - esbuild@0.25.0: optionalDependencies: '@esbuild/aix-ppc64': 0.25.0 @@ -6413,6 +7021,36 @@ snapshots: '@esbuild/win32-arm64': 0.25.0 '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 + optional: true + + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 escalade@3.2.0: {} @@ -6424,24 +7062,16 @@ snapshots: escape-string-regexp@4.0.0: {} - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - esprima@4.0.1: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} etag@1.8.1: {} - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-target-shim@5.0.1: {} exec-async@2.2.0: {} @@ -6468,6 +7098,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + expect-type@1.3.0: {} + expo-asset@11.0.4(expo@52.0.37(@babel/core@7.26.9)(@babel/preset-env@7.26.9(@babel/core@7.26.9))(react-native@0.76.7(@babel/core@7.26.9)(@babel/preset-env@7.26.9(@babel/core@7.26.9))(@types/react@18.3.18)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.26.9)(@babel/preset-env@7.26.9(@babel/core@7.26.9))(@types/react@18.3.18)(react@18.3.1))(react@18.3.1): dependencies: '@expo/image-utils': 0.6.5 @@ -6561,10 +7193,6 @@ snapshots: exponential-backoff@3.1.2: {} - ext@1.7.0: - dependencies: - type: 2.7.3 - extendable-error@0.1.7: {} external-editor@3.1.0: @@ -6611,6 +7239,10 @@ snapshots: transitivePeerDependencies: - encoding + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fetch-retry@4.1.1: {} fill-range@7.1.1: @@ -6744,15 +7376,10 @@ snapshots: get-stream@6.0.1: {} - get-symbol-from-current-process-h@1.0.2: {} - get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 - - get-uv-event-loop-napi-h@1.0.6: - dependencies: - get-symbol-from-current-process-h: 1.0.2 + optional: true getenv@1.0.0: {} @@ -6789,6 +7416,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globrex@0.1.2: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -7082,6 +7711,8 @@ snapshots: kleur@3.0.3: {} + koffi@2.15.1: {} + leven@3.1.0: {} lighthouse-logger@1.4.2: @@ -7173,6 +7804,10 @@ snapshots: dependencies: yallist: 3.1.1 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -7453,6 +8088,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.11: {} + nanoid@3.3.8: {} negotiator@0.6.3: {} @@ -7463,12 +8100,8 @@ snapshots: nested-error-stacks@2.0.1: {} - next-tick@1.1.0: {} - nice-try@1.0.5: {} - node-addon-api@3.2.1: {} - node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -7479,8 +8112,6 @@ snapshots: node-forge@1.3.1: {} - node-gyp-build@4.8.4: {} - node-int64@0.4.0: {} node-releases@2.0.19: {} @@ -7510,6 +8141,8 @@ snapshots: object-assign@4.1.1: {} + obug@2.1.1: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -7631,12 +8264,16 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@3.0.1: {} + picomatch@4.0.3: {} + pify@4.0.1: {} pirates@4.0.6: {} @@ -7659,6 +8296,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prettier@2.8.8: {} pretty-bytes@5.6.0: {} @@ -7860,19 +8503,6 @@ snapshots: source-map: 0.6.1 tslib: 2.8.1 - ref-array-di@1.2.2: - dependencies: - array-index: 1.0.0 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - - ref-struct-di@1.1.1: - dependencies: - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -7918,7 +8548,8 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} + resolve-pkg-maps@1.0.0: + optional: true resolve-workspace-root@2.0.0: {} @@ -7953,6 +8584,37 @@ snapshots: dependencies: glob: 10.4.5 + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -8047,6 +8709,8 @@ snapshots: shell-quote@1.8.2: {} + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -8093,6 +8757,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + stackframe@1.3.4: {} stacktrace-parser@0.1.11: @@ -8103,6 +8769,8 @@ snapshots: statuses@2.0.1: {} + std-env@3.10.0: {} + stream-buffers@2.2.0: {} string-width@4.2.3: @@ -8236,6 +8904,17 @@ snapshots: through@2.3.8: {} + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -8252,6 +8931,10 @@ snapshots: ts-interface-checker@0.1.13: {} + tsconfck@3.1.6(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + tslib@2.8.1: {} tsx@4.19.3: @@ -8260,6 +8943,7 @@ snapshots: get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 + optional: true type-detect@4.0.8: {} @@ -8269,8 +8953,6 @@ snapshots: type-fest@0.7.1: {} - type@2.7.3: {} - typescript@5.4.5: {} ua-parser-js@1.0.40: {} @@ -8328,6 +9010,69 @@ snapshots: vary@1.1.2: {} + vite-tsconfig-paths@5.1.4(typescript@5.4.5)(vite@7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.4.5) + optionalDependencies: + vite: 7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3) + transitivePeerDependencies: + - supports-color + - typescript + + vite@7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.17.23 + fsevents: 2.3.3 + lightningcss: 1.27.0 + terser: 5.39.0 + tsx: 4.19.3 + + vitest@4.0.18(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3)) + '@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 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@20.17.23)(lightningcss@1.27.0)(terser@5.39.0)(tsx@4.19.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.23 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vlq@1.0.1: {} walker@1.0.8: @@ -8365,6 +9110,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wonka@6.3.5: {} wrap-ansi@7.0.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 753c97bb..2b24556a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,11 +1,20 @@ packages: - - "packages/*" - - "examples/*" + - packages/* + - examples/* catalog: - typescript: ~5.4.5 - tsx: ^4.19.2 + '@biomejs/biome': 1.9.4 + '@changesets/cli': ^2.27.12 + '@types/node': ^20.12.11 + koffi: ^2.15.1 rimraf: ^5.0.5 - "@biomejs/biome": 1.9.4 - "@types/node": ^20.12.11 - "@changesets/cli": ^2.27.12 + typescript: ~5.4.5 + vite-tsconfig-paths: ^5.1.4 + vitest: ^4.0.12 + +ignoredBuiltDependencies: + - esbuild + +onlyBuiltDependencies: + - '@biomejs/biome' + - koffi diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..96697e11 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import viteTsConfigPaths from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [viteTsConfigPaths()], + test: { + testTimeout: 10000, + watch: false, + setupFiles: ['packages/anoncreds-nodejs/tests/setup.ts'], + }, +}) From d7533b4bd39321629067e9846211d4bb48a3d933 Mon Sep 17 00:00:00 2001 From: Berend Sliedrecht Date: Thu, 12 Feb 2026 14:40:53 +0100 Subject: [PATCH 2/2] docs(changeset): - Updated nodejs wrapper to support koffi - Include nodejs 24 support - Drop nodejs 18 support - Added `Nonce` class to generate a nonce - Now relying on vitest Signed-off-by: Berend Sliedrecht --- .changeset/moody-rockets-roll.md | 11 ++++ .github/workflows/ci.yml | 2 +- .../src/index.js | 1 - .../anoncreds-nodejs/src/ffi/serialize.ts | 66 ++----------------- .../anoncreds-nodejs/src/ffi/structures.ts | 17 ++++- packages/anoncreds-nodejs/src/index.ts | 1 - .../anoncreds-nodejs/src/library/bindings.ts | 26 ++++---- packages/anoncreds-nodejs/tests/api.test.ts | 9 +-- .../anoncreds-nodejs/tests/utils/index.ts | 1 - .../tests/utils/initialize.ts | 5 -- .../anoncreds/AnoncredsModule.java | 2 - .../anoncreds/AnoncredsPackage.java | 2 - .../src/ReactNativeAnoncreds.ts | 11 ++-- .../anoncreds-react-native/src/register.ts | 3 +- .../anoncreds-shared/src/AnoncredsObject.ts | 3 +- .../src/api/CredentialDefinition.ts | 6 +- .../src/api/CredentialOffer.ts | 6 +- .../src/api/CredentialRequest.ts | 6 +- .../src/api/CredentialRequestMetadata.ts | 3 +- packages/anoncreds-shared/src/api/Nonce.ts | 2 +- .../src/api/RevocationRegistry.ts | 5 +- .../src/api/RevocationRegistryDefinition.ts | 6 +- .../RevocationRegistryDefinitionPrivate.ts | 3 +- .../src/api/RevocationStatusList.ts | 6 +- packages/anoncreds-shared/src/api/Schema.ts | 3 +- .../anoncreds-shared/src/api/W3cCredential.ts | 10 ++- .../src/api/W3cPresentation.ts | 8 +-- vitest.config.ts | 2 +- 28 files changed, 77 insertions(+), 149 deletions(-) create mode 100644 .changeset/moody-rockets-roll.md delete mode 100644 packages/anoncreds-nodejs/tests/utils/index.ts delete mode 100644 packages/anoncreds-nodejs/tests/utils/initialize.ts diff --git a/.changeset/moody-rockets-roll.md b/.changeset/moody-rockets-roll.md new file mode 100644 index 00000000..464ff18b --- /dev/null +++ b/.changeset/moody-rockets-roll.md @@ -0,0 +1,11 @@ +--- +"@hyperledger/anoncreds-nodejs": minor +"@hyperledger/anoncreds-shared": minor +"@hyperledger/anoncreds-react-native": minor +--- + +- Updated nodejs wrapper to support koffi +- Include nodejs 24 support +- Drop nodejs 18 support +- Added `Nonce` class to generate a nonce +- Now relying on vitest diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab5bf14c..ed224894 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18, 20, 22] + node-version: [20, 22, 24] steps: - name: Checkout Repo diff --git a/examples/anoncreds-react-native-example/src/index.js b/examples/anoncreds-react-native-example/src/index.js index 88829005..d6a41718 100644 --- a/examples/anoncreds-react-native-example/src/index.js +++ b/examples/anoncreds-react-native-example/src/index.js @@ -1,5 +1,4 @@ import { registerRootComponent } from 'expo' - import { App } from './App' registerRootComponent(App) diff --git a/packages/anoncreds-nodejs/src/ffi/serialize.ts b/packages/anoncreds-nodejs/src/ffi/serialize.ts index 64c8b307..6b28d858 100644 --- a/packages/anoncreds-nodejs/src/ffi/serialize.ts +++ b/packages/anoncreds-nodejs/src/ffi/serialize.ts @@ -1,67 +1,11 @@ import { ObjectHandle } from '@hyperledger/anoncreds-shared' - import { i32ListToI32ListStruct, objectHandleListToObjectHandleListStruct, stringListToStringListStruct, } from './conversion' -import { ByteBufferStruct, I32ListStruct, StringListStruct } from './structures' - -type Argument = Record | unknown[] | Date | Uint8Array | SerializedArgument | boolean | ObjectHandle - -type SerializedArgument = string | number | Uint8Array | Record | null - -type SerializedArguments = Record - -export type SerializedOptions = Required<{ - [Property in keyof Type]: Type[Property] extends string - ? string - : Type[Property] extends number - ? number - : Type[Property] extends boolean - ? number - : Type[Property] extends boolean | undefined - ? number - : Type[Property] extends Record - ? string - : Type[Property] extends string[] - ? string[] - : Type[Property] extends string[] | undefined - ? string[] - : Type[Property] extends number[] - ? number[] - : Type[Property] extends number[] | undefined - ? number[] - : Type[Property] extends Date - ? number - : Type[Property] extends Date | undefined - ? number - : Type[Property] extends string | undefined - ? string - : Type[Property] extends number | undefined - ? number - : Type[Property] extends Uint8Array - ? Uint8Array - : Type[Property] extends ObjectHandle - ? number - : Type[Property] extends ObjectHandle[] - ? number[] - : Type[Property] extends ObjectHandle[] | undefined - ? number[] - : Type[Property] extends ObjectHandle | undefined - ? number - : Type[Property] extends Uint8Array - ? typeof ByteBufferStruct - : Type[Property] extends Uint8Array | undefined - ? typeof ByteBufferStruct - : Type[Property] extends unknown[] | undefined - ? string - : Type[Property] extends Record | undefined - ? string - : unknown -}> -const serialize = (arg: Argument): SerializedArgument => { +const serialize = (arg: unknown): unknown => { switch (typeof arg) { case 'undefined': return null @@ -94,12 +38,10 @@ const serialize = (arg: Argument): SerializedArgument => { } } -export const serializeArguments = = Record>( - args: T -): SerializedOptions => { - const retVal: SerializedArguments = {} +export const serializeArguments = = Record>(args: T) => { + const retVal: Record = {} for (const [key, val] of Object.entries(args)) { retVal[key] = serialize(val) } - return retVal as SerializedOptions + return retVal } diff --git a/packages/anoncreds-nodejs/src/ffi/structures.ts b/packages/anoncreds-nodejs/src/ffi/structures.ts index 750365ad..d9c262ce 100644 --- a/packages/anoncreds-nodejs/src/ffi/structures.ts +++ b/packages/anoncreds-nodejs/src/ffi/structures.ts @@ -16,11 +16,21 @@ export const StringListStruct = koffi.struct('StringListStruct', { data: koffi.pointer(FFI_STRING), }) +export type StringListStructType = { + count: number + data: string[] +} + export const I32ListStruct = koffi.struct('I32ListStruct', { count: FFI_USIZE, data: koffi.pointer(FFI_INT32), }) +export type I32ListStructType = { + count: number + data: number[] +} + export const CredRevInfoStruct = koffi.struct('CredRevInfoStruct', { reg_def: FFI_OBJECT_HANDLE, reg_def_private: FFI_OBJECT_HANDLE, @@ -51,11 +61,16 @@ export const CredentialProveStructList = koffi.struct('CredentialProveStructList data: koffi.pointer(CredentialProveStruct), }) -export const ObjectHandleList = koffi.struct('ObjectHandleList', { +export const ObjectHandleStructList = koffi.struct('ObjectHandleStructList', { count: FFI_USIZE, data: koffi.pointer(FFI_OBJECT_HANDLE), }) +export type ObjectHandleStructListType = { + count: number + data: number[] +} + export const NonrevokedIntervalOverrideStruct = koffi.struct('NonrevokedIntervalOverrideStruct', { rev_reg_def_id: FFI_STRING, requested_from_ts: FFI_INT32, diff --git a/packages/anoncreds-nodejs/src/index.ts b/packages/anoncreds-nodejs/src/index.ts index 1f17eaec..02da8fca 100644 --- a/packages/anoncreds-nodejs/src/index.ts +++ b/packages/anoncreds-nodejs/src/index.ts @@ -1,5 +1,4 @@ import { NativeAnoncreds } from '@hyperledger/anoncreds-shared' - import { NodeJSAnoncreds } from './NodeJSAnoncreds' export const anoncredsNodeJS = new NodeJSAnoncreds() diff --git a/packages/anoncreds-nodejs/src/library/bindings.ts b/packages/anoncreds-nodejs/src/library/bindings.ts index d55e8743..517c751e 100644 --- a/packages/anoncreds-nodejs/src/library/bindings.ts +++ b/packages/anoncreds-nodejs/src/library/bindings.ts @@ -12,7 +12,7 @@ import { FFI_VOID, I32ListStruct, NonrevokedIntervalOverrideStructList, - ObjectHandleList, + ObjectHandleStructList, StringListStruct, } from '../ffi' @@ -285,9 +285,9 @@ export const nativeBindings: Record { test('create and verify presentation', () => { @@ -344,8 +341,6 @@ describe('API', () => { }) test('create and verify presentation passing only JSON objects as parameters', () => { - setup() - const nonce = Nonce.generate() // a schema can be created from JSON @@ -534,8 +529,6 @@ test('create and verify presentation passing only JSON objects as parameters', ( }) describe('API W3C', () => { - beforeAll(setup) - test('create and verify w3c presentation', () => { const nonce = Nonce.generate() diff --git a/packages/anoncreds-nodejs/tests/utils/index.ts b/packages/anoncreds-nodejs/tests/utils/index.ts deleted file mode 100644 index 98ffa928..00000000 --- a/packages/anoncreds-nodejs/tests/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './initialize' diff --git a/packages/anoncreds-nodejs/tests/utils/initialize.ts b/packages/anoncreds-nodejs/tests/utils/initialize.ts deleted file mode 100644 index b6adb2af..00000000 --- a/packages/anoncreds-nodejs/tests/utils/initialize.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { registerAnoncreds } from '@hyperledger/anoncreds-shared' - -import { NodeJSAnoncreds } from '../../src/NodeJSAnoncreds' - -export const setup = () => registerAnoncreds({ lib: new NodeJSAnoncreds() }) diff --git a/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsModule.java b/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsModule.java index f2264f91..ab8537cc 100644 --- a/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsModule.java +++ b/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsModule.java @@ -1,12 +1,10 @@ package org.hyperledger.anoncreds; import android.util.Log; - import androidx.annotation.Keep; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.proguard.annotations.DoNotStrip; - import com.facebook.react.bridge.JavaScriptContextHolder; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactApplicationContext; diff --git a/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsPackage.java b/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsPackage.java index ce844af0..8084d137 100644 --- a/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsPackage.java +++ b/packages/anoncreds-react-native/android/src/main/java/org/hyperledger/anoncreds/AnoncredsPackage.java @@ -1,12 +1,10 @@ package org.hyperledger.anoncreds; import androidx.annotation.NonNull; - import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; - import java.util.Collections; import java.util.List; diff --git a/packages/anoncreds-react-native/src/ReactNativeAnoncreds.ts b/packages/anoncreds-react-native/src/ReactNativeAnoncreds.ts index 46955bd9..3a9a5801 100644 --- a/packages/anoncreds-react-native/src/ReactNativeAnoncreds.ts +++ b/packages/anoncreds-react-native/src/ReactNativeAnoncreds.ts @@ -6,11 +6,9 @@ import type { NativeCredentialRevocationConfig, NativeNonRevokedIntervalOverride, } from '@hyperledger/anoncreds-shared' +import { AnoncredsError, ObjectHandle } from '@hyperledger/anoncreds-shared' import type { NativeBindings } from './NativeBindings' import type { ReturnObject } from './serialize' - -import { AnoncredsError, ObjectHandle } from '@hyperledger/anoncreds-shared' - import { serializeArguments } from './serialize' export class ReactNativeAnoncreds implements Anoncreds { @@ -22,7 +20,7 @@ export class ReactNativeAnoncreds implements Anoncreds { private handleError({ errorCode, value }: ReturnObject): T { if (errorCode !== 0) { - throw new AnoncredsError(JSON.parse(this.getCurrentError()) as AnoncredsErrorObject) + throw new AnoncredsError(this.getCurrentError()) } return value as T @@ -72,8 +70,9 @@ export class ReactNativeAnoncreds implements Anoncreds { this.anoncreds.setDefaultLogger({}) } - public getCurrentError(): string { - return this.anoncreds.getCurrentError({}) + public getCurrentError(): AnoncredsErrorObject { + const error = this.anoncreds.getCurrentError({}) + return JSON.parse(error) as AnoncredsErrorObject } public generateNonce(): string { diff --git a/packages/anoncreds-react-native/src/register.ts b/packages/anoncreds-react-native/src/register.ts index eecbf8fa..4731a6d8 100644 --- a/packages/anoncreds-react-native/src/register.ts +++ b/packages/anoncreds-react-native/src/register.ts @@ -1,6 +1,5 @@ -import type { NativeBindings } from './NativeBindings' - import { NativeModules, Platform } from 'react-native' +import type { NativeBindings } from './NativeBindings' declare global { const _anoncreds: NativeBindings diff --git a/packages/anoncreds-shared/src/AnoncredsObject.ts b/packages/anoncreds-shared/src/AnoncredsObject.ts index 518b564c..bc698b1e 100644 --- a/packages/anoncreds-shared/src/AnoncredsObject.ts +++ b/packages/anoncreds-shared/src/AnoncredsObject.ts @@ -1,7 +1,6 @@ -import type { JsonObject } from './types' - import { ObjectHandle } from './ObjectHandle' import { NativeAnoncreds } from './register' +import type { JsonObject } from './types' export class AnoncredsObject { public handle: ObjectHandle diff --git a/packages/anoncreds-shared/src/api/CredentialDefinition.ts b/packages/anoncreds-shared/src/api/CredentialDefinition.ts index 3c29ec82..75a2a33a 100644 --- a/packages/anoncreds-shared/src/api/CredentialDefinition.ts +++ b/packages/anoncreds-shared/src/api/CredentialDefinition.ts @@ -1,9 +1,7 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' - +import type { JsonObject } from '../types' import { CredentialDefinitionPrivate } from './CredentialDefinitionPrivate' import { KeyCorrectnessProof } from './KeyCorrectnessProof' import { Schema } from './Schema' diff --git a/packages/anoncreds-shared/src/api/CredentialOffer.ts b/packages/anoncreds-shared/src/api/CredentialOffer.ts index 9edc09a2..4d903932 100644 --- a/packages/anoncreds-shared/src/api/CredentialOffer.ts +++ b/packages/anoncreds-shared/src/api/CredentialOffer.ts @@ -1,9 +1,7 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' - +import type { JsonObject } from '../types' import { KeyCorrectnessProof } from './KeyCorrectnessProof' import { pushToArray } from './utils' diff --git a/packages/anoncreds-shared/src/api/CredentialRequest.ts b/packages/anoncreds-shared/src/api/CredentialRequest.ts index 6871ee4e..bd68e9f8 100644 --- a/packages/anoncreds-shared/src/api/CredentialRequest.ts +++ b/packages/anoncreds-shared/src/api/CredentialRequest.ts @@ -1,9 +1,7 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' - +import type { JsonObject } from '../types' import { CredentialDefinition } from './CredentialDefinition' import { CredentialOffer } from './CredentialOffer' import { CredentialRequestMetadata } from './CredentialRequestMetadata' diff --git a/packages/anoncreds-shared/src/api/CredentialRequestMetadata.ts b/packages/anoncreds-shared/src/api/CredentialRequestMetadata.ts index 03d0b8bd..ef77996f 100644 --- a/packages/anoncreds-shared/src/api/CredentialRequestMetadata.ts +++ b/packages/anoncreds-shared/src/api/CredentialRequestMetadata.ts @@ -1,7 +1,6 @@ -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' import { NativeAnoncreds } from '../register' +import type { JsonObject } from '../types' export class CredentialRequestMetadata extends AnoncredsObject { public static fromJson(json: JsonObject) { diff --git a/packages/anoncreds-shared/src/api/Nonce.ts b/packages/anoncreds-shared/src/api/Nonce.ts index 98ec32b8..884d1183 100644 --- a/packages/anoncreds-shared/src/api/Nonce.ts +++ b/packages/anoncreds-shared/src/api/Nonce.ts @@ -1,4 +1,4 @@ -import { NativeAnoncreds } from "../register"; +import { NativeAnoncreds } from '../register' export class Nonce { public static generate(): string { diff --git a/packages/anoncreds-shared/src/api/RevocationRegistry.ts b/packages/anoncreds-shared/src/api/RevocationRegistry.ts index 698738ca..91ff5dd1 100644 --- a/packages/anoncreds-shared/src/api/RevocationRegistry.ts +++ b/packages/anoncreds-shared/src/api/RevocationRegistry.ts @@ -1,8 +1,7 @@ -import type { JsonObject } from '../types' -import type { RevocationRegistryDefinition } from './RevocationRegistryDefinition' - import { AnoncredsObject } from '../AnoncredsObject' import { NativeAnoncreds } from '../register' +import type { JsonObject } from '../types' +import type { RevocationRegistryDefinition } from './RevocationRegistryDefinition' export type UpdateRevocationRegistryOptions = { revocationRegistryDefinition: RevocationRegistryDefinition diff --git a/packages/anoncreds-shared/src/api/RevocationRegistryDefinition.ts b/packages/anoncreds-shared/src/api/RevocationRegistryDefinition.ts index b7f5d765..15f8b69a 100644 --- a/packages/anoncreds-shared/src/api/RevocationRegistryDefinition.ts +++ b/packages/anoncreds-shared/src/api/RevocationRegistryDefinition.ts @@ -1,9 +1,7 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' - +import type { JsonObject } from '../types' import { CredentialDefinition } from './CredentialDefinition' import { RevocationRegistryDefinitionPrivate } from './RevocationRegistryDefinitionPrivate' import { pushToArray } from './utils' diff --git a/packages/anoncreds-shared/src/api/RevocationRegistryDefinitionPrivate.ts b/packages/anoncreds-shared/src/api/RevocationRegistryDefinitionPrivate.ts index a35d566b..f468a601 100644 --- a/packages/anoncreds-shared/src/api/RevocationRegistryDefinitionPrivate.ts +++ b/packages/anoncreds-shared/src/api/RevocationRegistryDefinitionPrivate.ts @@ -1,7 +1,6 @@ -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' import { NativeAnoncreds } from '../register' +import type { JsonObject } from '../types' export class RevocationRegistryDefinitionPrivate extends AnoncredsObject { public static fromJson(json: JsonObject) { diff --git a/packages/anoncreds-shared/src/api/RevocationStatusList.ts b/packages/anoncreds-shared/src/api/RevocationStatusList.ts index 2cf89281..20e280a8 100644 --- a/packages/anoncreds-shared/src/api/RevocationStatusList.ts +++ b/packages/anoncreds-shared/src/api/RevocationStatusList.ts @@ -1,9 +1,7 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' - +import type { JsonObject } from '../types' import { CredentialDefinition } from './CredentialDefinition' import { RevocationRegistryDefinition } from './RevocationRegistryDefinition' import { RevocationRegistryDefinitionPrivate } from './RevocationRegistryDefinitionPrivate' diff --git a/packages/anoncreds-shared/src/api/Schema.ts b/packages/anoncreds-shared/src/api/Schema.ts index 8f4cac08..45da94af 100644 --- a/packages/anoncreds-shared/src/api/Schema.ts +++ b/packages/anoncreds-shared/src/api/Schema.ts @@ -1,7 +1,6 @@ -import type { JsonObject } from '../types' - import { AnoncredsObject } from '../AnoncredsObject' import { NativeAnoncreds } from '../register' +import type { JsonObject } from '../types' export type CreateSchemaOptions = { name: string diff --git a/packages/anoncreds-shared/src/api/W3cCredential.ts b/packages/anoncreds-shared/src/api/W3cCredential.ts index e583870d..e621d735 100644 --- a/packages/anoncreds-shared/src/api/W3cCredential.ts +++ b/packages/anoncreds-shared/src/api/W3cCredential.ts @@ -1,18 +1,16 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' -import type { CredentialRevocationConfig } from './CredentialRevocationConfig' -import type { RevocationStatusList } from './RevocationStatusList' - import { AnoncredsObject } from '../AnoncredsObject' +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' - +import type { JsonObject } from '../types' import { Credential } from './Credential' import { CredentialDefinition } from './CredentialDefinition' import { CredentialDefinitionPrivate } from './CredentialDefinitionPrivate' import { CredentialOffer } from './CredentialOffer' import { CredentialRequest } from './CredentialRequest' import { CredentialRequestMetadata } from './CredentialRequestMetadata' +import type { CredentialRevocationConfig } from './CredentialRevocationConfig' import { RevocationRegistryDefinition } from './RevocationRegistryDefinition' +import type { RevocationStatusList } from './RevocationStatusList' import { pushToArray } from './utils' export type CreateW3cCredentialOptions = { diff --git a/packages/anoncreds-shared/src/api/W3cPresentation.ts b/packages/anoncreds-shared/src/api/W3cPresentation.ts index ad1665d3..36349a77 100644 --- a/packages/anoncreds-shared/src/api/W3cPresentation.ts +++ b/packages/anoncreds-shared/src/api/W3cPresentation.ts @@ -1,12 +1,10 @@ -import type { ObjectHandle } from '../ObjectHandle' -import type { JsonObject } from '../types' -import type { CredentialProve, NonRevokedIntervalOverride } from './Presentation' - import { AnoncredsObject } from '../AnoncredsObject' - +import type { ObjectHandle } from '../ObjectHandle' import { NativeAnoncreds } from '../register' +import type { JsonObject } from '../types' import { CredentialDefinition } from './CredentialDefinition' import { CredentialRevocationState } from './CredentialRevocationState' +import type { CredentialProve, NonRevokedIntervalOverride } from './Presentation' import { PresentationRequest } from './PresentationRequest' import { RevocationRegistryDefinition } from './RevocationRegistryDefinition' import { RevocationStatusList } from './RevocationStatusList' diff --git a/vitest.config.ts b/vitest.config.ts index 96697e11..cc86ec2e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ plugins: [viteTsConfigPaths()], test: { - testTimeout: 10000, + testTimeout: 20000, watch: false, setupFiles: ['packages/anoncreds-nodejs/tests/setup.ts'], },