From e59016e77222b6dabaff3c7d76744728bfb270dd Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 27 Feb 2026 11:38:49 +0100 Subject: [PATCH 01/13] Merge branch 'release/openid4vc' --- .ci/runChecks.sh | 2 +- .dev/compose.openid4vc.yml | 68 + .dev/eudiplo-assets/service.db | Bin 0 -> 430080 bytes .../f5ccdd18-0f42-472d-a2c9-902d3b69ecae | Bin 0 -> 18069 bytes .dev/oid4vc-service-config.json | 19 + .github/workflows/test.yml | 12 + package-lock.json | 6940 +++++++++++------ package.json | 10 +- packages/app-runtime/package.json | 20 +- .../app-runtime/src/AppStringProcessor.ts | 35 +- .../src/extensibility/ui/IUIBridge.ts | 3 +- packages/app-runtime/test/lib/FakeUIBridge.ts | 8 + .../test/lib/MockUIBridge.matchers.ts | 29 + packages/app-runtime/test/lib/MockUIBridge.ts | 9 +- packages/app-runtime/test/tsconfig.json | 3 +- packages/consumption/package.json | 29 +- .../src/consumption/ConsumptionConfig.ts | 1 + .../src/consumption/ConsumptionController.ts | 14 +- .../consumption/ConsumptionControllerName.ts | 3 +- .../src/consumption/ConsumptionIds.ts | 1 + packages/consumption/src/modules/index.ts | 1 + .../modules/openid4vc/OpenId4VcController.ts | 132 + .../src/modules/openid4vc/index.ts | 7 + .../src/modules/openid4vc/local/BaseAgent.ts | 104 + .../local/EnmeshedHolderFileSystem.ts | 29 + .../EnmeshedHolderKeyManagmentService.ts | 404 + .../openid4vc/local/EnmeshedStorageService.ts | 130 + .../src/modules/openid4vc/local/Holder.ts | 181 + .../src/modules/openid4vc/local/KeyStorage.ts | 64 + .../local/OpenId4VciCredentialResponseJSON.ts | 7 + .../local/RequestedCredentialCache.ts | 43 + ...ferRequestItemProcessedByRecipientEvent.ts | 16 + .../src/modules/requests/events/index.ts | 1 + .../consumption/src/modules/requests/index.ts | 1 + ...hareCredentialOfferRequestItemProcessor.ts | 65 + .../outgoing/OutgoingRequestsController.ts | 3 +- packages/consumption/test/tsconfig.json | 3 +- .../src/attributes/AttributeValueTypes.ts | 8 + .../attributes/types/VerifiableCredential.ts | 69 + .../content/src/attributes/types/index.ts | 1 + packages/content/src/requests/RequestItem.ts | 15 +- packages/content/src/requests/items/index.ts | 1 + .../ShareCredentialOfferRequestItem.ts | 29 + packages/runtime/package.json | 26 +- packages/runtime/src/Runtime.ts | 5 + .../runtime/src/dataViews/DataViewExpander.ts | 38 + .../src/dataViews/content/RequestItemDVOs.ts | 7 + packages/runtime/src/events/EventProxy.ts | 13 +- ...ferRequestItemProcessedByRecipientEvent.ts | 15 + .../runtime/src/events/consumption/index.ts | 1 + .../src/extensibility/ConsumptionServices.ts | 14 +- .../facades/consumption/OpenId4VcFacade.ts | 25 + .../facades/consumption/index.ts | 1 + .../runtime/src/useCases/common/Schemas.ts | 756 +- .../runtime/src/useCases/consumption/index.ts | 1 + .../openid4vc/AcceptAuthorizationRequest.ts | 44 + .../openid4vc/ResolveAuthorizationRequest.ts | 63 + .../useCases/consumption/openid4vc/index.ts | 2 + .../test/consumption/openid4vc.test.ts | 339 + packages/runtime/test/customMatchers.ts | 5 +- .../test/lib/RuntimeServiceProvider.ts | 5 +- packages/runtime/test/tsconfig.json | 3 +- packages/tsconfig.base.json | 4 +- ...penid4vc+openid4vp+0.4.0+001+initial.patch | 13 + 64 files changed, 7538 insertions(+), 2362 deletions(-) create mode 100644 .dev/compose.openid4vc.yml create mode 100644 .dev/eudiplo-assets/service.db create mode 100644 .dev/eudiplo-assets/uploads/f5ccdd18-0f42-472d-a2c9-902d3b69ecae create mode 100644 .dev/oid4vc-service-config.json create mode 100644 packages/consumption/src/modules/openid4vc/OpenId4VcController.ts create mode 100644 packages/consumption/src/modules/openid4vc/index.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/BaseAgent.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/EnmeshedHolderFileSystem.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/EnmeshedHolderKeyManagmentService.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/EnmeshedStorageService.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/Holder.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/KeyStorage.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/OpenId4VciCredentialResponseJSON.ts create mode 100644 packages/consumption/src/modules/openid4vc/local/RequestedCredentialCache.ts create mode 100644 packages/consumption/src/modules/requests/events/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts create mode 100644 packages/consumption/src/modules/requests/itemProcessors/shareCredentialOffer/ShareCredentialOfferRequestItemProcessor.ts create mode 100644 packages/content/src/attributes/types/VerifiableCredential.ts create mode 100644 packages/content/src/requests/items/shareCredentialOffer/ShareCredentialOfferRequestItem.ts create mode 100644 packages/runtime/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts create mode 100644 packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts create mode 100644 packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts create mode 100644 packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts create mode 100644 packages/runtime/src/useCases/consumption/openid4vc/index.ts create mode 100644 packages/runtime/test/consumption/openid4vc.test.ts create mode 100644 patches/@openid4vc+openid4vp+0.4.0+001+initial.patch diff --git a/.ci/runChecks.sh b/.ci/runChecks.sh index 3192c5be4..27f95fd8d 100755 --- a/.ci/runChecks.sh +++ b/.ci/runChecks.sh @@ -6,4 +6,4 @@ npm run lint:eslint npm run lint:prettier npm run --workspaces cdep npx --workspaces license-check -npx better-npm-audit audit +npx better-npm-audit audit --exclude 1113371,1113402,1112030 diff --git a/.dev/compose.openid4vc.yml b/.dev/compose.openid4vc.yml new file mode 100644 index 000000000..cfa5b1378 --- /dev/null +++ b/.dev/compose.openid4vc.yml @@ -0,0 +1,68 @@ +name: runtime-oid4vc-tests + +services: + oid4vc-service: + image: ghcr.io/js-soft/openid4vc-service:3.0.1@sha256:17d35ee82a5c65c700e5b6f7922ea833717f1c16a515f60cf1ee7b36b524b32b + ports: + - "9000:9000" + platform: linux/amd64 + volumes: + - ./oid4vc-service-config.json:/usr/app/config.json + extra_hosts: + - "host.docker.internal:host-gateway" + depends_on: + - connector + - eudiplo + networks: + - default + + connector: + image: ghcr.io/nmshd/connector:7.4.0-openid4vc.2@sha256:d121f97ce2e4506a7ff58de0012b3445f6d0aeb8dd4d765c09da7f34d8a22b5b + environment: + CUSTOM_CONFIG_LOCATION: "/config.json" + transportLibrary__baseUrl: ${NMSHD_TEST_BASEURL} + transportLibrary__platformClientId: ${NMSHD_TEST_CLIENTID} + transportLibrary__platformClientSecret: ${NMSHD_TEST_CLIENTSECRET} + transportLibrary__addressGenerationHostnameOverride: ${NMSHD_TEST_ADDRESSGENERATIONHOSTNAMEOVERRIDE} + database__connectionString: mongodb://root:example@mongodb:27017 + infrastructure__httpServer__authentication__apiKey__keys__default__key: aVeryCoolApiKeyWith30CharactersOr+ + modules__autoAcceptPendingRelationships__enabled: true + modules__sync__enabled: true + modules__sync__interval: 1 + extra_hosts: + - "host.docker.internal:host-gateway" + depends_on: + - mongodb + networks: + - default + - local-test-backbone + + mongodb: + image: mongo@sha256:c23684919810f0341e58744987e4b1c510fb8becdae850217d2d04b6fa7605e7 + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: example + networks: + - default + + eudiplo: + image: ghcr.io/openwallet-foundation-labs/eudiplo:1.16.0 + environment: + - PUBLIC_URL=http://localhost:3000 + - JWT_SECRET="OgwrDcgVQQ2yZwcFt7kPxQm3nUF+X3etF6MdLTstZAY=" + - AUTH_CLIENT_ID="root" + - AUTH_CLIENT_SECRET="test" + - PORT=3000 + extra_hosts: + - "host.docker.internal:host-gateway" + ports: + - "3000:3000" + volumes: + - ./eudiplo-assets:/app/config + +networks: + default: + name: runtime-oid4vc-tests-network + local-test-backbone: + name: local-test-backbone + external: true diff --git a/.dev/eudiplo-assets/service.db b/.dev/eudiplo-assets/service.db new file mode 100644 index 0000000000000000000000000000000000000000..9255f0bdb5c16d2486bd91c58d7d4efc3dd656e4 GIT binary patch literal 430080 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

ku1hecCc!*fubWoSML)YR^;m;- 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

o2o}dO@aQtkhOdBqkm?$&#|F~5 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 F|Jj;`lhyzL literal 0 HcmV?d00001 diff --git a/.dev/oid4vc-service-config.json b/.dev/oid4vc-service-config.json new file mode 100644 index 000000000..9436ec638 --- /dev/null +++ b/.dev/oid4vc-service-config.json @@ -0,0 +1,19 @@ +{ + "port": 9000, + "baseUrl": "http://127.0.0.1:9000", + "mongodb": { + "host": "mongodb", + "port": 27017, + "user": "root", + "password": "example" + }, + "connector": { + "baseUrl": "http://connector:80", + "apiKey": "aVeryCoolApiKeyWith30CharactersOr+" + }, + "eudiplo": { + "baseUrl": "http://eudiplo:3000", + "clientId": "test-admin", + "clientSecret": "57c9cd444bf402b2cc1f5a0d2dafd3955bd9042c0372db17a4ede2d5fbda88e5" + } +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 097d53c27..a40f429e5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -119,6 +119,12 @@ jobs: - uses: actions/checkout@v6 - name: Start Backbone run: npm run start:backbone + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.GHCR_USER_FOR_OID4VC_SERVICE_PULL }} + password: ${{ secrets.GHCR_PAT_FOR_OID4VC_SERVICE_PULL }} - uses: actions/setup-node@v6 with: node-version-file: .nvmrc @@ -141,6 +147,12 @@ jobs: - uses: actions/checkout@v6 - name: Start Backbone run: npm run start:backbone + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.GHCR_USER_FOR_OID4VC_SERVICE_PULL }} + password: ${{ secrets.GHCR_PAT_FOR_OID4VC_SERVICE_PULL }} - uses: actions/setup-node@v6 with: node-version-file: .nvmrc diff --git a/package-lock.json b/package-lock.json index f958e1f18..1d50a85eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "name": "monorepo", + "hasInstallScript": true, "license": "AGPL-3.0-or-later", "workspaces": [ "packages/core-types", @@ -16,6 +17,8 @@ "packages/app-runtime" ], "devDependencies": { + "@babel/preset-env": "^7.29.0", + "@babel/preset-typescript": "^7.28.5", "@js-soft/eslint-config-ts": "^2.0.4", "@js-soft/license-check": "^1.0.10", "@types/jest": "^30.0.0", @@ -25,7 +28,8 @@ "jest": "^30.2.0", "jest-expect-message": "^1.1.3", "madge": "^8.0.0", - "npm-check-updates": "^19.6.2", + "npm-check-updates": "^19.4.1", + "patch-package": "^8.0.1", "prettier": "^3.8.1", "ts-jest": "^29.4.6", "ts-node": "^10.9.2", @@ -33,26 +37,125 @@ "typescript": "^5.9.3" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "dev": true, + "node_modules/@animo-id/mdoc": { + "version": "0.5.2", "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "compare-versions": "^6.1.1" + } + }, + "node_modules/@animo-id/pex": { + "version": "6.1.1", + "license": "Apache-2.0", + "dependencies": { + "@animo-id/mdoc": "^0.5.2", + "@astronautlabs/jsonpath": "^1.1.2", + "@sd-jwt/decode": "^0.7.2", + "@sd-jwt/present": "^0.7.2", + "@sd-jwt/types": "^0.7.2", + "@sphereon/pex-models": "^2.3.2", + "@sphereon/ssi-types": "0.33.0", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "jwt-decode": "^3.1.2", + "nanoid": "^3.3.7", + "uint8arrays": "^3.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" + } + }, + "node_modules/@animo-id/pex/node_modules/@sd-jwt/decode": { + "version": "0.7.2", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.7.2", + "@sd-jwt/utils": "0.7.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@animo-id/pex/node_modules/@sd-jwt/present": { + "version": "0.7.2", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/decode": "0.7.2", + "@sd-jwt/types": "0.7.2", + "@sd-jwt/utils": "0.7.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@animo-id/pex/node_modules/@sd-jwt/types": { + "version": "0.7.2", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@animo-id/pex/node_modules/@sd-jwt/utils": { + "version": "0.7.2", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.7.2", + "js-base64": "^3.7.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@animo-id/pex/node_modules/ajv": { + "version": "8.18.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@animo-id/pex/node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@animo-id/pex/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@animo-id/pex/node_modules/jwt-decode": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/@astronautlabs/jsonpath": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "static-eval": "2.0.2" } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -61,9 +164,7 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.29.0", "dev": true, "license": "MIT", "engines": { @@ -71,22 +172,20 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.29.0", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -101,39 +200,38 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", + "node_modules/@babel/generator": { + "version": "7.29.1", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -143,40 +241,97 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -185,20 +340,71 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -207,8 +413,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -217,23 +421,32 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -241,8 +454,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { @@ -255,94 +466,93 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "dev": true, "license": "MIT", "dependencies": { @@ -352,14 +562,98 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -370,8 +664,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -383,8 +675,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -396,8 +686,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -409,8 +697,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -422,8 +708,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -435,8 +719,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -448,8 +730,6 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -464,8 +744,6 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -479,13 +757,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -494,233 +770,1267 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@balena/dockerignore": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", - "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dependents/detective-less": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", - "integrity": "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", "dev": true, "license": "MIT", "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@credo-ts/core": { + "version": "0.6.2", + "license": "Apache-2.0", + "dependencies": { + "@animo-id/mdoc": "^0.5.2", + "@animo-id/pex": "^6.1.1", + "@astronautlabs/jsonpath": "^1.1.2", + "@digitalcredentials/jsonld": "^9.0.0", + "@digitalcredentials/jsonld-signatures": "^12.0.1", + "@digitalcredentials/vc": "^10.0.2", + "@multiformats/base-x": "^4.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/x509": "^1.14.3", + "@sd-jwt/core": "^0.19.0", + "@sd-jwt/decode": "^0.19.0", + "@sd-jwt/jwt-status-list": "^0.19.0", + "@sd-jwt/present": "^0.19.0", + "@sd-jwt/sd-jwt-vc": "^0.19.0", + "@sd-jwt/types": "^0.19.0", + "@sd-jwt/utils": "^0.19.0", + "@sphereon/pex-models": "^2.3.2", + "@sphereon/ssi-types": "0.33.0", + "@stablelib/ed25519": "^2.0.2", + "@types/ws": "^8.18.1", + "buffer": "^6.0.3", + "class-transformer": "0.5.1", + "class-validator": "^0.14.3", + "dcql": "^3.0.0", + "did-resolver": "^4.1.0", + "ec-compression": "0.0.1-alpha.12", + "lru_map": "^0.4.1", + "make-error": "^1.3.6", + "object-inspect": "^1.13.4", + "reflect-metadata": "0.2.2", + "rxjs": "^7.8.2", + "tsyringe": "^4.10.0", + "uuid": "^13.0.0", + "varint": "^6.0.0", + "web-did-resolver": "^2.0.32", + "webcrypto-core": "^1.8.1", + "zod": "^4.3.6" + } + }, + "node_modules/@credo-ts/core/node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@credo-ts/core/node_modules/uuid": { + "version": "13.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/@credo-ts/openid4vc": { + "version": "0.6.2", + "license": "Apache-2.0", + "dependencies": { + "@credo-ts/core": "0.6.2", + "@openid4vc/oauth2": "^0.4.5", + "@openid4vc/openid4vci": "^0.4.5", + "@openid4vc/openid4vp": "^0.4.5", + "@openid4vc/utils": "^0.4.5", + "@types/express": "^5.0.6", + "class-transformer": "0.5.1", + "express": "^5.2.1", + "rxjs": "^7.8.2", + "zod": "^4.3.6" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dependents/detective-less": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@digitalbazaar/security-context": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@digitalcredentials/credentials-v2-context": { + "version": "0.0.1-beta.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=18" + } + }, + "node_modules/@digitalcredentials/http-client": { + "version": "5.0.4", + "license": "BSD-3-Clause", + "dependencies": { + "ky": "^1.0.1", + "undici": "^6.6.2" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@digitalcredentials/jsonld": { + "version": "9.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalcredentials/http-client": "^5.0.1", + "canonicalize": "^1.0.1", + "lru-cache": "^6.0.0", + "rdf-canonize": "^3.4.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@digitalcredentials/jsonld-signatures": { + "version": "12.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalbazaar/security-context": "^1.0.0", + "@digitalcredentials/jsonld": "^9.0.0", + "fast-text-encoding": "^1.0.3", + "serialize-error": "^8.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@digitalcredentials/jsonld/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@digitalcredentials/jsonld/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/@digitalcredentials/open-badges-context": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@digitalcredentials/vc": { + "version": "10.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalcredentials/credentials-v2-context": "^0.0.1-beta.0", + "@digitalcredentials/jsonld": "^9.0.0", + "@digitalcredentials/jsonld-signatures": "^12.0.1", + "@digitalcredentials/open-badges-context": "^2.1.0", + "credentials-context": "^2.0.0", + "ed25519-signature-2018-context": "^1.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -730,8 +2040,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -752,30 +2060,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { "version": "9.39.3", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", @@ -791,8 +2075,6 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -801,8 +2083,6 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -813,43 +2093,228 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eudiplo/sdk-core": { + "version": "1.18.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@grpc/grpc-js": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz", - "integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==", + "version": "1.14.3", "dev": true, "license": "Apache-2.0", "dependencies": { - "@grpc/proto-loader": "^0.7.13", + "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { "node": ">=12.10.0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/grpc-js/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@grpc/grpc-js/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/grpc-js/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/grpc-js/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@grpc/grpc-js/node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@grpc/proto-loader/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -857,37 +2322,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -900,8 +2347,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -928,83 +2373,8 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", "dependencies": { @@ -1016,8 +2386,6 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1033,8 +2401,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -1043,8 +2409,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -1057,8 +2421,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -1071,8 +2433,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1084,8 +2444,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -1100,8 +2458,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -1113,21 +2469,12 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "dev": true, @@ -1138,8 +2485,6 @@ }, "node_modules/@jest/console": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1156,8 +2501,6 @@ }, "node_modules/@jest/core": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1204,8 +2547,6 @@ }, "node_modules/@jest/diff-sequences": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, "license": "MIT", "engines": { @@ -1214,8 +2555,6 @@ }, "node_modules/@jest/environment": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", "dependencies": { @@ -1230,8 +2569,6 @@ }, "node_modules/@jest/expect": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { @@ -1244,8 +2581,6 @@ }, "node_modules/@jest/expect-utils": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { @@ -1257,8 +2592,6 @@ }, "node_modules/@jest/fake-timers": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { @@ -1275,8 +2608,6 @@ }, "node_modules/@jest/get-type": { "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", "engines": { @@ -1285,8 +2616,6 @@ }, "node_modules/@jest/globals": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { @@ -1301,8 +2630,6 @@ }, "node_modules/@jest/pattern": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", "dev": true, "license": "MIT", "dependencies": { @@ -1315,8 +2642,6 @@ }, "node_modules/@jest/reporters": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1356,31 +2681,8 @@ } } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@jest/schemas": { "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1392,8 +2694,6 @@ }, "node_modules/@jest/snapshot-utils": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", "dependencies": { @@ -1408,8 +2708,6 @@ }, "node_modules/@jest/source-map": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, "license": "MIT", "dependencies": { @@ -1423,8 +2721,6 @@ }, "node_modules/@jest/test-result": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { @@ -1439,8 +2735,6 @@ }, "node_modules/@jest/test-sequencer": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1455,8 +2749,6 @@ }, "node_modules/@jest/transform": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { @@ -1482,8 +2774,6 @@ }, "node_modules/@jest/types": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1500,28 +2790,25 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", + "version": "0.3.13", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "dev": true, "license": "MIT", "engines": { @@ -1530,13 +2817,11 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "version": "0.3.31", "dev": true, "license": "MIT", "dependencies": { @@ -1544,10 +2829,19 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-joda/core": { + "version": "5.6.3", + "license": "BSD-3-Clause" + }, + "node_modules/@js-joda/timezone": { + "version": "2.3.0", + "license": "BSD-3-Clause", + "peerDependencies": { + "@js-joda/core": ">=1.11.0" + } + }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "dev": true, "license": "MIT", "funding": { @@ -1557,14 +2851,10 @@ }, "node_modules/@js-soft/docdb-access-abstractions": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@js-soft/docdb-access-abstractions/-/docdb-access-abstractions-1.3.0.tgz", - "integrity": "sha512-cpE1S5Cz/hb1cbdGEqKKhZJSmX2fhV6FjETzt84Ym/F0Itlv0liTe1sWxT9/vmvOUcKhgJeRM0np8zseRASctg==", "license": "MIT" }, "node_modules/@js-soft/docdb-access-loki": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@js-soft/docdb-access-loki/-/docdb-access-loki-1.4.0.tgz", - "integrity": "sha512-gJP3OhJJehy3gLrH8c1g4M3cdC/1ig+1hTcJNhJAqv/3TOHCURZy2DMDg8hiGqPeevAi3opRBaHs66EFKwGOMA==", "license": "MIT", "dependencies": { "@js-soft/docdb-access-abstractions": "1.3.0", @@ -1575,8 +2865,6 @@ }, "node_modules/@js-soft/docdb-access-mongo": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@js-soft/docdb-access-mongo/-/docdb-access-mongo-1.4.0.tgz", - "integrity": "sha512-rpvZNRn6pBoir4fVp/zWH7utIi/SytHsp7VpF1S/cSe8+R2W7o8FPYqZYy9RQngGPDskbvostoYUfD/GVaaf4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1587,14 +2875,10 @@ }, "node_modules/@js-soft/docdb-querytranslator": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@js-soft/docdb-querytranslator/-/docdb-querytranslator-1.1.6.tgz", - "integrity": "sha512-vZJnpdnWh7k6we68cW/HwBjqf1ryW6nTzyJoQixsh/0DZwiRnXsyi39c31CeUd7aIe9hLgmXfr3Dr/P1FlGJ5w==", "license": "MIT" }, "node_modules/@js-soft/eslint-config-ts": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@js-soft/eslint-config-ts/-/eslint-config-ts-2.0.4.tgz", - "integrity": "sha512-Jj9fzGCHrnZrQaixS8X8EgQ3fYo3O7oXWBwDH0d5CZda85nsaemXehguM7K8i5os5boNFgmo80shotHQGh6Ckw==", "dev": true, "license": "MIT", "dependencies": { @@ -1611,8 +2895,6 @@ }, "node_modules/@js-soft/license-check": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@js-soft/license-check/-/license-check-1.0.10.tgz", - "integrity": "sha512-LiAegSZ3YO2cRvtiYGaE0ESXiEFPRuOjc1i3Ajd2Bn7G5teYesya6Ws78UTNORoH2V882wI/vnhM+Vgne9uDhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1623,113 +2905,12 @@ "license-check": "bin/licenseCheck.js" } }, - "node_modules/@js-soft/license-check/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@js-soft/license-check/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@js-soft/license-check/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@js-soft/license-check/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@js-soft/license-check/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@js-soft/license-check/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/@js-soft/license-check/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, "node_modules/@js-soft/logging-abstractions": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@js-soft/logging-abstractions/-/logging-abstractions-1.0.2.tgz", - "integrity": "sha512-6pVLEW4biiPBUtGGfEo07kqUFWd6OllN542nspTBDrP4m5jkHhtXEswc2xqFtaYk01ZoO8olvPaf+OFt8kmeAw==", "license": "MIT" }, "node_modules/@js-soft/node-logger": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@js-soft/node-logger/-/node-logger-1.2.1.tgz", - "integrity": "sha512-5nV/+7pP+GNsjUmS16Dj1zcwN14pmBfKkHxndq26T5g7IAWt0JK4SLssX8jmFOMetedTeLF1O1C+GKBwLegrRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1741,8 +2922,6 @@ }, "node_modules/@js-soft/ts-serval": { "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@js-soft/ts-serval/-/ts-serval-2.0.16.tgz", - "integrity": "sha512-ZPLI/dcd6WOdiEdeYkaCt/BfkWMTlGE7TohUeLE8eLgBZpoVGtQRlQ8c1ScTSg5QiIOK2vNwtXrDMyioAhcGGg==", "license": "MIT", "dependencies": { "lodash": "^4.17.23", @@ -1751,8 +2930,6 @@ }, "node_modules/@js-soft/ts-utils": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@js-soft/ts-utils/-/ts-utils-2.3.5.tgz", - "integrity": "sha512-dPbjrqqfoCuIppIDgbcR5gy+DyU/KIuMFpBYwAGmpS65AEZGsXvPodIdSmQzQ/jh8kphPdMPfd493cRXZt23aA==", "license": "MIT", "dependencies": { "eventemitter2": "^6.4.9", @@ -1762,8 +2939,6 @@ }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "dev": true, "license": "MIT", "dependencies": { @@ -1771,31 +2946,84 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.1.tgz", - "integrity": "sha512-6nZrq5kfAz0POWyhljnbWQQJQ5uT8oE2ddX303q1uY0tWsivWKgBDXBBvuFPwOqRRalXJuVO9EjOdVtuhLX0zg==", + "version": "1.4.6", + "dev": true, + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@multiformats/base-x": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nmshd/app-runtime": { + "resolved": "packages/app-runtime", + "link": true + }, + "node_modules/@nmshd/connector-sdk": { + "version": "7.3.1", + "dev": true, + "license": "AGPL-3.0-or-later", + "dependencies": { + "@nmshd/content": "7.2.1", + "@nmshd/runtime-types": "7.2.1", + "axios": "^1.13.5", + "form-data": "^4.0.5", + "qs": "^6.14.1" + } + }, + "node_modules/@nmshd/connector-sdk/node_modules/@js-soft/ts-serval": { + "version": "2.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "reflect-metadata": "^0.2.2" + } + }, + "node_modules/@nmshd/connector-sdk/node_modules/@nmshd/content": { + "version": "7.2.1", "dev": true, - "license": "MIT", + "license": "AGPL-3.0-or-later", "dependencies": { - "sparse-bitfield": "^3.0.3" + "@js-soft/ts-serval": "2.0.15", + "@nmshd/core-types": "7.2.1", + "@nmshd/iql": "^1.0.4", + "ibantools": "^4.5.1", + "luxon": "^3.7.2", + "ts-simple-nameof": "^1.3.3" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "node_modules/@nmshd/connector-sdk/node_modules/@nmshd/core-types": { + "version": "7.2.1", "dev": true, - "license": "MIT", - "optional": true, + "license": "AGPL-3.0-or-later", "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/ts-serval": "2.0.15", + "@nmshd/crypto": "^2.1.3", + "json-stringify-safe": "^5.0.1", + "luxon": "^3.7.2" } }, - "node_modules/@nmshd/app-runtime": { - "resolved": "packages/app-runtime", - "link": true + "node_modules/@nmshd/connector-sdk/node_modules/@nmshd/runtime-types": { + "version": "7.2.1", + "dev": true, + "license": "AGPL-3.0-or-later" }, "node_modules/@nmshd/consumption": { "resolved": "packages/consumption", @@ -1811,8 +3039,6 @@ }, "node_modules/@nmshd/crypto": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nmshd/crypto/-/crypto-2.1.3.tgz", - "integrity": "sha512-lXnZezgLGDRHNz2o8DW8lwUeajcxB6FMMbiWCCvnYp/suzMpvVdN8bpn137RO0gZCaLrGVs3+IGBunj3xJyVPg==", "license": "MIT", "dependencies": { "libsodium-wrappers-sumo": "0.7.15", @@ -1821,8 +3047,6 @@ }, "node_modules/@nmshd/iql": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nmshd/iql/-/iql-1.0.4.tgz", - "integrity": "sha512-CxYKHWdiY7YV2hn5vEYLaGV3BzoHyAz4CJGh/iNu50/c+Ihc8Xc1yfhZsGsMyskEgtfUjOfCPx7y7jgmu7cdUQ==", "license": "MIT" }, "node_modules/@nmshd/runtime": { @@ -1839,18 +3063,47 @@ }, "node_modules/@nmshd/typescript-ioc": { "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@nmshd/typescript-ioc/-/typescript-ioc-3.2.5.tgz", - "integrity": "sha512-cFeUtUOBu2AZSIUllTRhQtm2NJ1krcL9ePaR1Z97ojxXb09LKiQAZjDdFGNVSKoEvPA7tvu1EEu7sXtDR2Ih6g==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", "reflect-metadata": "^0.2.2" } }, + "node_modules/@noble/ciphers": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@noble/hashes": "2.0.1" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@npmcli/agent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "dev": true, "license": "ISC", "dependencies": { @@ -1866,8 +3119,6 @@ }, "node_modules/@npmcli/agent/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -1875,78 +3126,88 @@ } }, "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "version": "5.0.0", "dev": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@npmcli/git": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.0.tgz", - "integrity": "sha512-vnz7BVGtOctJAIHouCJdvWBhsTVSICMeUgZo2c7XAi5d5Rrl80S1H7oPym7K03cRuinK5Q6s2dw36+PgXQTcMA==", + "version": "7.0.1", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "version": "4.0.0", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=20" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "version": "11.2.6", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.1", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/installed-package-contents": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", - "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "dev": true, "license": "ISC", "dependencies": { @@ -1960,20 +3221,8 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/installed-package-contents/node_modules/npm-normalize-package-bin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", - "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@npmcli/node-gyp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", - "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "dev": true, "license": "ISC", "engines": { @@ -1981,17 +3230,15 @@ } }, "node_modules/@npmcli/package-json": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.1.tgz", - "integrity": "sha512-956YUeI0YITbk2+KnirCkD19HLzES0habV+Els+dyZaVsaM6VGSiNwnRu6t3CZaqDLz4KXy2zx+0N/Zy6YjlAA==", + "version": "7.0.4", "dev": true, "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", - "glob": "^11.0.3", + "glob": "^13.0.0", "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" }, @@ -2001,8 +3248,6 @@ }, "node_modules/@npmcli/package-json/node_modules/balanced-match": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "dev": true, "license": "MIT", "engines": { @@ -2011,8 +3256,6 @@ }, "node_modules/@npmcli/package-json/node_modules/brace-expansion": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { @@ -2023,38 +3266,14 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "version": "13.0.5", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", + "minimatch": "^10.2.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, "engines": { "node": "20 || >=22" }, @@ -2063,35 +3282,29 @@ } }, "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "version": "11.2.6", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/package-json/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "2.0.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -2105,120 +3318,287 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@npmcli/package-json/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/promise-spawn": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", - "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "version": "9.0.1", "dev": true, "license": "ISC", "dependencies": { - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "version": "4.0.0", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=20" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.1", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "10.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "4.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "6.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@openid4vc/oauth2": { + "version": "0.4.6", + "license": "Apache-2.0", + "dependencies": { + "@openid4vc/utils": "0.4.6", + "zod": "^4.3.5" + } + }, + "node_modules/@openid4vc/openid4vci": { + "version": "0.4.6", + "license": "Apache-2.0", + "dependencies": { + "@openid4vc/oauth2": "0.4.6", + "@openid4vc/utils": "0.4.6", + "zod": "^4.3.5" + } + }, + "node_modules/@openid4vc/openid4vp": { + "version": "0.4.6", + "license": "Apache-2.0", + "dependencies": { + "@openid4vc/oauth2": "0.4.6", + "@openid4vc/utils": "0.4.6", + "zod": "^4.3.5" + } + }, + "node_modules/@openid4vc/utils": { + "version": "0.4.6", + "license": "Apache-2.0", + "dependencies": { + "buffer": "^6.0.3", + "zod": "^4.3.5", + "zod-validation-error": "^5.0.0" + } + }, + "node_modules/@openid4vc/utils/node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/@npmcli/run-script": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", - "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", - "dev": true, - "license": "ISC", + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.1", + "license": "MIT", "dependencies": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0", - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/@npmcli/run-script/node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", - "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", - "dev": true, - "license": "ISC", + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "license": "MIT", "dependencies": { - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" } }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" } }, - "node_modules/@npmcli/run-script/node_modules/proc-log": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", - "dev": true, - "license": "ISC", + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "license": "MIT", "dependencies": { - "isexe": "^4.0.0" + "tslib": "^2.0.0" }, - "bin": { - "node-which": "bin/which.js" + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=20.0.0" } }, "node_modules/@pkgjs/parseargs": { @@ -2232,8 +3612,6 @@ }, "node_modules/@pkgr/core": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -2245,36 +3623,26 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2284,43 +3652,110 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@sd-jwt/core": { + "version": "0.19.0", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/decode": "0.19.0", + "@sd-jwt/present": "0.19.0", + "@sd-jwt/types": "0.19.0", + "@sd-jwt/utils": "0.19.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sd-jwt/decode": { + "version": "0.19.0", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.19.0", + "@sd-jwt/utils": "0.19.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sd-jwt/jwt-status-list": { + "version": "0.19.0", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.19.0", + "@sd-jwt/utils": "0.19.0", + "pako": "^2.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sd-jwt/present": { + "version": "0.19.0", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/decode": "0.19.0", + "@sd-jwt/types": "0.19.0", + "@sd-jwt/utils": "0.19.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sd-jwt/sd-jwt-vc": { + "version": "0.19.0", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/core": "0.19.0", + "@sd-jwt/jwt-status-list": "0.19.0", + "@sd-jwt/utils": "0.19.0", + "zod": "^4.3.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sd-jwt/types": { + "version": "0.19.0", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@sd-jwt/utils": { + "version": "0.19.0", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.19.0", + "js-base64": "^3.7.8" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@sigstore/bundle": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", - "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2331,9 +3766,7 @@ } }, "node_modules/@sigstore/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.0.0.tgz", - "integrity": "sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==", + "version": "3.1.0", "dev": true, "license": "Apache-2.0", "engines": { @@ -2342,8 +3775,6 @@ }, "node_modules/@sigstore/protobuf-specs": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", - "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2351,17 +3782,15 @@ } }, "node_modules/@sigstore/sign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.0.1.tgz", - "integrity": "sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==", + "version": "4.1.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.2", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", "promise-retry": "^2.0.1" }, "engines": { @@ -2369,28 +3798,24 @@ } }, "node_modules/@sigstore/tuf": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.0.tgz", - "integrity": "sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==", + "version": "4.0.1", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.0.0" + "tuf-js": "^4.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/verify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.0.0.tgz", - "integrity": "sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==", + "version": "3.1.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { @@ -2398,16 +3823,12 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.34.38", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", - "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "version": "0.34.48", "dev": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2416,16 +3837,123 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" } }, + "node_modules/@sphereon/kmp-mdoc-core": { + "version": "0.2.0-SNAPSHOT.26", + "dependencies": { + "@js-joda/core": "5.6.3", + "@js-joda/timezone": "2.3.0", + "format-util": "^1.0.5" + } + }, + "node_modules/@sphereon/pex-models": { + "version": "2.3.2", + "license": "Apache-2.0" + }, + "node_modules/@sphereon/ssi-types": { + "version": "0.33.0", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "1.6.1", + "@sd-jwt/decode": "^0.9.2", + "@sphereon/kmp-mdoc-core": "0.2.0-SNAPSHOT.26", + "debug": "^4.3.5", + "events": "^3.3.0", + "jwt-decode": "^4.0.0", + "uint8arrays": "3.1.1" + } + }, + "node_modules/@sphereon/ssi-types/node_modules/@noble/hashes": { + "version": "1.6.1", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sphereon/ssi-types/node_modules/@sd-jwt/decode": { + "version": "0.9.2", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.9.2", + "@sd-jwt/utils": "0.9.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sphereon/ssi-types/node_modules/@sd-jwt/types": { + "version": "0.9.2", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sphereon/ssi-types/node_modules/@sd-jwt/utils": { + "version": "0.9.2", + "license": "Apache-2.0", + "dependencies": { + "@sd-jwt/types": "0.9.2", + "js-base64": "^3.7.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@stablelib/binary": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/int": "^2.0.1" + } + }, + "node_modules/@stablelib/ed25519": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "@stablelib/random": "^2.0.1", + "@stablelib/sha512": "^2.0.1", + "@stablelib/wipe": "^2.0.1" + } + }, + "node_modules/@stablelib/hash": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@stablelib/int": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/@stablelib/random": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/binary": "^2.0.1", + "@stablelib/wipe": "^2.0.1" + } + }, + "node_modules/@stablelib/sha512": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/binary": "^2.0.1", + "@stablelib/hash": "^2.0.0", + "@stablelib/wipe": "^2.0.1" + } + }, + "node_modules/@stablelib/wipe": { + "version": "2.0.1", + "license": "MIT" + }, "node_modules/@ts-graphviz/adapter": { - "version": "2.0.5", + "version": "2.0.6", "dev": true, "funding": [ { @@ -2439,14 +3967,14 @@ ], "license": "MIT", "dependencies": { - "@ts-graphviz/common": "^2.1.4" + "@ts-graphviz/common": "^2.1.5" }, "engines": { "node": ">=18" } }, "node_modules/@ts-graphviz/ast": { - "version": "2.0.5", + "version": "2.0.7", "dev": true, "funding": [ { @@ -2460,14 +3988,14 @@ ], "license": "MIT", "dependencies": { - "@ts-graphviz/common": "^2.1.4" + "@ts-graphviz/common": "^2.1.5" }, "engines": { "node": ">=18" } }, "node_modules/@ts-graphviz/common": { - "version": "2.1.4", + "version": "2.1.5", "dev": true, "funding": [ { @@ -2485,7 +4013,7 @@ } }, "node_modules/@ts-graphviz/core": { - "version": "2.0.5", + "version": "2.0.7", "dev": true, "funding": [ { @@ -2499,15 +4027,15 @@ ], "license": "MIT", "dependencies": { - "@ts-graphviz/ast": "^2.0.5", - "@ts-graphviz/common": "^2.1.4" + "@ts-graphviz/ast": "^2.0.7", + "@ts-graphviz/common": "^2.1.5" }, "engines": { "node": ">=18" } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", + "version": "1.0.12", "dev": true, "license": "MIT" }, @@ -2528,8 +4056,6 @@ }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, "license": "MIT", "engines": { @@ -2538,8 +4064,6 @@ }, "node_modules/@tufjs/models": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", - "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "dev": true, "license": "MIT", "dependencies": { @@ -2552,8 +4076,6 @@ }, "node_modules/@tufjs/models/node_modules/balanced-match": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "dev": true, "license": "MIT", "engines": { @@ -2562,8 +4084,6 @@ }, "node_modules/@tufjs/models/node_modules/brace-expansion": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { @@ -2574,16 +4094,14 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2602,8 +4120,6 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2616,8 +4132,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2626,8 +4140,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2637,18 +4149,37 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" } }, + "node_modules/@types/bn.js": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/docker-modem": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", - "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", "dev": true, "license": "MIT", "dependencies": { @@ -2658,8 +4189,6 @@ }, "node_modules/@types/dockerode": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-4.0.1.tgz", - "integrity": "sha512-cmUpB+dPN955PxBEuXE3f6lKO1hHiIGYJA46IVF3BJpNsZGvtBDcRnlrHYHtOH/B6vtDOyl2kZ2ShAu3mgc27Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2668,13 +4197,42 @@ "@types/ssh2": "*" } }, + "node_modules/@types/elliptic": { + "version": "6.4.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bn.js": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, + "node_modules/@types/express": { + "version": "5.0.6", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "dev": true, @@ -2698,8 +4256,6 @@ }, "node_modules/@types/jest": { "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "dev": true, "license": "MIT", "dependencies": { @@ -2730,8 +4286,6 @@ }, "node_modules/@types/luxon": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", - "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", "dev": true, "license": "MIT" }, @@ -2739,7 +4293,6 @@ "version": "24.10.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.15.tgz", "integrity": "sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -2747,15 +4300,34 @@ }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sjcl": { + "version": "1.0.34", "dev": true, "license": "MIT" }, "node_modules/@types/ssh2": { "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", - "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2763,7 +4335,7 @@ } }, "node_modules/@types/ssh2-streams": { - "version": "0.1.12", + "version": "0.1.13", "dev": true, "license": "MIT", "dependencies": { @@ -2771,9 +4343,7 @@ } }, "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.86", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.86.tgz", - "integrity": "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==", + "version": "18.19.130", "dev": true, "license": "MIT", "dependencies": { @@ -2782,8 +4352,6 @@ }, "node_modules/@types/ssh2/node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, "license": "MIT" }, @@ -2792,25 +4360,32 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/validator": { + "version": "13.15.10", + "license": "MIT" + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", "dev": true, "license": "MIT" }, "node_modules/@types/whatwg-url": { "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", "dev": true, "license": "MIT", "dependencies": { "@types/webidl-conversions": "*" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { - "version": "17.0.33", + "version": "17.0.35", "dev": true, "license": "MIT", "dependencies": { @@ -2824,8 +4399,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", - "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -2853,31 +4426,14 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/@typescript-eslint/parser": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", - "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { @@ -2901,8 +4457,6 @@ }, "node_modules/@typescript-eslint/project-service": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", - "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { @@ -2923,8 +4477,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", - "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { @@ -2941,8 +4493,6 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", - "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -2958,8 +4508,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", - "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { @@ -2981,23 +4529,8 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/@typescript-eslint/types": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", - "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -3010,8 +4543,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", - "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3036,23 +4567,41 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", "dev": true, "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=18.12" + "node": ">=16 || 14 >=14.17" }, - "peerDependencies": { - "typescript": ">=4.8.4" + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", - "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3075,8 +4624,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", - "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { @@ -3093,8 +4640,6 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3106,8 +4651,6 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, @@ -3295,8 +4838,6 @@ }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", "cpu": [ "x64" ], @@ -3382,8 +4923,6 @@ }, "node_modules/@vue/compiler-core": { "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", - "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3396,8 +4935,6 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", - "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", "dev": true, "license": "MIT", "dependencies": { @@ -3407,8 +4944,6 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", - "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", "dev": true, "license": "MIT", "dependencies": { @@ -3425,8 +4960,6 @@ }, "node_modules/@vue/compiler-ssr": { "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.28.tgz", - "integrity": "sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==", "dev": true, "license": "MIT", "dependencies": { @@ -3436,11 +4969,14 @@ }, "node_modules/@vue/shared": { "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", - "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", "dev": true, "license": "MIT" }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/abbrev": { "version": "1.1.1", "dev": true, @@ -3457,10 +4993,40 @@ "node": ">=6.5" } }, + "node_modules/accepts": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", "dev": true, "license": "MIT", "bin": { @@ -3472,8 +5038,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3481,17 +5045,18 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", + "version": "8.3.5", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -3499,9 +5064,7 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.12.6", "dev": true, "license": "MIT", "dependencies": { @@ -3517,8 +5080,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3534,8 +5095,6 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3550,14 +5109,10 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3570,25 +5125,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { - "version": "5.0.1", + "version": "6.2.2", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3624,8 +5169,6 @@ }, "node_modules/app-module-path": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -3686,29 +5229,8 @@ "ieee754": "^1.2.1" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.5.2", + "version": "4.7.0", "dev": true, "license": "MIT", "dependencies": { @@ -3746,7 +5268,7 @@ } }, "node_modules/archiver/node_modules/readable-stream": { - "version": "4.5.2", + "version": "4.7.0", "dev": true, "license": "MIT", "dependencies": { @@ -3767,8 +5289,6 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, @@ -3793,10 +5313,20 @@ "safer-buffer": "~2.1.0" } }, + "node_modules/asn1js": { + "version": "3.0.7", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/ast-module-types": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.1.tgz", - "integrity": "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==", "dev": true, "license": "MIT", "engines": { @@ -3804,7 +5334,7 @@ } }, "node_modules/async": { - "version": "3.2.5", + "version": "3.2.6", "dev": true, "license": "MIT" }, @@ -3819,8 +5349,6 @@ }, "node_modules/axios": { "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -3829,14 +5357,20 @@ } }, "node_modules/b4a": { - "version": "1.6.7", + "version": "1.7.5", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/babel-jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", - "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", "dependencies": { @@ -3857,8 +5391,6 @@ }, "node_modules/babel-plugin-istanbul": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", "workspaces": [ @@ -3877,8 +5409,6 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", - "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", "dependencies": { @@ -3888,10 +5418,44 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -3917,8 +5481,6 @@ }, "node_modules/babel-preset-jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", - "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3938,24 +5500,29 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.8.2", "dev": true, "license": "Apache-2.0", - "optional": true + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/bare-fs": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", - "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", + "version": "4.5.4", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -3970,9 +5537,7 @@ } }, "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "version": "3.6.2", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3982,8 +5547,6 @@ }, "node_modules/bare-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3992,14 +5555,13 @@ } }, "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "version": "2.8.0", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "streamx": "^2.21.0" + "streamx": "^2.21.0", + "teex": "^1.0.1" }, "peerDependencies": { "bare-buffer": "*", @@ -4014,9 +5576,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.3.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", - "dev": true, "funding": [ { "type": "github", @@ -4033,6 +5603,17 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "dev": true, @@ -4051,13 +5632,53 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bn.js": { + "version": "4.12.3", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "1.1.12", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -4071,10 +5692,12 @@ "node": ">=8" } }, + "node_modules/brorand": { + "version": "1.1.0", + "license": "MIT" + }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.28.1", "dev": true, "funding": [ { @@ -4092,10 +5715,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -4124,9 +5748,7 @@ } }, "node_modules/bson": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-7.0.0.tgz", - "integrity": "sha512-Kwc6Wh4lQ5OmkqqKhYGKIuELXl+EPYSCObVE6bWsp1T/cGkOCBN0I8wF/T44BiuhHyNi1mmKVPXk60d41xZ7kw==", + "version": "7.2.0", "dev": true, "license": "Apache-2.0", "engines": { @@ -4166,13 +5788,11 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/buildcheck": { - "version": "0.0.6", + "version": "0.0.7", "dev": true, "optional": true, "engines": { @@ -4187,24 +5807,29 @@ "node": ">=0.10.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cacache": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.1.tgz", - "integrity": "sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==", + "version": "20.0.3", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^11.0.3", + "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", - "unique-filename": "^4.0.0" + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -4212,8 +5837,6 @@ }, "node_modules/cacache/node_modules/balanced-match": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "dev": true, "license": "MIT", "engines": { @@ -4222,8 +5845,6 @@ }, "node_modules/cacache/node_modules/brace-expansion": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { @@ -4234,22 +5855,14 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "version": "13.0.5", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", + "minimatch": "^10.2.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { "node": "20 || >=22" }, @@ -4257,67 +5870,62 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "node_modules/cacache/node_modules/lru-cache": { + "version": "11.2.6", "dev": true, "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, "engines": { "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "node_modules/cacache/node_modules/minimatch": { + "version": "10.2.1", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, "engines": { "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "node_modules/cacache/node_modules/path-scurry": { + "version": "2.0.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "node_modules/call-bind": { + "version": "1.0.8", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4328,11 +5936,11 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", + "version": "1.0.4", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -4351,8 +5959,6 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -4360,9 +5966,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001724", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "version": "1.0.30001770", "dev": true, "funding": [ { @@ -4380,6 +5984,10 @@ ], "license": "CC-BY-4.0" }, + "node_modules/canonicalize": { + "version": "1.0.8", + "license": "Apache-2.0" + }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -4397,8 +6005,6 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -4407,8 +6013,6 @@ }, "node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -4416,9 +6020,7 @@ } }, "node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.4.0", "dev": true, "funding": [ { @@ -4432,12 +6034,23 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", - "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", + "version": "2.2.0", "dev": true, "license": "MIT" }, + "node_modules/class-transformer": { + "version": "0.5.1", + "license": "MIT" + }, + "node_modules/class-validator": { + "version": "0.14.3", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "dev": true, @@ -4461,29 +6074,61 @@ } }, "node_modules/cliui": { - "version": "8.0.1", + "version": "9.0.1", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", + "version": "9.0.2", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -4499,8 +6144,6 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -4509,9 +6152,7 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", "dev": true, "license": "MIT" }, @@ -4554,6 +6195,10 @@ "dev": true, "license": "MIT" }, + "node_modules/compare-versions": { + "version": "6.1.1", + "license": "MIT" + }, "node_modules/compress-commons": { "version": "6.0.2", "dev": true, @@ -4593,7 +6238,7 @@ } }, "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.5.2", + "version": "4.7.0", "dev": true, "license": "MIT", "dependencies": { @@ -4612,11 +6257,55 @@ "dev": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "dev": true, @@ -4690,7 +6379,7 @@ } }, "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.5.2", + "version": "4.7.0", "dev": true, "license": "MIT", "dependencies": { @@ -4709,10 +6398,19 @@ "dev": true, "license": "MIT" }, + "node_modules/credentials-context": { + "version": "2.0.0", + "license": "SEE LICENSE IN LICENSE.md" + }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -4732,11 +6430,15 @@ "node": ">=4.0" } }, + "node_modules/dcql": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "valibot": "1.2.0" + } + }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4759,9 +6461,7 @@ } }, "node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "version": "1.7.1", "dev": true, "license": "MIT", "peerDependencies": { @@ -4783,15 +6483,10 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -4809,6 +6504,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "license": "MIT", @@ -4816,10 +6527,15 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dependency-tree": { "version": "11.3.0", - "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.3.0.tgz", - "integrity": "sha512-T893F3p48rblazo45S/5jkFEvU8mzZ8obtNSyP2S1QCA8e9PpVH+hIakHnQYdnhitwQ8wo9btYJpQxnjiGm0Qg==", "dev": true, "license": "MIT", "dependencies": { @@ -4845,8 +6561,6 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -4855,8 +6569,6 @@ }, "node_modules/detective-amd": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.1.tgz", - "integrity": "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==", "dev": true, "license": "MIT", "dependencies": { @@ -4874,8 +6586,6 @@ }, "node_modules/detective-cjs": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.1.tgz", - "integrity": "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==", "dev": true, "license": "MIT", "dependencies": { @@ -4888,8 +6598,6 @@ }, "node_modules/detective-es6": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.1.tgz", - "integrity": "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==", "dev": true, "license": "MIT", "dependencies": { @@ -4901,8 +6609,6 @@ }, "node_modules/detective-postcss": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", - "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4918,8 +6624,6 @@ }, "node_modules/detective-sass": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", - "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", "dev": true, "license": "MIT", "dependencies": { @@ -4932,8 +6636,6 @@ }, "node_modules/detective-scss": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", - "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", "dev": true, "license": "MIT", "dependencies": { @@ -4946,8 +6648,6 @@ }, "node_modules/detective-stylus": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", - "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", "dev": true, "license": "MIT", "engines": { @@ -4956,8 +6656,6 @@ }, "node_modules/detective-typescript": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.0.0.tgz", - "integrity": "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==", "dev": true, "license": "MIT", "dependencies": { @@ -4974,8 +6672,6 @@ }, "node_modules/detective-vue2": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.2.0.tgz", - "integrity": "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==", "dev": true, "license": "MIT", "dependencies": { @@ -5003,10 +6699,12 @@ "wrappy": "1" } }, + "node_modules/did-resolver": { + "version": "4.1.0", + "license": "Apache-2.0" + }, "node_modules/diff": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5015,8 +6713,6 @@ }, "node_modules/docker-compose": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.3.1.tgz", - "integrity": "sha512-rF0wH69G3CCcmkN9J1RVMQBaKe8o77LT/3XmqcLIltWWVxcWAzp2TnO7wS3n/umZHN3/EVrlT3exSBMal+Ou1w==", "dev": true, "license": "MIT", "dependencies": { @@ -5028,8 +6724,6 @@ }, "node_modules/docker-modem": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", - "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5044,8 +6738,6 @@ }, "node_modules/dockerode": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.9.tgz", - "integrity": "sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5063,15 +6755,11 @@ }, "node_modules/dockerode/node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "license": "ISC" }, "node_modules/dockerode/node_modules/tar-fs": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5083,8 +6771,6 @@ }, "node_modules/dockerode/node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5100,8 +6786,6 @@ }, "node_modules/dockerode/node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -5129,17 +6813,37 @@ "dev": true, "license": "MIT" }, + "node_modules/ec-compression": { + "version": "0.0.1-alpha.12" + }, + "node_modules/ed25519-signature-2018-context": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.171", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", - "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "version": "1.5.286", "dev": true, "license": "ISC" }, + "node_modules/elliptic": { + "version": "6.6.1", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -5150,15 +6854,19 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", + "version": "9.2.2", "dev": true, "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5166,9 +6874,7 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", "dev": true, "license": "MIT", "dependencies": { @@ -5177,8 +6883,6 @@ }, "node_modules/enhanced-publish": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/enhanced-publish/-/enhanced-publish-1.1.7.tgz", - "integrity": "sha512-i+AeJYrsYASJbHvNvMI1ognqGuat8mHRDpHcjnGvq9cGPjphBiMtwjjr16DrDEkmx0RnhZwQlTeutKdN+dKV3g==", "dev": true, "license": "MIT", "dependencies": { @@ -5190,8 +6894,6 @@ }, "node_modules/enhanced-resolve": { "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "license": "MIT", "dependencies": { @@ -5204,8 +6906,6 @@ }, "node_modules/entities": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5217,8 +6917,6 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -5227,15 +6925,11 @@ }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "license": "MIT" }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5287,10 +6981,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -5302,8 +6998,6 @@ }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5384,8 +7078,6 @@ }, "node_modules/eslint-plugin-chai-expect": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-3.1.0.tgz", - "integrity": "sha512-a9F8b38hhJsR7fgDEfyMxppZXCnCW6OOHj7cQfygsm9guXqdSzfpwrHX5FT93gSExDqD71HQglF1lLkGBwhJ+g==", "dev": true, "license": "MIT", "engines": { @@ -5397,8 +7089,6 @@ }, "node_modules/eslint-plugin-chai-friendly": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-1.1.0.tgz", - "integrity": "sha512-+T1rClpDdXkgBAhC16vRQMI5umiWojVqkj9oUTdpma50+uByCZM/oBfxitZiOkjMRlm725mwFfz/RVgyDRvCKA==", "dev": true, "license": "MIT", "engines": { @@ -5410,8 +7100,6 @@ }, "node_modules/eslint-plugin-jest": { "version": "29.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.0.tgz", - "integrity": "sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA==", "dev": true, "license": "MIT", "dependencies": { @@ -5440,8 +7128,6 @@ }, "node_modules/eslint-plugin-mocha": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.2.0.tgz", - "integrity": "sha512-nMdy3tEXZac8AH5Z/9hwUkSfWu8xHf4XqwB5UEQzyTQGKcNlgFeciRAjLjliIKC3dR1Ex/a2/5sqgQzvYRkkkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5454,8 +7140,6 @@ }, "node_modules/eslint-plugin-mocha/node_modules/globals": { "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, "license": "MIT", "engines": { @@ -5467,8 +7151,6 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5483,31 +7165,7 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5517,23 +7175,8 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5548,22 +7191,8 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5574,9 +7203,7 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5588,8 +7215,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5609,19 +7234,23 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "dev": true, @@ -5636,16 +7265,21 @@ }, "node_modules/events": { "version": "3.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/eventsource": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", - "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -5655,9 +7289,7 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", - "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "version": "3.0.6", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -5665,8 +7297,6 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -5687,10 +7317,13 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, "node_modules/exit-x": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, "license": "MIT", "engines": { @@ -5699,8 +7332,6 @@ }, "node_modules/expect": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", "dependencies": { @@ -5712,16 +7343,76 @@ "jest-util": "30.2.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -5742,13 +7433,24 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "license": "Apache-2.0" + }, "node_modules/fast-uri": { - "version": "3.0.3", + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "BSD-3-Clause" }, "node_modules/fb-watchman": { @@ -5761,8 +7463,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5774,8 +7474,6 @@ }, "node_modules/filing-cabinet": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.1.0.tgz", - "integrity": "sha512-xA3nKuR0N762AtUloSEbq4T+tOqNf1rZ3vgPW8Sijurqz9rvArjTpZhfrV1OxSrhX6OUoDGAONXo6liKZTNXKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5800,8 +7498,6 @@ }, "node_modules/filing-cabinet/node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { @@ -5819,10 +7515,27 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -5836,10 +7549,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -5851,14 +7570,12 @@ } }, "node_modules/flatted": { - "version": "3.3.1", + "version": "3.3.3", "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -5877,8 +7594,6 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { @@ -5892,21 +7607,8 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5919,30 +7621,44 @@ "node": ">= 6" } }, + "node_modules/format-util": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true, "license": "MIT" }, "node_modules/fs-extra": { - "version": "8.1.0", + "version": "10.1.0", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" } }, "node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "license": "ISC", "dependencies": { @@ -5989,8 +7705,6 @@ }, "node_modules/get-amd-module-type": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", - "integrity": "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6010,9 +7724,7 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", "dev": true, "license": "MIT", "engines": { @@ -6023,15 +7735,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", + "version": "1.3.0", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -6046,15 +7758,11 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true, "license": "ISC" }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -6063,8 +7771,6 @@ }, "node_modules/get-port": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "dev": true, "license": "MIT", "engines": { @@ -6087,8 +7793,6 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -6099,19 +7803,19 @@ } }, "node_modules/glob": { - "version": "7.2.3", + "version": "10.5.0", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6119,8 +7823,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -6131,32 +7833,29 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "2.0.2", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "9.0.5", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -6168,8 +7867,6 @@ }, "node_modules/gonzales-pe": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6199,8 +7896,6 @@ }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6227,6 +7922,17 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "license": "MIT", @@ -6250,6 +7956,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hash.js": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.2", "license": "MIT", @@ -6260,10 +7974,17 @@ "node": ">= 0.4" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/hosted-git-info": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, "license": "ISC", "dependencies": { @@ -6274,33 +7995,43 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "version": "11.2.6", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, + "node_modules/http-errors": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -6313,8 +8044,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { @@ -6327,8 +8056,6 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6337,15 +8064,10 @@ }, "node_modules/ibantools": { "version": "4.5.1", - "resolved": "https://registry.npmjs.org/ibantools/-/ibantools-4.5.1.tgz", - "integrity": "sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==", "license": "MIT or MPL-2.0" }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -6357,7 +8079,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "dev": true, "funding": [ { "type": "github", @@ -6384,8 +8105,6 @@ }, "node_modules/ignore-walk": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, "license": "ISC", "dependencies": { @@ -6397,8 +8116,6 @@ }, "node_modules/ignore-walk/node_modules/balanced-match": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "dev": true, "license": "MIT", "engines": { @@ -6407,8 +8124,6 @@ }, "node_modules/ignore-walk/node_modules/brace-expansion": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { @@ -6419,16 +8134,14 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6436,8 +8149,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6453,8 +8164,6 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -6490,40 +8199,38 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "version": "6.0.0", "dev": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/ip-address": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -6536,6 +8243,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "dev": true, @@ -6554,8 +8275,6 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -6591,18 +8310,18 @@ }, "node_modules/is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "license": "MIT" + }, "node_modules/is-regexp": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, "license": "MIT", "engines": { @@ -6633,15 +8352,11 @@ }, "node_modules/is-url": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true, "license": "MIT" }, "node_modules/is-url-superb": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, "license": "MIT", "engines": { @@ -6651,8 +8366,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { - "version": "1.0.0", + "version": "2.0.5", "dev": true, "license": "MIT" }, @@ -6671,8 +8397,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6686,10 +8410,19 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6703,8 +8436,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6718,8 +8449,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6746,8 +8475,6 @@ }, "node_modules/jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", - "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", "dependencies": { @@ -6773,8 +8500,6 @@ }, "node_modules/jest-changed-files": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", - "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6788,8 +8513,6 @@ }, "node_modules/jest-circus": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", - "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, "license": "MIT", "dependencies": { @@ -6820,8 +8543,6 @@ }, "node_modules/jest-cli": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", - "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, "license": "MIT", "dependencies": { @@ -6840,21 +8561,102 @@ "jest": "bin/jest.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": ">=12" } }, "node_modules/jest-config": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", - "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", "dependencies": { @@ -6903,31 +8705,8 @@ } } }, - "node_modules/jest-config/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jest-diff": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { @@ -6942,8 +8721,6 @@ }, "node_modules/jest-docblock": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { @@ -6955,8 +8732,6 @@ }, "node_modules/jest-each": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", - "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6972,8 +8747,6 @@ }, "node_modules/jest-environment-node": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", - "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { @@ -6996,8 +8769,6 @@ }, "node_modules/jest-haste-map": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", - "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -7021,8 +8792,6 @@ }, "node_modules/jest-leak-detector": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", - "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7035,8 +8804,6 @@ }, "node_modules/jest-matcher-utils": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { @@ -7051,8 +8818,6 @@ }, "node_modules/jest-message-util": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { @@ -7072,8 +8837,6 @@ }, "node_modules/jest-mock": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", "dependencies": { @@ -7087,8 +8850,6 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -7105,8 +8866,6 @@ }, "node_modules/jest-regex-util": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, "license": "MIT", "engines": { @@ -7115,8 +8874,6 @@ }, "node_modules/jest-resolve": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", - "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", "dependencies": { @@ -7135,8 +8892,6 @@ }, "node_modules/jest-resolve-dependencies": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", - "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", "dependencies": { @@ -7149,8 +8904,6 @@ }, "node_modules/jest-runner": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", - "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7183,8 +8936,6 @@ }, "node_modules/jest-runtime": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", - "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", "dependencies": { @@ -7215,31 +8966,8 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jest-snapshot": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", - "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", "dependencies": { @@ -7269,10 +8997,19 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-util": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", "dependencies": { @@ -7288,9 +9025,7 @@ } }, "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", "dev": true, "license": "MIT", "engines": { @@ -7302,8 +9037,6 @@ }, "node_modules/jest-validate": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", - "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -7320,8 +9053,6 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -7333,8 +9064,6 @@ }, "node_modules/jest-watcher": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", - "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { @@ -7353,8 +9082,6 @@ }, "node_modules/jest-worker": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { @@ -7370,8 +9097,6 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7384,6 +9109,17 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jose": { + "version": "6.1.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-base64": { + "version": "3.7.8", + "license": "BSD-3-Clause" + }, "node_modules/js-tokens": { "version": "4.0.0", "dev": true, @@ -7391,8 +9127,6 @@ }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -7404,8 +9138,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -7417,32 +9149,42 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "version": "5.0.0", "dev": true, "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, @@ -7462,33 +9204,65 @@ } }, "node_modules/jsonfile": { - "version": "4.0.0", + "version": "6.2.0", "dev": true, "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" ], "license": "MIT" }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/ky": { + "version": "1.14.3", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/lazystream": { "version": "1.0.1", "dev": true, @@ -7500,6 +9274,11 @@ "node": ">= 0.6.3" } }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "dev": true, @@ -7529,8 +9308,6 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -7539,8 +9316,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7551,8 +9326,12 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.12.37", + "license": "MIT" + }, "node_modules/libsodium-sumo": { - "version": "0.7.15", + "version": "0.7.16", "license": "ISC" }, "node_modules/libsodium-wrappers-sumo": { @@ -7664,15 +9443,11 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -7687,14 +9462,15 @@ }, "node_modules/lodash": { "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", "dev": true, "license": "MIT" }, @@ -7705,8 +9481,6 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, @@ -7745,16 +9519,16 @@ "license": "MIT" }, "node_modules/long": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", - "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", + "version": "5.3.2", "dev": true, "license": "Apache-2.0" }, + "node_modules/lru_map": { + "version": "0.4.1", + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -7763,8 +9537,6 @@ }, "node_modules/luxon": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", "engines": { "node": ">=12" @@ -7809,8 +9581,6 @@ }, "node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7819,8 +9589,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -7833,15 +9601,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-error": { "version": "1.3.6", - "dev": true, "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "15.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.3.tgz", - "integrity": "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==", "dev": true, "license": "ISC", "dependencies": { @@ -7861,60 +9637,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/make-fetch-happen/node_modules/minipass-fetch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.1.tgz", - "integrity": "sha512-yHK8pb0iCGat0lDrs/D6RZmCdaBT64tULXjdxjSMAqoDi18Q3qKEUTHypHQZQd9+FYpIS+lkvpq6C/R6SbUeRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass-sized": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", - "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-fetch-happen/node_modules/proc-log": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", - "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/makeerror": { "version": "1.0.12", "dev": true, @@ -7930,13 +9652,28 @@ "node": ">= 0.4" } }, + "node_modules/media-typer": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/memory-pager": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "dev": true, "license": "MIT" }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -7979,20 +9716,23 @@ "node": ">=6" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" + }, "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "3.1.2", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { @@ -8004,17 +9744,15 @@ } }, "node_modules/minipass": { - "version": "7.1.2", + "version": "7.1.3", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "license": "ISC", "dependencies": { @@ -8025,18 +9763,16 @@ } }, "node_modules/minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", + "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -8044,8 +9780,6 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "license": "ISC", "dependencies": { @@ -8057,8 +9791,6 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { @@ -8070,48 +9802,11 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/minipass-pipeline": { + "version": "1.2.4", "dev": true, "license": "ISC", "dependencies": { @@ -8121,10 +9816,8 @@ "node": ">=8" } }, - "node_modules/minipass-sized/node_modules/minipass": { + "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { @@ -8134,17 +9827,24 @@ "node": ">=8" } }, - "node_modules/minipass-sized/node_modules/yallist": { + "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, + "node_modules/minipass-sized": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -8167,15 +9867,11 @@ }, "node_modules/mkdirp-classic": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true, "license": "MIT" }, "node_modules/module-definition": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.1.tgz", - "integrity": "sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==", "dev": true, "license": "MIT", "dependencies": { @@ -8191,8 +9887,6 @@ }, "node_modules/module-lookup-amd": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-9.1.0.tgz", - "integrity": "sha512-j4tnAgLfIR/7p26DF7cyLL/2LD/5386L5EuvVtID+HnOvTSzVk8lwheZIlhfCbeyrZPBDm9m+eseH7yp81dZrA==", "dev": true, "license": "MIT", "dependencies": { @@ -8209,8 +9903,6 @@ }, "node_modules/module-lookup-amd/node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { @@ -8219,8 +9911,6 @@ }, "node_modules/mongodb": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.0.0.tgz", - "integrity": "sha512-vG/A5cQrvGGvZm2mTnCSz1LUcbOPl83hfB6bxULKQ8oFZauyox/2xbZOoGNl+64m8VBrETkdGCDBdOsCr3F3jg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8265,9 +9955,7 @@ } }, "node_modules/mongodb-connection-string-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.0.tgz", - "integrity": "sha512-irhhjRVLE20hbkRl4zpAYLnDMM+zIZnp0IDB9akAFFUZp/3XdOfwwddc7y6cNvF2WCEtfTYRwYbIfYa2kVY0og==", + "version": "7.0.1", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8280,20 +9968,20 @@ }, "node_modules/ms": { "version": "2.1.3", - "dev": true, "license": "MIT" }, + "node_modules/multiformats": { + "version": "9.9.0", + "license": "(Apache-2.0 AND MIT)" + }, "node_modules/nan": { - "version": "2.22.0", + "version": "2.25.0", "dev": true, "license": "MIT", "optional": true }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -8309,9 +9997,7 @@ } }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", "dev": true, "license": "MIT", "bin": { @@ -8331,9 +10017,6 @@ }, "node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -8341,15 +10024,45 @@ }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-gyp": { "version": "12.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", - "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8373,8 +10086,6 @@ }, "node_modules/node-gyp/node_modules/abbrev": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", - "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, "license": "ISC", "engines": { @@ -8383,8 +10094,6 @@ }, "node_modules/node-gyp/node_modules/isexe": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -8393,8 +10102,6 @@ }, "node_modules/node-gyp/node_modules/nopt": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", - "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "dev": true, "license": "ISC", "dependencies": { @@ -8407,20 +10114,19 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "node_modules/node-gyp/node_modules/semver": { + "version": "7.7.4", "dev": true, "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" } }, "node_modules/node-gyp/node_modules/which": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, "license": "ISC", "dependencies": { @@ -8439,16 +10145,12 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", "dev": true, "license": "MIT" }, "node_modules/node-source-walk": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.1.tgz", - "integrity": "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -8470,6 +10172,30 @@ "nopt": "bin/nopt.js" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, @@ -8480,8 +10206,6 @@ }, "node_modules/npm-bundled": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", - "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "dev": true, "license": "ISC", "dependencies": { @@ -8491,16 +10215,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", - "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/npm-check-updates": { "version": "19.6.2", "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-19.6.2.tgz", @@ -8517,67 +10231,79 @@ } }, "node_modules/npm-install-checks": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", - "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", + "version": "8.0.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "version": "5.0.0", "dev": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-package-arg": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.1.tgz", - "integrity": "sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==", + "version": "13.0.2", "dev": true, "license": "ISC", "dependencies": { "hosted-git-info": "^9.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-packlist": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.2.tgz", - "integrity": "sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==", + "version": "10.0.3", "dev": true, "license": "ISC", "dependencies": { "ignore-walk": "^8.0.0", - "proc-log": "^5.0.0" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-pick-manifest": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.1.tgz", - "integrity": "sha512-HnU7FYSWbo7dTVHtK0G+BXbZ0aIfxz/aUCVLN0979Ec6rGUX5cJ6RbgVx5fqb5G31ufz+BVFA7y1SkRTPVNoVQ==", + "version": "11.0.3", "dev": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, @@ -8585,21 +10311,30 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-registry-fetch": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.0.0.tgz", - "integrity": "sha512-DFxSAemHUwT/POaXAOY4NJmEWBPB0oKbwD6FFDE9hnt1nORkt/FXvgjD4hQjoKoHw9u0Ezws9SPXwV7xE/Gyww==", + "version": "19.1.1", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^13.0.0", - "proc-log": "^5.0.0" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -8607,8 +10342,6 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -8618,8 +10351,16 @@ "node": ">=8" } }, + "node_modules/oauth4webapi": { + "version": "3.8.5", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-inspect": { - "version": "1.13.3", + "version": "1.13.4", "license": "MIT", "engines": { "node": ">= 0.4" @@ -8628,9 +10369,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -8650,10 +10408,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openid-client": { + "version": "6.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jose": "^6.1.3", + "oauth4webapi": "^3.8.4" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -8690,6 +10473,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "dev": true, @@ -8731,8 +10533,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -8746,9 +10546,7 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", "dev": true, "license": "MIT", "engines": { @@ -8760,8 +10558,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -8774,9 +10570,7 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "21.0.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.4.tgz", - "integrity": "sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==", + "version": "21.3.1", "dev": true, "license": "ISC", "dependencies": { @@ -8805,109 +10599,113 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/pacote/node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", - "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "node_modules/pako": { + "version": "2.1.0", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "which": "^6.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6" } }, - "node_modules/pacote/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/parse-json": { + "version": "5.2.0", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, "engines": { - "node": ">=16" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote/node_modules/proc-log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.0.0.tgz", - "integrity": "sha512-KG/XsTDN901PNfPfAMmj6N/Ywg9tM+bHK8pAz+27fS4N4Pcr+4zoYBOcGSBu6ceXYNPxkLpa4ohtfxV1XcLAfA==", + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "license": "MIT" }, - "node_modules/pacote/node_modules/ssri": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", - "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", + "node_modules/parse-ms": { + "version": "2.1.0", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6" } }, - "node_modules/pacote/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.8" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/patch-package": { + "version": "8.0.1", "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" }, "engines": { - "node": ">=6" + "node": ">=14", + "npm": ">5" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/patch-package/node_modules/ci-info": { + "version": "3.9.0", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/patch-package/node_modules/semver": { + "version": "7.7.4", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/parse-ms": { - "version": "2.1.0", + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { @@ -8963,6 +10761,14 @@ "dev": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/picocolors": { "version": "1.1.1", "dev": true, @@ -8981,8 +10787,6 @@ }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { @@ -8991,8 +10795,6 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9004,8 +10806,6 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -9018,8 +10818,6 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -9031,8 +10829,6 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -9047,8 +10843,6 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -9068,8 +10862,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -9097,8 +10889,6 @@ }, "node_modules/postcss-values-parser": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", - "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -9115,8 +10905,6 @@ }, "node_modules/precinct": { "version": "12.2.0", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-12.2.0.tgz", - "integrity": "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==", "dev": true, "license": "MIT", "dependencies": { @@ -9153,8 +10941,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -9163,8 +10949,6 @@ }, "node_modules/prettier": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "bin": { @@ -9179,8 +10963,6 @@ }, "node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { @@ -9194,8 +10976,6 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -9220,13 +11000,11 @@ } }, "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "version": "6.1.0", "dev": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/process": { @@ -9244,8 +11022,6 @@ }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "license": "MIT", "dependencies": { @@ -9266,10 +11042,13 @@ "signal-exit": "^3.0.2" } }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, "node_modules/properties-reader": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-3.0.1.tgz", - "integrity": "sha512-WPn+h9RGEExOKdu4bsF4HksG/uzd3cFq3MFtq8PsFeExPse5Ha/VOjQNyHhjboBFwGXGev6muJYTSPAOkROq2g==", "dev": true, "license": "MIT", "dependencies": { @@ -9286,8 +11065,6 @@ }, "node_modules/properties-reader/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, "license": "MIT", "bin": { @@ -9301,9 +11078,7 @@ } }, "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "version": "7.5.4", "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", @@ -9325,14 +11100,23 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "license": "MIT" }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -9350,8 +11134,6 @@ }, "node_modules/pure-rand": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "dev": true, "funding": [ { @@ -9365,10 +11147,22 @@ ], "license": "MIT" }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qs": { "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -9380,18 +11174,45 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-tick": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/quote-unquote": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", - "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", "dev": true, "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/rc": { "version": "1.2.8", "dev": true, @@ -9419,6 +11240,16 @@ "node": ">=0.10.0" } }, + "node_modules/rdf-canonize": { + "version": "3.4.0", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/react-is": { "version": "18.3.1", "dev": true, @@ -9459,40 +11290,35 @@ "npm-normalize-package-bin": "^1.0.0" } }, - "node_modules/read-package-json/node_modules/hosted-git-info": { - "version": "2.8.9", + "node_modules/read-package-json/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, "license": "MIT" }, - "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "1.0.1", "dev": true, "license": "ISC" }, - "node_modules/read-package-json/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "dev": true, @@ -9514,10 +11340,16 @@ "minimatch": "^5.1.0" } }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "version": "5.1.6", "dev": true, "license": "ISC", "dependencies": { @@ -9542,6 +11374,54 @@ "version": "0.2.2", "license": "Apache-2.0" }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/require-directory": { "version": "2.1.1", "dev": true, @@ -9559,8 +11439,6 @@ }, "node_modules/requirejs": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.8.tgz", - "integrity": "sha512-7/cTSLOdYkNBNJcDMWf+luFvMriVm7eYxp4BcFCsAX0wF421Vyce5SXP17c+Jd5otXKGNehIonFlyQXSowL6Mw==", "dev": true, "license": "MIT", "bin": { @@ -9573,8 +11451,6 @@ }, "node_modules/requirejs-config-file": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", - "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", "dev": true, "license": "MIT", "dependencies": { @@ -9587,8 +11463,6 @@ }, "node_modules/resolve": { "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9608,8 +11482,6 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -9621,8 +11493,6 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -9631,8 +11501,6 @@ }, "node_modules/resolve-dependency-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-4.0.1.tgz", - "integrity": "sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ==", "dev": true, "license": "MIT", "engines": { @@ -9641,8 +11509,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -9661,6 +11527,11 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, "node_modules/retry": { "version": "0.12.0", "dev": true, @@ -9674,6 +11545,27 @@ "dev": true, "license": "MIT" }, + "node_modules/router": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "dev": true, @@ -9703,13 +11595,10 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, "license": "MIT" }, "node_modules/sass-lookup": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-6.1.0.tgz", - "integrity": "sha512-Zx+lVyoWqXZxHuYWlTA17Z5sczJ6braNT2C7rmClw+c4E7r/n911Zwss3h1uHI9reR5AgHZyNHF7c2+VIp5AUA==", "dev": true, "license": "MIT", "dependencies": { @@ -9725,8 +11614,6 @@ }, "node_modules/sass-lookup/node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { @@ -9734,18 +11621,122 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serialize-error": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "dev": true, @@ -9829,29 +11820,40 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, + "node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sigstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.0.0.tgz", - "integrity": "sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==", + "version": "4.1.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.0.0", - "@sigstore/tuf": "^4.0.0", - "@sigstore/verify": "^3.0.0" + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/sjcl": { + "version": "1.0.8", + "license": "(BSD-2-Clause OR GPL-2.0-only)", + "engines": { + "node": "*" + } + }, "node_modules/slash": { "version": "3.0.0", "dev": true, @@ -9879,8 +11881,6 @@ }, "node_modules/socks": { "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, "license": "MIT", "dependencies": { @@ -9894,8 +11894,6 @@ }, "node_modules/socks-proxy-agent": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "license": "MIT", "dependencies": { @@ -9909,7 +11907,7 @@ }, "node_modules/source-map": { "version": "0.6.1", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9917,8 +11915,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -9927,8 +11923,6 @@ }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -9938,8 +11932,6 @@ }, "node_modules/sparse-bitfield": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9980,7 +11972,7 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", + "version": "3.0.22", "dev": true, "license": "CC0-1.0" }, @@ -10001,11 +11993,14 @@ }, "node_modules/split-ca": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", "dev": true, "license": "ISC" }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/ssh-remote-port-forward": { "version": "1.0.4", "dev": true, @@ -10025,7 +12020,7 @@ } }, "node_modules/ssh2": { - "version": "1.16.0", + "version": "1.17.0", "dev": true, "hasInstallScript": true, "dependencies": { @@ -10037,20 +12032,18 @@ }, "optionalDependencies": { "cpu-features": "~0.0.10", - "nan": "^2.20.0" + "nan": "^2.23.0" } }, "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "version": "13.0.1", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/stack-utils": { @@ -10072,6 +12065,89 @@ "node": ">=8" } }, + "node_modules/static-eval": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stream-to-array": { "version": "2.3.0", "dev": true, @@ -10093,17 +12169,43 @@ "node": ">=8.0" } }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/streamx": { - "version": "2.21.0", + "version": "2.23.0", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -10116,8 +12218,6 @@ }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10128,19 +12228,41 @@ "node": ">=10" } }, - "node_modules/string-width": { - "version": "4.2.3", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", @@ -10155,10 +12277,32 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10171,14 +12315,17 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", + "version": "7.1.2", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -10193,10 +12340,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -10205,8 +12358,6 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -10226,8 +12377,6 @@ }, "node_modules/stylus-lookup": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-6.1.0.tgz", - "integrity": "sha512-5QSwgxAzXPMN+yugy61C60PhoANdItfdjSEZR8siFwz7yL9jTmV0UBKDCfn3K8GkGB4g0Y9py7vTCX8rFu4/pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10242,8 +12391,6 @@ }, "node_modules/stylus-lookup/node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { @@ -10273,9 +12420,7 @@ } }, "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "version": "0.11.12", "dev": true, "license": "MIT", "dependencies": { @@ -10290,8 +12435,6 @@ }, "node_modules/tapable": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { @@ -10304,8 +12447,6 @@ }, "node_modules/tar": { "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -10321,8 +12462,6 @@ }, "node_modules/tar-fs": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { @@ -10346,18 +12485,23 @@ }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, + "node_modules/teex": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "streamx": "^2.12.5" + } + }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -10369,34 +12513,27 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/testcontainers": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-11.12.0.tgz", - "integrity": "sha512-VWtH+UQejVYYvb53ohEZRbx2naxyDvwO9lQ6A0VgmVE2Oh8r9EF09I+BfmrXpd9N9ntpzhao9di2yNwibSz5KA==", "dev": true, "license": "MIT", "dependencies": { @@ -10417,8 +12554,16 @@ "undici": "^7.22.0" } }, + "node_modules/testcontainers/node_modules/undici": { + "version": "7.22.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/text-decoder": { - "version": "1.2.2", + "version": "1.2.7", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10427,8 +12572,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10444,8 +12587,6 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -10462,8 +12603,6 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10475,8 +12614,6 @@ }, "node_modules/tmp": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, "license": "MIT", "engines": { @@ -10499,10 +12636,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/tr46": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -10520,8 +12662,19 @@ "node": ">=0.6" } }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-graphviz": { - "version": "2.1.4", + "version": "2.1.6", "dev": true, "funding": [ { @@ -10535,10 +12688,10 @@ ], "license": "MIT", "dependencies": { - "@ts-graphviz/adapter": "^2.0.5", - "@ts-graphviz/ast": "^2.0.5", - "@ts-graphviz/common": "^2.1.4", - "@ts-graphviz/core": "^2.0.5" + "@ts-graphviz/adapter": "^2.0.6", + "@ts-graphviz/ast": "^2.0.7", + "@ts-graphviz/common": "^2.1.5", + "@ts-graphviz/core": "^2.0.7" }, "engines": { "node": ">=18" @@ -10546,8 +12699,6 @@ }, "node_modules/ts-jest": { "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -10597,10 +12748,30 @@ } } }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-json-schema-generator": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.5.0.tgz", - "integrity": "sha512-sYY7AInozRbtj9OD3ynJJuMDWZ5lGxzxTevtmH3W9Hnd2J2szBC0HdPqSyuIirXnQ6g8KDJxS/HENoypUwBrlg==", "dev": true, "license": "MIT", "dependencies": { @@ -10621,8 +12792,6 @@ }, "node_modules/ts-json-schema-generator/node_modules/commander": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -10681,8 +12850,6 @@ }, "node_modules/ts-simple-nameof": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/ts-simple-nameof/-/ts-simple-nameof-1.3.3.tgz", - "integrity": "sha512-nQUaiSnaJUx18YpX9dbZ63jgLnb0CgRTFvQPtIg6sSPZ0mUqH3tYjbmG6XYmwbyuokTEGy4eU0c5zAzNfvLgjg==", "license": "MIT" }, "node_modules/tsconfig-paths": { @@ -10703,20 +12870,29 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", "license": "0BSD" }, "node_modules/tuf-js": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", - "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10735,8 +12911,6 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -10748,8 +12922,6 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -10757,23 +12929,52 @@ } }, "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "version": "0.21.3", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10785,8 +12986,6 @@ }, "node_modules/typescript-eslint": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", - "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", "dev": true, "license": "MIT", "dependencies": { @@ -10809,8 +13008,6 @@ }, "node_modules/uglify-js": { "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -10821,61 +13018,99 @@ "node": ">=0.8.0" } }, + "node_modules/uint8arrays": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, "node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", - "dev": true, + "version": "6.23.0", "license": "MIT", "engines": { - "node": ">=20.18.1" + "node": ">=18.17" } }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "version": "5.0.0", "dev": true, "license": "ISC", "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "version": "6.0.0", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/universalify": { - "version": "0.1.2", + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, "node_modules/unrs-resolver": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10908,9 +13143,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", "dev": true, "funding": [ { @@ -10940,8 +13173,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10960,8 +13191,6 @@ }, "node_modules/uuid": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -10978,8 +13207,6 @@ }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -10991,6 +13218,18 @@ "node": ">=10.12.0" } }, + "node_modules/valibot": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, @@ -11001,13 +13240,29 @@ } }, "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "version": "7.0.2", "dev": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/validator": { + "version": "13.15.26", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, "node_modules/walkdir": { @@ -11034,10 +13289,27 @@ "defaults": "^1.0.3" } }, + "node_modules/web-did-resolver": { + "version": "2.0.32", + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "^4.1.0", + "did-resolver": "^4.1.0" + } + }, + "node_modules/webcrypto-core": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.7.0" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11046,8 +13318,6 @@ }, "node_modules/whatwg-url": { "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { @@ -11074,9 +13344,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11084,24 +13351,20 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "version": "8.1.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -11124,82 +13387,60 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -11210,17 +13451,23 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", + "node_modules/ws": { + "version": "8.19.0", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/y18n": { @@ -11233,37 +13480,37 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", + "version": "2.8.2", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { - "version": "17.7.2", + "version": "18.0.0", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { @@ -11274,6 +13521,35 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "22.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/yn": { "version": "3.1.1", "dev": true, @@ -11330,7 +13606,7 @@ } }, "node_modules/zip-stream/node_modules/readable-stream": { - "version": "4.5.2", + "version": "4.7.0", "dev": true, "license": "MIT", "dependencies": { @@ -11344,6 +13620,23 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/zod": { + "version": "4.3.6", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "packages/app-runtime": { "name": "@nmshd/app-runtime", "license": "AGPL-3.0-or-later", @@ -11364,6 +13657,8 @@ "name": "@nmshd/consumption", "license": "AGPL-3.0-or-later", "dependencies": { + "@credo-ts/core": "^0.6.1", + "@credo-ts/openid4vc": "^0.6.1", "@js-soft/docdb-querytranslator": "^1.1.6", "@js-soft/ts-serval": "2.0.16", "@js-soft/ts-utils": "2.3.5", @@ -11371,8 +13666,12 @@ "@nmshd/core-types": "*", "@nmshd/iql": "^1.0.4", "@nmshd/transport": "*", + "@noble/ciphers": "^2.0.1", + "jose": "^6.1.1", "lodash": "^4.17.23", - "ts-simple-nameof": "^1.3.3" + "sjcl": "^1.0.8", + "ts-simple-nameof": "^1.3.3", + "ws": "^8.18.3" }, "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", @@ -11380,6 +13679,7 @@ "@js-soft/node-logger": "1.2.1", "@nmshd/crypto": "2.1.3", "@types/lodash": "^4.17.24", + "@types/sjcl": "^1.0.34", "ts-mockito": "^2.6.1" } }, @@ -11432,6 +13732,7 @@ "ajv": "^8.18.0", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", + "elliptic": "^6.6.1", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.23", "luxon": "^3.7.2", @@ -11439,12 +13740,17 @@ "ts-simple-nameof": "^1.3.3" }, "devDependencies": { + "@eudiplo/sdk-core": "^1.16.0", "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", "@js-soft/node-logger": "1.2.1", + "@nmshd/connector-sdk": "^7.3.0", + "@types/elliptic": "^6.4.18", "@types/json-stringify-safe": "^5.0.3", "@types/lodash": "^4.17.24", "@types/luxon": "^3.7.1", + "jwt-decode": "^4.0.0", + "openid-client": "^6.8.1", "ts-json-schema-generator": "2.5.0", "ts-mockito": "^2.6.1" } @@ -11456,8 +13762,6 @@ }, "packages/runtime/node_modules/ajv": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", diff --git a/package.json b/package.json index 209cdc25f..a584a8079 100644 --- a/package.json +++ b/package.json @@ -17,16 +17,21 @@ "scripts": { "build:node": "tsc --build", "build:watch": "tsc --build -w", + "postinstall": "patch-package && echo 'Postinstall done.'", "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:tsc", "lint:eslint": "eslint", "lint:prettier": "prettier --check .", "lint:tsc": "npm run --workspaces lint:tsc", "outdated": "ncu -i && ncu -i --workspaces", - "start:backbone": "docker compose -f .dev/compose.backbone.yml up -d", + "start:backbone": "docker compose -f .dev/compose.backbone.yml up -d --wait", + "start:openid4vc": "docker compose -f .dev/compose.openid4vc.yml up -d --wait", "teardown:backbone": "docker compose -f .dev/compose.backbone.yml down -v", + "teardown:openid4vc": "docker compose -f .dev/compose.openid4vc.yml down -v", "test:teardown": "docker compose -f .dev/compose.yml down -fsv" }, "devDependencies": { + "@babel/preset-env": "^7.29.0", + "@babel/preset-typescript": "^7.28.5", "@js-soft/eslint-config-ts": "^2.0.4", "@js-soft/license-check": "^1.0.10", "@types/jest": "^30.0.0", @@ -36,7 +41,8 @@ "jest": "^30.2.0", "jest-expect-message": "^1.1.3", "madge": "^8.0.0", - "npm-check-updates": "^19.6.2", + "npm-check-updates": "^19.4.1", + "patch-package": "^8.0.1", "prettier": "^3.8.1", "ts-jest": "^29.4.6", "ts-node": "^10.9.2", diff --git a/packages/app-runtime/package.json b/packages/app-runtime/package.json index 0d979dd0b..3b864279a 100644 --- a/packages/app-runtime/package.json +++ b/packages/app-runtime/package.json @@ -43,13 +43,29 @@ "testEnvironment": "node", "testTimeout": 60000, "transform": { - "^.+\\.ts$": [ + "^.+\\.(t|j)s$": [ "ts-jest", { "tsconfig": "test/tsconfig.json" } + ], + "^.+\\.mjs$": [ + "babel-jest", + { + "presets": [ + [ + "@babel/preset-env", + { + "modules": "commonjs" + } + ] + ] + } ] - } + }, + "transformIgnorePatterns": [ + "/node_modules/(?!(@noble|@stablelib|@credo\\-ts)/)" + ] }, "dependencies": { "@js-soft/docdb-access-loki": "^1.4.0", diff --git a/packages/app-runtime/src/AppStringProcessor.ts b/packages/app-runtime/src/AppStringProcessor.ts index 816f955aa..9479a33fc 100644 --- a/packages/app-runtime/src/AppStringProcessor.ts +++ b/packages/app-runtime/src/AppStringProcessor.ts @@ -29,9 +29,12 @@ export class AppStringProcessor { url = url.trim(); const parsed = new URL(url); - const allowedProtocols = ["http:", "https:"]; + + const allowedProtocols = ["http:", "https:", "openid4vp:"]; if (!allowedProtocols.includes(parsed.protocol)) return Result.fail(AppRuntimeErrors.appStringProcessor.wrongURL()); + if (parsed.protocol === "openid4vp:") return await this.processOpenID4VPURL(url, account); + return await this.processReference(url, account); } @@ -44,6 +47,36 @@ export class AppStringProcessor { } } + private async processOpenID4VPURL(url: string, account?: LocalAccountDTO): Promise> { + if (!account) { + const result = await this.selectAccount(); + if (result.isError) { + this.logger.info("Could not query account", result.error); + return Result.fail(result.error); + } + + if (!result.value) { + this.logger.info("User cancelled account selection"); + return Result.ok(undefined); + } + + account = result.value; + } + + const session = await this.runtime.getServices(account.id); + const result = await session.consumptionServices.openId4Vc.resolveAuthorizationRequest({ authorizationRequestUrl: url }); + + const uiBridge = await this.runtime.uiBridge(); + if (result.isError) { + this.logger.error("Could not resolve authorization request", result.error); + await uiBridge.showError(result.error); + + return Result.ok(undefined); + } + + return await uiBridge.showResolvedAuthorizationRequest(account, result.value); + } + private async _processReference(reference: Reference, account?: LocalAccountDTO): Promise> { if (account) return await this._handleReference(reference, account); diff --git a/packages/app-runtime/src/extensibility/ui/IUIBridge.ts b/packages/app-runtime/src/extensibility/ui/IUIBridge.ts index 3fa3b6b47..ba69bd3dd 100644 --- a/packages/app-runtime/src/extensibility/ui/IUIBridge.ts +++ b/packages/app-runtime/src/extensibility/ui/IUIBridge.ts @@ -1,5 +1,5 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { DeviceOnboardingInfoDTO, FileDVO, IdentityDVO, LocalRequestDVO, MailDVO, MessageDVO, RequestMessageDVO } from "@nmshd/runtime"; +import { DeviceOnboardingInfoDTO, FileDVO, IdentityDVO, LocalRequestDVO, MailDVO, MessageDVO, RequestMessageDVO, ResolveAuthorizationRequestResponse } from "@nmshd/runtime"; import { LocalAccountDTO } from "../../multiAccount"; export interface IUIBridge { @@ -8,6 +8,7 @@ export interface IUIBridge { showFile(account: LocalAccountDTO, file: FileDVO): Promise>; showDeviceOnboarding(deviceOnboardingInfo: DeviceOnboardingInfoDTO): Promise>; showRequest(account: LocalAccountDTO, request: LocalRequestDVO): Promise>; + showResolvedAuthorizationRequest(account: LocalAccountDTO, response: ResolveAuthorizationRequestResponse): Promise>; showError(error: ApplicationError, account?: LocalAccountDTO): Promise>; requestAccountSelection(possibleAccounts: LocalAccountDTO[], title?: string, description?: string): Promise>; enterPassword(passwordType: "pw" | "pin", pinLength?: number, attempt?: number, passwordLocationIndicator?: number): Promise>; diff --git a/packages/app-runtime/test/lib/FakeUIBridge.ts b/packages/app-runtime/test/lib/FakeUIBridge.ts index 0346ebf37..9f57572b0 100644 --- a/packages/app-runtime/test/lib/FakeUIBridge.ts +++ b/packages/app-runtime/test/lib/FakeUIBridge.ts @@ -22,6 +22,10 @@ export class FakeUIBridge implements IUIBridge { return Promise.resolve(Result.ok(undefined)); } + public showResolvedAuthorizationRequest(): Promise> { + return Promise.resolve(Result.ok(undefined)); + } + public showError(): Promise> { return Promise.resolve(Result.ok(undefined)); } @@ -33,4 +37,8 @@ export class FakeUIBridge implements IUIBridge { public enterPassword(_passwordType: "pw" | "pin", _pinLength?: number, _attempt?: number): Promise> { return Promise.resolve(Result.fail(new ApplicationError("not implemented", "not implemented"))); } + + public performOauthAuthentication(_authenticationServerUrl: string): Promise> { + return Promise.resolve(Result.fail(new ApplicationError("not implemented", "not implemented"))); + } } diff --git a/packages/app-runtime/test/lib/MockUIBridge.matchers.ts b/packages/app-runtime/test/lib/MockUIBridge.matchers.ts index 1432113d5..e6e526b37 100644 --- a/packages/app-runtime/test/lib/MockUIBridge.matchers.ts +++ b/packages/app-runtime/test/lib/MockUIBridge.matchers.ts @@ -134,6 +134,31 @@ expect.extend({ return { pass: true, message: () => "" }; }, + showResolvedAuthorizationRequestCalled(mockUIBridge: unknown) { + if (!(mockUIBridge instanceof MockUIBridge)) { + throw new Error("This method can only be used with expect(MockUIBridge)."); + } + + const calls = mockUIBridge.calls.filter((x) => x.method === "showResolvedAuthorizationRequest"); + if (calls.length === 0) { + return { pass: false, message: () => "The method showResolvedAuthorizationRequest was not called." }; + } + + return { pass: true, message: () => "" }; + }, + showResolvedAuthorizationRequestNotCalled(mockUIBridge: unknown) { + if (!(mockUIBridge instanceof MockUIBridge)) { + throw new Error("This method can only be used with expect(MockUIBridge)."); + } + + const calls = mockUIBridge.calls.filter((x) => x.method === "showResolvedAuthorizationRequest"); + if (calls.length > 0) { + return { pass: false, message: () => `The method showResolvedAuthorizationRequest was called: ${calls.map((c) => `'account id: ${c.account.id}'`)}` }; + } + + return { pass: true, message: () => "" }; + }, + showFileCalled(mockUIBridge: unknown, id: string) { if (!(mockUIBridge instanceof MockUIBridge)) { throw new Error("This method can only be used with expect(MockUIBridge)."); @@ -199,6 +224,10 @@ declare global { enterPasswordNotCalled(): R; showRequestCalled(): R; showRequestNotCalled(): R; + showResolvedAuthorizationRequestCalled(): R; + showResolvedAuthorizationRequestNotCalled(): R; + showResolvedCredentialOfferCalled(): R; + showResolvedCredentialOfferNotCalled(): R; showFileCalled(id: string): R; showFileNotCalled(): R; showErrorCalled(code: string): R; diff --git a/packages/app-runtime/test/lib/MockUIBridge.ts b/packages/app-runtime/test/lib/MockUIBridge.ts index 6dcf81d08..7628f2fab 100644 --- a/packages/app-runtime/test/lib/MockUIBridge.ts +++ b/packages/app-runtime/test/lib/MockUIBridge.ts @@ -1,5 +1,5 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { DeviceOnboardingInfoDTO, FileDVO, IdentityDVO, LocalRequestDVO, MailDVO, MessageDVO, RequestMessageDVO } from "@nmshd/runtime"; +import { DeviceOnboardingInfoDTO, FileDVO, IdentityDVO, LocalRequestDVO, MailDVO, MessageDVO, RequestMessageDVO, ResolveAuthorizationRequestResponse } from "@nmshd/runtime"; import { IUIBridge, LocalAccountDTO } from "../../src"; export type MockUIBridgeCall = @@ -8,6 +8,7 @@ export type MockUIBridgeCall = | { method: "showFile"; account: LocalAccountDTO; file: FileDVO } | { method: "showDeviceOnboarding"; deviceOnboardingInfo: DeviceOnboardingInfoDTO } | { method: "showRequest"; account: LocalAccountDTO; request: LocalRequestDVO } + | { method: "showResolvedAuthorizationRequest"; account: LocalAccountDTO; response: ResolveAuthorizationRequestResponse } | { method: "showError"; error: ApplicationError; account?: LocalAccountDTO } | { method: "requestAccountSelection"; possibleAccounts: LocalAccountDTO[]; title?: string; description?: string } | { method: "enterPassword"; passwordType: "pw" | "pin"; pinLength?: number; attempt?: number; passwordLocationIndicator?: number }; @@ -65,6 +66,12 @@ export class MockUIBridge implements IUIBridge { return Promise.resolve(Result.ok(undefined)); } + public showResolvedAuthorizationRequest(account: LocalAccountDTO, response: ResolveAuthorizationRequestResponse): Promise> { + this._calls.push({ method: "showResolvedAuthorizationRequest", account, response }); + + return Promise.resolve(Result.ok(undefined)); + } + public showError(error: ApplicationError, account?: LocalAccountDTO): Promise> { this._calls.push({ method: "showError", error, account }); diff --git a/packages/app-runtime/test/tsconfig.json b/packages/app-runtime/test/tsconfig.json index db9a0d1ee..3bbf071a7 100644 --- a/packages/app-runtime/test/tsconfig.json +++ b/packages/app-runtime/test/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "baseUrl": "../", "noEmit": true, - "composite": false + "composite": false, + "allowJs": true // we want to use the ts compiler to compile ESM node modules into CJS which is understood by jest. This is required since those node modules are javascript. }, "files": ["../../../node_modules/jest-expect-message/types/index.d.ts"], "include": ["**/*.ts", "../src/**/*.ts"], diff --git a/packages/consumption/package.json b/packages/consumption/package.json index d5a9cb451..960e6c6a0 100644 --- a/packages/consumption/package.json +++ b/packages/consumption/package.json @@ -50,15 +50,33 @@ "testEnvironment": "node", "testTimeout": 60000, "transform": { - "^.+\\.ts$": [ + "^.+\\.(t|j)s$": [ "ts-jest", { "tsconfig": "test/tsconfig.json" } + ], + "^.+\\.mjs$": [ + "babel-jest", + { + "presets": [ + [ + "@babel/preset-env", + { + "modules": "commonjs" + } + ] + ] + } ] - } + }, + "transformIgnorePatterns": [ + "/node_modules/(?!(@noble|@stablelib|@credo\\-ts)/)" + ] }, "dependencies": { + "@credo-ts/core": "^0.6.1", + "@credo-ts/openid4vc": "^0.6.1", "@js-soft/docdb-querytranslator": "^1.1.6", "@js-soft/ts-serval": "2.0.16", "@js-soft/ts-utils": "2.3.5", @@ -66,8 +84,12 @@ "@nmshd/core-types": "*", "@nmshd/iql": "^1.0.4", "@nmshd/transport": "*", + "@noble/ciphers": "^2.0.1", + "jose": "^6.1.1", "lodash": "^4.17.23", - "ts-simple-nameof": "^1.3.3" + "sjcl": "^1.0.8", + "ts-simple-nameof": "^1.3.3", + "ws": "^8.18.3" }, "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", @@ -75,6 +97,7 @@ "@js-soft/node-logger": "1.2.1", "@nmshd/crypto": "2.1.3", "@types/lodash": "^4.17.24", + "@types/sjcl": "^1.0.34", "ts-mockito": "^2.6.1" }, "publishConfig": { diff --git a/packages/consumption/src/consumption/ConsumptionConfig.ts b/packages/consumption/src/consumption/ConsumptionConfig.ts index e0cad820b..586bd4c2d 100644 --- a/packages/consumption/src/consumption/ConsumptionConfig.ts +++ b/packages/consumption/src/consumption/ConsumptionConfig.ts @@ -1,3 +1,4 @@ export interface ConsumptionConfig { setDefaultOwnIdentityAttributes: boolean; + fetchInstance?: typeof fetch; } diff --git a/packages/consumption/src/consumption/ConsumptionController.ts b/packages/consumption/src/consumption/ConsumptionController.ts index 49cc0e3f8..d116e4dd9 100644 --- a/packages/consumption/src/consumption/ConsumptionController.ts +++ b/packages/consumption/src/consumption/ConsumptionController.ts @@ -11,6 +11,7 @@ import { ProposeAttributeRequestItem, ReadAttributeRequestItem, ShareAttributeRequestItem, + ShareCredentialOfferRequestItem, TransferFileOwnershipRequestItem } from "@nmshd/content"; import { CoreAddress, CoreId } from "@nmshd/core-types"; @@ -29,6 +30,7 @@ import { NotificationItemProcessorConstructor, NotificationItemProcessorRegistry, NotificationsController, + OpenId4VcController, OutgoingRequestsController, OwnAttributeDeletedByOwnerNotificationItemProcessor, PeerAttributeSucceededNotificationItemProcessor, @@ -40,6 +42,7 @@ import { RequestItemProcessorRegistry, SettingsController, ShareAttributeRequestItemProcessor, + ShareCredentialOfferRequestItemProcessor, TransferFileOwnershipRequestItemProcessor } from "../modules"; import { ConsumptionConfig } from "./ConsumptionConfig"; @@ -81,6 +84,11 @@ export class ConsumptionController { return this._notifications; } + private _openId4Vc: OpenId4VcController; + public get openId4Vc(): OpenId4VcController { + return this._openId4Vc; + } + private _identityMetadata: IdentityMetadataController; public get identityMetadata(): IdentityMetadataController { return this._identityMetadata; @@ -138,6 +146,9 @@ export class ConsumptionController { this._identityMetadata = await new IdentityMetadataController(this).init(); this._settings = await new SettingsController(this).init(); + + this._openId4Vc = await new OpenId4VcController(this).init(); + return this; } @@ -151,7 +162,8 @@ export class ConsumptionController { [ConsentRequestItem, GenericRequestItemProcessor], [AuthenticationRequestItem, GenericRequestItemProcessor], [FormFieldRequestItem, FormFieldRequestItemProcessor], - [TransferFileOwnershipRequestItem, TransferFileOwnershipRequestItemProcessor] + [TransferFileOwnershipRequestItem, TransferFileOwnershipRequestItemProcessor], + [ShareCredentialOfferRequestItem, ShareCredentialOfferRequestItemProcessor] ]); } diff --git a/packages/consumption/src/consumption/ConsumptionControllerName.ts b/packages/consumption/src/consumption/ConsumptionControllerName.ts index c33064c0c..599a3298c 100644 --- a/packages/consumption/src/consumption/ConsumptionControllerName.ts +++ b/packages/consumption/src/consumption/ConsumptionControllerName.ts @@ -4,5 +4,6 @@ export enum ConsumptionControllerName { RequestsController = "RequestsController", SettingsController = "SettingsController", NotificationsController = "NotificationsController", - IdentityMetadataController = "IdentityMetadataController" + IdentityMetadataController = "IdentityMetadataController", + OpenId4VcController = "OpenId4VcController" } diff --git a/packages/consumption/src/consumption/ConsumptionIds.ts b/packages/consumption/src/consumption/ConsumptionIds.ts index 1c1b9b75f..0a9c5890c 100644 --- a/packages/consumption/src/consumption/ConsumptionIds.ts +++ b/packages/consumption/src/consumption/ConsumptionIds.ts @@ -3,6 +3,7 @@ import { CoreIdHelper } from "@nmshd/core-types"; export class ConsumptionIds { public static readonly draft = new CoreIdHelper("LCLDRF"); public static readonly setting = new CoreIdHelper("LCLSET"); + public static readonly requestedCredentialCacheEntry = new CoreIdHelper("LCLRCC"); public static readonly attribute = new CoreIdHelper("ATT"); public static readonly attributeForwardingDetails = new CoreIdHelper("ATTFD"); diff --git a/packages/consumption/src/modules/index.ts b/packages/consumption/src/modules/index.ts index 9d6a3d993..f87b84b52 100644 --- a/packages/consumption/src/modules/index.ts +++ b/packages/consumption/src/modules/index.ts @@ -3,5 +3,6 @@ export * from "./common"; export * from "./drafts"; export * from "./identityMetadata"; export * from "./notifications"; +export * from "./openid4vc"; export * from "./requests"; export * from "./settings"; diff --git a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts new file mode 100644 index 000000000..bbde2ee39 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts @@ -0,0 +1,132 @@ +import { DcqlValidCredential, W3cJsonCredential } from "@credo-ts/core"; +import { OpenId4VciResolvedCredentialOffer, OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; +import { VerifiableCredential } from "@nmshd/content"; +import { ConsumptionBaseController } from "../../consumption/ConsumptionBaseController"; +import { ConsumptionController } from "../../consumption/ConsumptionController"; +import { ConsumptionControllerName } from "../../consumption/ConsumptionControllerName"; +import { OwnIdentityAttribute } from "../attributes"; +import { Holder } from "./local/Holder"; +import { KeyStorage } from "./local/KeyStorage"; +import { OpenId4VciCredentialResponseJSON } from "./local/OpenId4VciCredentialResponseJSON"; +import { RequestedCredentialCache } from "./local/RequestedCredentialCache"; + +export class OpenId4VcController extends ConsumptionBaseController { + private holder: Holder; + private requestedCredentialCache: RequestedCredentialCache; + + public constructor(parent: ConsumptionController) { + super(ConsumptionControllerName.OpenId4VcController, parent); + } + + public override async init(): Promise { + const keyCollection = await this.parent.accountController.getSynchronizedCollection("openid4vc-keys"); + const keyStorage = new KeyStorage(keyCollection, this._log); + + this.holder = new Holder(keyStorage, this.parent.accountController, this.parent.attributes, this.fetchInstance); + await this.holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); + + const requestedCredentialsCacheCollection = await this.parent.accountController.getSynchronizedCollection("openid4vc-requested-credentials-cache"); + this.requestedCredentialCache = new RequestedCredentialCache(requestedCredentialsCacheCollection); + + return this; + } + + private get fetchInstance(): typeof fetch { + return this.parent.consumptionConfig.fetchInstance ?? fetch; + } + + public async requestAllCredentialsFromCredentialOfferUrl(credentialOfferUrl: string): Promise { + const cachedCredentialResponses = await this.requestedCredentialCache.get(credentialOfferUrl); + if (cachedCredentialResponses) return cachedCredentialResponses; + + const offer = await this.resolveCredentialOffer(credentialOfferUrl); + const credentialResponses = await this.requestCredentials(offer, offer.credentialOfferPayload.credential_configuration_ids, { pinCode: undefined }); + + await this.requestedCredentialCache.set(credentialOfferUrl, credentialResponses); + await this.parent.accountController.syncDatawallet(); + + return credentialResponses; + } + + public async resolveCredentialOffer(credentialOfferUrl: string): Promise { + return await this.holder.resolveCredentialOffer(credentialOfferUrl); + } + + public async requestCredentials( + credentialOffer: OpenId4VciResolvedCredentialOffer, + credentialConfigurationIds: string[], + access: { pinCode?: string } | { accessToken: string } + ): Promise { + const credentialResponses = await this.holder.requestCredentials(credentialOffer, credentialConfigurationIds, access); + + const mappedResponses = credentialResponses.map((response) => ({ + claimFormat: response.record.firstCredential.claimFormat, + encoded: response.record.firstCredential.encoded, + displayInformation: response.credentialConfiguration.credential_metadata?.display ?? (response.credentialConfiguration.display as Record[] | undefined) + })); + + return mappedResponses; + } + + public async storeCredentials(credentialResponses: OpenId4VciCredentialResponseJSON[]): Promise { + const credentials = await this.holder.storeCredentials(credentialResponses); + + // TODO: support multiple credentials + return credentials[0]; + } + + public async resolveAuthorizationRequest(authorizationRequestUrl: string): Promise<{ + authorizationRequest: OpenId4VpResolvedAuthorizationRequest; + matchingCredentials: OwnIdentityAttribute[]; + }> { + const authorizationRequest = await this.holder.resolveAuthorizationRequest(authorizationRequestUrl); + + const matchingCredentials = await this.extractMatchingCredentialsFromAuthorizationRequest(authorizationRequest); + + return { + authorizationRequest, + matchingCredentials + }; + } + + private async extractMatchingCredentialsFromAuthorizationRequest(authorizationRequest: OpenId4VpResolvedAuthorizationRequest): Promise { + const dcqlSatisfied = authorizationRequest.dcql?.queryResult.can_be_satisfied ?? false; + const pexSatisfied = authorizationRequest.presentationExchange?.credentialsForRequest.areRequirementsSatisfied ?? false; + if (!dcqlSatisfied && !pexSatisfied) return []; + + let matchedCredentials: (string | W3cJsonCredential)[] = []; + if (dcqlSatisfied) { + const queryId = authorizationRequest.dcql!.queryResult.credentials[0].id; // assume there is only one query for now + const queryResult = authorizationRequest.dcql!.queryResult.credential_matches[queryId]; + if (queryResult.success) { + matchedCredentials = queryResult.valid_credentials.map((vc: DcqlValidCredential) => vc.record.encoded).flat(); + } + } else if (pexSatisfied) { + matchedCredentials = authorizationRequest + .presentationExchange!.credentialsForRequest.requirements.map((entry) => + entry.submissionEntry.map((subEntry) => subEntry.verifiableCredentials.map((vc) => vc.credentialRecord.encoded)).flat() + ) + .flat(); + } + + const allCredentials = (await this.parent.attributes.getLocalAttributes({ + "@type": "OwnIdentityAttribute", + "content.value.@type": "VerifiableCredential" + })) as OwnIdentityAttribute[]; + + const matchingCredentials = allCredentials.filter((credential) => matchedCredentials.includes((credential.content.value as VerifiableCredential).value as string)); // in current demo scenarios this is a string + return matchingCredentials; + } + + public async acceptAuthorizationRequest( + authorizationRequest: OpenId4VpResolvedAuthorizationRequest, + credential: OwnIdentityAttribute + ): Promise<{ status: number; message: string | Record | null }> { + // parse the credential type to be sdjwt + + const serverResponse = await this.holder.acceptAuthorizationRequest(authorizationRequest, credential); + if (!serverResponse) throw new Error("No response from server"); + + return { status: serverResponse.status, message: serverResponse.body }; + } +} diff --git a/packages/consumption/src/modules/openid4vc/index.ts b/packages/consumption/src/modules/openid4vc/index.ts new file mode 100644 index 000000000..63337975d --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/index.ts @@ -0,0 +1,7 @@ +export * from "./local/BaseAgent"; +export * from "./local/EnmeshedHolderFileSystem"; +export * from "./local/EnmeshedHolderKeyManagmentService"; +export * from "./local/EnmeshedStorageService"; +export * from "./local/Holder"; +export * from "./local/OpenId4VciCredentialResponseJSON"; +export * from "./OpenId4VcController"; diff --git a/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts b/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts new file mode 100644 index 000000000..cd340c4e0 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/BaseAgent.ts @@ -0,0 +1,104 @@ +import { + Agent, + ConsoleLogger, + DependencyManager, + DidKey, + InjectionSymbols, + Kms, + LogLevel, + StorageVersionRecord, + type InitConfig, + type KeyDidCreateOptions, + type ModulesMap, + type VerificationMethod +} from "@credo-ts/core"; +import { AccountController } from "@nmshd/transport"; +import { EventEmitter } from "events"; +import webSocket from "ws"; +import { AttributesController } from "../../attributes"; +import { EnmeshedHolderFileSystem } from "./EnmeshedHolderFileSystem"; +import { EnmshedHolderKeyManagmentService } from "./EnmeshedHolderKeyManagmentService"; +import { EnmeshedStorageService } from "./EnmeshedStorageService"; +import { KeyStorage } from "./KeyStorage"; + +export class BaseAgent { + public config: InitConfig; + public agent: Agent; + public did!: string; + public didKey!: DidKey; + public kid!: string; + public verificationMethod!: VerificationMethod; + + public constructor( + private readonly keyStorage: KeyStorage, + modules: AgentModules, + accountController: AccountController, + attributeController: AttributesController, + fetchInstance: typeof fetch + ) { + const config = { + allowInsecureHttpUrls: true, + logger: new ConsoleLogger(LogLevel.off) + } satisfies InitConfig; + + this.config = config; + + const dependencyManager = new DependencyManager(); + dependencyManager.registerInstance(InjectionSymbols.StorageService, new EnmeshedStorageService(accountController, attributeController, this.keyStorage)); + this.agent = new Agent( + { + config, + dependencies: { + // eslint-disable-next-line @typescript-eslint/naming-convention + FileSystem: EnmeshedHolderFileSystem, + // eslint-disable-next-line @typescript-eslint/naming-convention + EventEmitterClass: EventEmitter, + fetch: fetchInstance, + // eslint-disable-next-line @typescript-eslint/naming-convention + WebSocketClass: webSocket + }, + modules + }, + dependencyManager + ); + } + + public async initializeAgent(privateKey: string): Promise { + // as we are not using askar we need to set the storage version + const storage = this.agent.dependencyManager.resolve>(InjectionSymbols.StorageService); + await storage.save(this.agent.context, new StorageVersionRecord({ storageVersion: "0.5.0" })); + + const kmsConfig = this.agent.dependencyManager.resolve(Kms.KeyManagementModuleConfig); + kmsConfig.registerBackend(new EnmshedHolderKeyManagmentService(this.keyStorage)); + + if (kmsConfig.backends.length === 0) throw new Error("No KMS backend registered"); + + await this.agent.initialize(); + + const keyId = privateKey; + const didCreateResult = await this.agent.dids.create({ + method: "key", + options: { + createKey: { + type: { + crv: "Ed25519", + kty: "OKP" + }, + keyId: keyId + } + } + }); + + this.did = didCreateResult.didState.did!; + this.didKey = DidKey.fromDid(this.did); + this.kid = `${this.did}#${this.didKey.publicJwk.fingerprint}`; + + const verificationMethod = didCreateResult.didState.didDocument?.dereferenceKey(this.kid, ["authentication"]); + if (!verificationMethod) throw new Error("No verification method found"); + this.verificationMethod = verificationMethod; + } + + public async shutdown(): Promise { + await this.agent.shutdown(); + } +} diff --git a/packages/consumption/src/modules/openid4vc/local/EnmeshedHolderFileSystem.ts b/packages/consumption/src/modules/openid4vc/local/EnmeshedHolderFileSystem.ts new file mode 100644 index 000000000..66473edb1 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/EnmeshedHolderFileSystem.ts @@ -0,0 +1,29 @@ +import { DownloadToFileOptions, FileSystem } from "@credo-ts/core"; + +// File system is not used since we don't use Askar or AnonCreds. +export class EnmeshedHolderFileSystem implements FileSystem { + public exists(_path: string): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public createDirectory(_path: string): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public copyFile(_sourcePath: string, _destinationPath: string): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public write(_path: string, _data: string): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public read(_path: string): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public delete(_path: string): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public downloadToFile(_url: string, _path: string, _options?: DownloadToFileOptions): Promise { + throw new Error("File system not implemented because previously not needed."); + } + public readonly dataPath: string; + public readonly cachePath: string; + public readonly tempPath: string; +} diff --git a/packages/consumption/src/modules/openid4vc/local/EnmeshedHolderKeyManagmentService.ts b/packages/consumption/src/modules/openid4vc/local/EnmeshedHolderKeyManagmentService.ts new file mode 100644 index 000000000..1f96938ee --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/EnmeshedHolderKeyManagmentService.ts @@ -0,0 +1,404 @@ +import { AgentContext, Kms } from "@credo-ts/core"; +import { ec as EC } from "elliptic"; + +import { SodiumWrapper } from "@nmshd/crypto"; +import sjcl from "sjcl"; +import { KeyStorage } from "./KeyStorage"; + +export interface JwkKeyPair { + publicKey: JsonWebKey; + privateKey: JsonWebKey; + keyType?: string; +} + +export class EnmshedHolderKeyManagmentService implements Kms.KeyManagementService { + public static readonly backend = "enmeshed"; + + public readonly backend = EnmshedHolderKeyManagmentService.backend; + + private readonly b64url = (bytes: Uint8Array) => SodiumWrapper.sodium.to_base64(bytes, (SodiumWrapper.sodium as any).base64_variants.URLSAFE_NO_PADDING); + private readonly b64urlDecode = (b64url: string) => SodiumWrapper.sodium.from_base64(b64url, (SodiumWrapper.sodium as any).base64_variants.URLSAFE_NO_PADDING); + + // please note: we cannot use buffer here - because it is not available in the browser + // and yes it could be pollyfilled but that extends the bundle size for no good reason + private readonly buf2hex = (bytes: Uint8Array) => { + return Array.from(bytes) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + }; + private readonly hex2buf = (hex: string) => { + const bytes = new Uint8Array(hex.length / 2); + for (let i = 0; i < bytes.length; i++) { + bytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16); + } + return bytes; + }; + + public constructor(private readonly keyStorage: KeyStorage) {} + + public isOperationSupported(agentContext: AgentContext, operation: Kms.KmsOperation): boolean { + agentContext.config.logger.debug(`EKM: Checking if operation is supported: ${JSON.stringify(operation)}`); + if (operation.operation === "createKey") { + if (operation.type.kty === "OKP") { + return true; + } + if (operation.type.kty === "EC" && operation.type.crv === "P-256") { + return true; + } + return false; + } + if (operation.operation === "verify" && operation.algorithm === "ES256") { + return true; + } + if (operation.operation === "sign" && (operation.algorithm === "EdDSA" || operation.algorithm === "ES256")) { + return true; + } + if (operation.operation === "randomBytes") { + return true; + } + if (operation.operation === "deleteKey") { + return true; + } + if (operation.operation === "encrypt" && ["A128GCM", "A256GCM"].includes(operation.encryption.algorithm)) { + return true; + } + return false; + } + public async getPublicKey(agentContext: AgentContext, keyId: string): Promise { + const keyPair = await this.keyStorage.getKey(keyId); + if (!keyPair) { + agentContext.config.logger.error(`EKM: Key with id ${keyId} not found`); + throw new Error(`Key with id ${keyId} not found`); + } + + return (JSON.parse(keyPair) as JwkKeyPair).publicKey as Kms.KmsJwkPublic; + } + public async createKey(agentContext: AgentContext, options: Kms.KmsCreateKeyOptions): Promise> { + options.keyId ??= "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + // Use libsodium's randombytes_uniform for secure random number generation + const r = SodiumWrapper.sodium.randombytes_uniform(16); + const v = c === "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); + + agentContext.config.logger.debug(`EKM: Creating key with id ${options.keyId} and type ${JSON.stringify(options.type)}`); + + if (options.type.kty === "EC" && options.type.crv === "P-256") { + // Use P-256 (aka secp256r1) + const ec = new EC("p256"); + const key = ec.genKeyPair(); + + // Public JWK + const publicJwk = { + kty: "EC", // Elliptic Curve + crv: "P-256", + x: this.b64url(new Uint8Array(key.getPublic().getX().toArray())), + y: this.b64url(new Uint8Array(key.getPublic().getY().toArray())) + }; + + // Private JWK + const privateJwk = { + ...publicJwk, + d: this.b64url(new Uint8Array(key.getPrivate().toArray())) + }; + + const jwkKeyPair = { + publicKey: publicJwk, + privateKey: privateJwk, + keyType: "EC" + }; + + agentContext.config.logger.debug(`EKM: Created EC key pair with id ${options.keyId}`); + // store the key pair in the keystore + await this.keyStorage.storeKey(options.keyId, JSON.stringify(jwkKeyPair)); + + // Credo doesn't trust the key id provided in the key binding jwk anymore, so there are two options: Storing the key id with the credential and making sure that key id is properly fetched - this turned out to be difficult - or the easy way out by storing this alternative key id computed from the public key. + const credoLegacyKeyId = Kms.PublicJwk.fromPublicJwk(publicJwk as any).legacyKeyId; + await this.keyStorage.storeKey(credoLegacyKeyId, JSON.stringify(jwkKeyPair)); + + return { keyId: options.keyId, publicJwk: publicJwk as Kms.KmsJwkPublic } as Kms.KmsCreateKeyReturn; + } + + const { keyType, publicKey, privateKey } = SodiumWrapper.sodium.crypto_sign_keypair(); + agentContext.config.logger.debug(`EKM: Created OKP key pair with id ${options.keyId} and keyType ${keyType}`); + const seed = privateKey.slice(0, (SodiumWrapper.sodium as any).crypto_sign_SEEDBYTES); + + // Public JWK + const publicJwk = { + kty: "OKP", // Octet Key Pair + crv: "Ed25519", + x: this.b64url(publicKey) + }; + + // Private JWK + const privateJwk = { + ...publicJwk, + d: this.b64url(seed) + }; + + const jwkKeyPair = { + publicKey: publicJwk, + privateKey: privateJwk, + keyType: "OKP" + }; + + await this.keyStorage.storeKey(options.keyId, JSON.stringify(jwkKeyPair)); + return { keyId: options.keyId, publicJwk: publicJwk as Kms.KmsJwkPublic } as Kms.KmsCreateKeyReturn; + } + + public importKey(agentContext: AgentContext, options: Kms.KmsImportKeyOptions): Promise> { + agentContext.config.logger.debug(`EKM: Importing key with ${JSON.stringify(options)}`); + throw new Error("Method not implemented."); + } + + public async deleteKey(agentContext: AgentContext, options: Kms.KmsDeleteKeyOptions): Promise { + const hasKey = await this.keyStorage.hasKey(options.keyId); + if (!hasKey) throw new Error(`key with id ${options.keyId} not found. and cannot be deleted`); + + agentContext.config.logger.debug(`EKM: Deleting key with id ${options.keyId}`); + await this.keyStorage.deleteKey(options.keyId); + return true; + } + + public async sign(agentContext: AgentContext, options: Kms.KmsSignOptions): Promise { + agentContext.config.logger.debug(`EKM: Signing data with key id ${options.keyId} using algorithm ${options.algorithm}`); + + const stringifiedKeyPair = await this.keyStorage.getKey(options.keyId); + if (!stringifiedKeyPair) { + throw new Error(`Key with id ${options.keyId} not found`); + } + + const { privateKey, publicKey } = JSON.parse(stringifiedKeyPair) as JwkKeyPair; + + if (options.algorithm === "ES256") { + // Use P-256 (aka secp256r1) + const ec = new EC("p256"); + if (!privateKey.d) { + throw new Error("Private JWK does not contain 'd' parameter"); + } + + const priv = this.buf2hex(this.b64urlDecode(privateKey.d)); + const key = ec.keyFromPrivate(priv, "hex"); + + // we need to hash the data using SHA-256 + const dataHash = ec.hash().update(options.data).digest(); + const signature = key.sign(dataHash); + const r = new Uint8Array(signature.r.toArray()); + const s = new Uint8Array(signature.s.toArray()); + const signatureBytes = new Uint8Array(r.length + s.length); + signatureBytes.set(r); + signatureBytes.set(s, r.length); + + return await Promise.resolve({ + signature: signatureBytes + } as Kms.KmsSignReturn); + } + + const decode = (bytes: string) => SodiumWrapper.sodium.from_base64(bytes, (SodiumWrapper.sodium as any).base64_variants.URLSAFE_NO_PADDING); + // get the private key bytes + if (privateKey.d === undefined) { + throw new Error("Private key does not contain 'd' parameter"); + } + const privateKeyBytes = decode(privateKey.d); + + // get the public key bytes + if (publicKey.x === undefined) { + throw new Error("Public key does not contain 'x' parameter"); + } + const publicKeyBytes = decode(publicKey.x); + + // combine the key bytes to a full private key + const fullPrivateKeyBytes = new Uint8Array(privateKeyBytes.length + publicKeyBytes.length); + fullPrivateKeyBytes.set(privateKeyBytes); + fullPrivateKeyBytes.set(publicKeyBytes, privateKeyBytes.length); + + // and use it to sign the data + const signature = SodiumWrapper.sodium.crypto_sign_detached(options.data, fullPrivateKeyBytes); + + return { + signature: signature as Uint8Array // I hope this cast doesn't paper over something + }; + } + + public verify(agentContext: AgentContext, options: Kms.KmsVerifyOptions): Promise { + agentContext.config.logger.debug(`EKM: Verifying signature with key id ${options.key.keyId} using algorithm ${options.algorithm}`); + // Use P-256 (aka secp256r1) + const ec = new EC("p256"); + if (!options.key.publicJwk) { + throw new Error("Public JWK is undefined"); + } + if (options.key.publicJwk.kty !== "EC") { + throw new Error("Public JWK does not contain 'x' or 'y' parameter"); + } + + const x = options.key.publicJwk.x; + const y = options.key.publicJwk.y; + + const pub = { x: this.buf2hex(this.b64urlDecode(x)), y: this.buf2hex(this.b64urlDecode(y)) }; + const key = ec.keyFromPublic(pub, "hex"); + + const signatureBytes = options.signature; + const r = signatureBytes.subarray(0, 32); + const s = signatureBytes.subarray(32, 64); + const signature = { r: this.buf2hex(r), s: this.buf2hex(s) }; + + // we need to hash the data using SHA-256 + const dataHash = ec.hash().update(options.data).digest(); + try { + const verified = key.verify(dataHash, signature); + return Promise.resolve({ verified: verified } as Kms.KmsVerifyReturn); + } catch (e) { + agentContext.config.logger.error(`EKM: Error during signature verification: ${e}`); + throw e; + } + } + + private async ecdhEs(localKeyId: string, remotePublicJWK: any): Promise { + const keyPairString = await this.keyStorage.getKey(localKeyId); + if (!keyPairString) { + throw new Error(`Key with id ${localKeyId} not found`); + } + + const localKeyPair = JSON.parse(keyPairString) as JwkKeyPair; + if (localKeyPair.keyType !== "EC") { + throw new Error("Key type is not EC"); + } + + const ec = new EC("p256"); + + if (localKeyPair.privateKey.d === undefined) { + throw new Error("Local private key does not contain 'd' parameter"); + } + const localPriv = ec.keyFromPrivate(this.buf2hex(this.b64urlDecode(localKeyPair.privateKey.d)), "hex"); + // the remote jwk is base64url encoded - we again decode and transform to hex to receive a fitting public key + const remoteBasePoint = ec.keyFromPublic( + { + x: this.buf2hex(this.b64urlDecode(remotePublicJWK.x)), + y: this.buf2hex(this.b64urlDecode(remotePublicJWK.y)) + }, + "hex" + ); + + const sharedSecret = localPriv.derive(remoteBasePoint.getPublic()); + const sharedBytes = new Uint8Array(sharedSecret.toArray("be")); + return sharedBytes; + } + + // UTF-8 encode helper + private utf8(str: string): Uint8Array { + return new TextEncoder().encode(str); + } + + // Concat Uint8Arrays + private concat(...arrays: Uint8Array[]): Uint8Array { + const total = arrays.reduce((sum, a) => sum + a.length, 0); + const out = new Uint8Array(total); + let offset = 0; + for (const a of arrays) { + out.set(a, offset); + offset += a.length; + } + return out; + } + + // Encode a 32-bit big-endian length prefix + private lenPrefix(data: Uint8Array): Uint8Array { + const buf = new Uint8Array(4 + data.length); + const view = new DataView(buf.buffer); + view.setUint32(0, data.length, false); // big-endian + buf.set(data, 4); + return buf; + } + + private concatKdf(sharedSecret: Uint8Array, keyLength: number, algorithmDescriptor: string, keyAgreement: any): Uint8Array { + if (keyAgreement.apu === undefined) { + throw new Error("Key agreement apu is undefined"); + } + if (keyAgreement.apv === undefined) { + throw new Error("Key agreement apv is undefined"); + } + + const algId = this.lenPrefix(this.utf8(algorithmDescriptor)); + const partyU = this.lenPrefix(keyAgreement.apu); + const partyV = this.lenPrefix(keyAgreement.apv); + + const suppPubInfo = new Uint8Array(4); + new DataView(suppPubInfo.buffer).setUint32(0, keyLength, false); + const suppPrivInfo = new Uint8Array(0); + const otherInfo = this.concat(algId, partyU, partyV, suppPubInfo, suppPrivInfo); + const counter = new Uint8Array([0, 0, 0, 1]); + const input = this.concat(counter, sharedSecret, otherInfo); + + // Hash with SHA-256 (SJCL) + const inputHex = this.buf2hex(input); + const inputBits = sjcl.codec.hex.toBits(inputHex); + const hashBits = sjcl.hash.sha256.hash(inputBits); + const hashHex = sjcl.codec.hex.fromBits(hashBits); + const hashBuf = this.hex2buf(hashHex); + + // Truncate to desired key length + return hashBuf.subarray(0, keyLength / 8); + } + + public async encrypt(agentContext: AgentContext, options: Kms.KmsEncryptOptions): Promise { + try { + // encryption via A-128-GCM/A-256-GCM + // we will call the services side bob and the incoming side alice + if (options.key.keyAgreement === undefined) { + throw new Error("Key agreement is undefined"); + } + if (options.key.keyAgreement.keyId === undefined) { + throw new Error("Key agreement keyId is undefined"); + } + + const algorithm = options.encryption.algorithm; + const keyLength = options.encryption.algorithm === "A128GCM" ? 128 : 256; + + // 1. derive the shared secret via ECDH-ES + const sharedSecret = await this.ecdhEs(options.key.keyAgreement.keyId, options.key.keyAgreement.externalPublicJwk); + agentContext.config.logger.debug(`EKM: Derived shared secret for encryption using ECDH-ES`); + // 2. Concat KDF to form the final key + const derivedKey = this.concatKdf(sharedSecret, keyLength, algorithm, options.key.keyAgreement); + // 3. Encrypt the data via AES-256-GCM using libsodium + + // create nonce + const iv = crypto.getRandomValues(new Uint8Array(12)); + // transform to bit arrays for sjcl + const keyBits = sjcl.codec.hex.toBits(this.buf2hex(derivedKey)); + const dataBits = sjcl.codec.hex.toBits(this.buf2hex(options.data)); + const ivBits = sjcl.codec.hex.toBits(this.buf2hex(iv)); + // do not forget to add the additional authenticated data + const aadBits = "aad" in options.encryption && options.encryption.aad ? sjcl.codec.hex.toBits(this.buf2hex(options.encryption.aad)) : []; + // setup aes + const aes = new sjcl.cipher.aes(keyBits); + // encrypt + const cyphertextBits = sjcl.mode.gcm.encrypt(aes, dataBits, ivBits, aadBits, 128); + + // transform back to byte array + const cyphertextBuf = this.hex2buf(sjcl.codec.hex.fromBits(cyphertextBits)); + // In SJCL, GCM output = ciphertext || tag + const cyphertext = cyphertextBuf.subarray(0, cyphertextBuf.length - 16); + const tag = cyphertextBuf.subarray(cyphertextBuf.length - 16); + + const returnValue = { + encrypted: cyphertext, + iv: iv, + tag: tag + }; + + return returnValue; + } catch (e) { + agentContext.config.logger.error(`EKM: Error during encryption: ${e}`); + throw e; + } + } + + public decrypt(agentContext: AgentContext, options: Kms.KmsDecryptOptions): Promise { + agentContext.config.logger.debug(`EKM: Decrypting data with key id ${options.key.keyId} using options ${options}`); + throw new Error("Method not implemented."); + } + public randomBytes(agentContext: AgentContext, options: Kms.KmsRandomBytesOptions): Kms.KmsRandomBytesReturn { + agentContext.config.logger.debug(`EKM: Generating ${options.length} random bytes`); + return SodiumWrapper.sodium.randombytes_buf(options.length); // Uint8Array + } +} diff --git a/packages/consumption/src/modules/openid4vc/local/EnmeshedStorageService.ts b/packages/consumption/src/modules/openid4vc/local/EnmeshedStorageService.ts new file mode 100644 index 000000000..68d4fa679 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/EnmeshedStorageService.ts @@ -0,0 +1,130 @@ +import { AgentContext, BaseRecord, BaseRecordConstructor, ClaimFormat, injectable, Query, QueryOptions, SdJwtVcRecord, StorageService } from "@credo-ts/core"; +import { IdentityAttribute, VerifiableCredential } from "@nmshd/content"; +import { AccountController } from "@nmshd/transport"; +import { OwnIdentityAttribute } from "../../attributes"; +import { AttributesController } from "../../attributes/AttributesController"; +import { KeyStorage } from "./KeyStorage"; + +@injectable() +export class EnmeshedStorageService implements StorageService { + public storage: Map = new Map(); + public constructor( + private readonly accountController: AccountController, + private readonly attributeController: AttributesController, + private readonly keyStorage: KeyStorage + ) {} + + public save(_agentContext: AgentContext, record: T): Promise { + if (record.id !== "STORAGE_VERSION_RECORD_ID" && record.type !== "DidRecord") { + throw new Error("Only storage of STORAGE_VERSION_RECORD_ID and DidRecord implemented because others previously not needed"); + } + + this.storage.set(record.id, record); + return Promise.resolve(); + } + + public async saveWithDisplay( + agentContext: AgentContext, + value: string | Record, + type: string, + displayInformation?: Record[] + ): Promise { + const owner = this.accountController.identity.address; + const identityAttribute = IdentityAttribute.from({ + value: { + "@type": "VerifiableCredential", + value: value, + type: type, + displayInformation: displayInformation + }, + owner: owner + }); + const result = await this.attributeController.createOwnIdentityAttribute({ + content: identityAttribute + }); + agentContext.config.logger.debug(`Saved record: ${JSON.stringify(result)}`); + return await Promise.resolve(result); + } + + public update(_agentContext: AgentContext, _record: T): Promise { + throw new Error("Storage update not implemented because previously not needed"); + } + + public delete(_agentContext: AgentContext, _record: T): Promise { + throw new Error("Storage delete not implemented because previously not needed"); + } + + public deleteById(_agentContext: AgentContext, _recordClass: BaseRecordConstructor, _id: string): Promise { + throw new Error("Storage delete not implemented because previously not needed"); + } + + public getById(_agentContext: AgentContext, _recordClass: BaseRecordConstructor, id: string): Promise { + const record = this.storage.get(id); + if (!record) throw new Error(`Record with id ${id} not found`); + return Promise.resolve(record); + } + + public async getAll(_agentContext: AgentContext, recordClass: BaseRecordConstructor): Promise { + // so far only encountered in the credential context + const recordType = recordClass.type; + const correspondingCredentialType = this.recordTypeToCredentialType(recordType); + + const attributes = await this.attributeController.getLocalAttributes({ + "@type": "OwnIdentityAttribute", + "content.value.@type": "VerifiableCredential", + "content.value.type": correspondingCredentialType + }); + + return attributes.map((attribute) => { + const attributeValue = attribute.content.value as VerifiableCredential; + return decodeRecord(correspondingCredentialType, attributeValue.value) as T; + }); + } + + private recordTypeToCredentialType(recordType: string): string { + switch (recordType) { + case SdJwtVcRecord.name: + return ClaimFormat.SdJwtDc; + default: + throw new Error("Record type not supported."); + } + } + + public async findByQuery(agentContext: AgentContext, recordClass: BaseRecordConstructor, query: Query, queryOptions?: QueryOptions): Promise { + // so far only encountered in the credential context + agentContext.config.logger.debug(`Finding records by query ${JSON.stringify(query)} and options ${JSON.stringify(queryOptions)}`); + const records: T[] = []; + for (const record of await this.getAll(agentContext, recordClass)) { + if (this.matchesQuery(record, query)) { + records.push(record); + } + } + if (records.length === 0) { + // try to recover over local storage - temporary fix + for (const record of this.storage.values()) { + if (this.matchesQuery(record, query)) { + records.push(record); + } + } + } + return records; + } + + private matchesQuery(record: BaseRecord, query: Query): boolean { + return Object.entries(query).every(([key, value]) => { + if (key === "$or") { + return (value as any[]).some((subquery) => this.matchesQuery(record, subquery)); + } + return record.getTags()[key] === value; + }); + } +} + +export function decodeRecord(type: string, encoded: string | Record): BaseRecord { + switch (type) { + case ClaimFormat.SdJwtDc: + return new SdJwtVcRecord({ credentialInstances: [{ compactSdJwtVc: encoded as string }] }); + default: + throw new Error("Credential type not supported."); + } +} diff --git a/packages/consumption/src/modules/openid4vc/local/Holder.ts b/packages/consumption/src/modules/openid4vc/local/Holder.ts new file mode 100644 index 000000000..022f37e1c --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/Holder.ts @@ -0,0 +1,181 @@ +import { BaseRecord, ClaimFormat, DidJwk, DidKey, InjectionSymbols, JwkDidCreateOptions, KeyDidCreateOptions, Kms, X509Module } from "@credo-ts/core"; +import { OpenId4VciCredentialResponse, OpenId4VcModule, type OpenId4VciResolvedCredentialOffer, type OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; +import { VerifiableCredential } from "@nmshd/content"; +import { AccountController } from "@nmshd/transport"; +import { AttributesController, OwnIdentityAttribute } from "../../attributes"; +import { BaseAgent } from "./BaseAgent"; +import { decodeRecord, EnmeshedStorageService } from "./EnmeshedStorageService"; +import { KeyStorage } from "./KeyStorage"; +import { OpenId4VciCredentialResponseJSON } from "./OpenId4VciCredentialResponseJSON"; + +function getOpenIdHolderModules() { + return { + openid4vc: new OpenId4VcModule(), + x509: new X509Module({ + getTrustedCertificatesForVerification: (_agentContext, { certificateChain, verification }) => { + // eslint-disable-next-line no-console + console.log(`dynamically trusting certificate ${certificateChain[0].getIssuerNameField("C")} for verification of ${verification.type}`); + return [certificateChain[0].toString("pem")]; + } + }) + } as const; +} + +export class Holder extends BaseAgent> { + public client = { + clientId: "wallet", + redirectUri: "http://localhost:3000/redirect" + }; + + public constructor(keyStorage: KeyStorage, accountController: AccountController, attributeController: AttributesController, fetchInstance: typeof fetch) { + super(keyStorage, getOpenIdHolderModules(), accountController, attributeController, fetchInstance); + } + + public async resolveCredentialOffer(credentialOffer: string): Promise { + return await this.agent.openid4vc.holder.resolveCredentialOffer(credentialOffer); + } + + public async requestCredentials( + resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer, + credentialConfigurationIds: string[], + access: { accessToken: string } | { pinCode?: string } + ): Promise { + const tokenResponse = + "accessToken" in access + ? { + accessToken: access.accessToken, + accessTokenResponse: { + // eslint-disable-next-line @typescript-eslint/naming-convention + access_token: access.accessToken, + // eslint-disable-next-line @typescript-eslint/naming-convention + token_type: "bearer" + } + } + : await this.agent.openid4vc.holder.requestToken({ resolvedCredentialOffer, txCode: access.pinCode }); + + const credentialResponse = await this.agent.openid4vc.holder.requestCredentials({ + resolvedCredentialOffer, + credentialConfigurationIds: credentialConfigurationIds, + credentialBindingResolver: async ({ supportedDidMethods, supportsAllDidMethods, proofTypes }) => { + const key = await this.agent.kms.createKeyForSignatureAlgorithm({ + algorithm: proofTypes.jwt?.supportedSignatureAlgorithms[0] ?? "EdDSA" + }); + const publicJwk = Kms.PublicJwk.fromPublicJwk(key.publicJwk); + + if (supportsAllDidMethods || supportedDidMethods?.includes("did:key")) { + await this.agent.dids.create({ + method: "key", + options: { + keyId: key.keyId + } + }); + const didKey = new DidKey(publicJwk); + + return { + method: "did", + didUrls: [`${didKey.did}#${didKey.publicJwk.fingerprint}`] + }; + } + if (supportedDidMethods?.includes("did:jwk")) { + const didJwk = DidJwk.fromPublicJwk(publicJwk); + await this.agent.dids.create({ + method: "jwk", + options: { + keyId: key.keyId + } + }); + + return { + method: "did", + didUrls: [`${didJwk.did}#0`] + }; + } + + // We fall back on jwk binding + return { + method: "jwk", + keys: [publicJwk] + }; + }, + ...tokenResponse + }); + + this.agent.config.logger.info("Credential response:", credentialResponse); + + return credentialResponse.credentials; + } + + public async storeCredentials(credentialResponses: OpenId4VciCredentialResponseJSON[]): Promise { + const storedCredentials = await Promise.all( + credentialResponses.map((credentialResponse) => { + if (![ClaimFormat.SdJwtW3cVc, ClaimFormat.SdJwtDc, ClaimFormat.MsoMdoc].includes(credentialResponse.claimFormat)) { + throw new Error("Unsupported credential format"); + } + + const enmeshedStorageService = this.agent.dependencyManager.resolve>(InjectionSymbols.StorageService); + + return enmeshedStorageService.saveWithDisplay( + this.agent.context, + credentialResponse.encoded, + credentialResponse.claimFormat, + credentialResponse.displayInformation + ); + }) + ); + + this.agent.config.logger.info(`Stored credentials: ${JSON.stringify(storedCredentials)}`); + return storedCredentials; + } + + public async resolveAuthorizationRequest(request: string): Promise { + const resolvedRequest = await this.agent.openid4vc.holder.resolveOpenId4VpAuthorizationRequest(request); + return resolvedRequest; + } + + public async acceptAuthorizationRequest( + resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest, + credential: OwnIdentityAttribute + ): Promise< + | { + readonly status: number; + readonly body: string | Record | null; + } + | { + readonly status: number; + readonly body: Record; + } + | undefined + > { + if (!resolvedAuthorizationRequest.dcql) { + throw new Error("Missing dcql on resolved authorization request"); + } + + const credentialContent = credential.content.value as VerifiableCredential; + const credentialRecord = decodeRecord(credentialContent.type, credentialContent.value); + + const queryId = resolvedAuthorizationRequest.dcql.queryResult.credentials[0].id; + const credentialForDcql = { + [queryId]: [ + { + credentialRecord, + claimFormat: credentialContent.type as any, + disclosedPayload: {} // TODO: implement SD properly + } + ] + } as any; + + const submissionResult = await this.agent.openid4vc.holder.acceptOpenId4VpAuthorizationRequest({ + authorizationRequestPayload: resolvedAuthorizationRequest.authorizationRequestPayload, + dcql: { credentials: credentialForDcql } + }); + return submissionResult.serverResponse; + } + + public async exit(): Promise { + await this.shutdown(); + } + + public async restart(): Promise { + await this.shutdown(); + } +} diff --git a/packages/consumption/src/modules/openid4vc/local/KeyStorage.ts b/packages/consumption/src/modules/openid4vc/local/KeyStorage.ts new file mode 100644 index 000000000..3453307d0 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/KeyStorage.ts @@ -0,0 +1,64 @@ +import { ILogger } from "@js-soft/logging-abstractions"; +import { serialize, validate } from "@js-soft/ts-serval"; +import { CoreId } from "@nmshd/core-types"; +import { CoreSynchronizable, ICoreSynchronizable, SynchronizedCollection } from "@nmshd/transport"; +import { nameof } from "ts-simple-nameof"; + +interface IKeyStorageEntry extends ICoreSynchronizable { + key: any; +} + +class KeyStorageEntry extends CoreSynchronizable { + public override technicalProperties: string[] = [nameof((r) => r.key)]; + + @serialize({ any: true }) + @validate() + public key: any; + + public static from(entry: IKeyStorageEntry): KeyStorageEntry { + return this.fromAny(entry); + } +} + +export class KeyStorage { + public constructor( + private readonly collection: SynchronizedCollection, + private readonly logger: ILogger + ) {} + + public async hasKey(keyId: string): Promise { + const entry = await this.collection.read(keyId); + return !!entry; + } + + public async storeKey(keyId: string, keyData: any): Promise { + const entry = await this.collection.read(keyId); + if (entry) { + this.logger.info(`Key with id ${keyId} already exists`); + return; + } + + await this.collection.create(KeyStorageEntry.from({ id: CoreId.from(keyId), key: keyData })); + } + + public async getKey(keyId: string): Promise { + const entry = await this.collection.read(keyId); + if (!entry) { + this.logger.warn(`Key with id ${keyId} not found`); + return undefined; + } + + const parsed = KeyStorageEntry.from(entry); + return parsed.key; + } + + public async deleteKey(keyId: string): Promise { + const entry = await this.collection.read(keyId); + if (!entry) { + this.logger.warn(`Key with id ${keyId} not found, cannot delete`); + return; + } + + await this.collection.delete(KeyStorageEntry.from(entry)); + } +} diff --git a/packages/consumption/src/modules/openid4vc/local/OpenId4VciCredentialResponseJSON.ts b/packages/consumption/src/modules/openid4vc/local/OpenId4VciCredentialResponseJSON.ts new file mode 100644 index 000000000..8484f4788 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/OpenId4VciCredentialResponseJSON.ts @@ -0,0 +1,7 @@ +import { ClaimFormat, W3cJsonCredential } from "@credo-ts/core"; + +export interface OpenId4VciCredentialResponseJSON { + claimFormat: ClaimFormat; + encoded: string | W3cJsonCredential; + displayInformation?: Record[]; +} diff --git a/packages/consumption/src/modules/openid4vc/local/RequestedCredentialCache.ts b/packages/consumption/src/modules/openid4vc/local/RequestedCredentialCache.ts new file mode 100644 index 000000000..dfcfa5e99 --- /dev/null +++ b/packages/consumption/src/modules/openid4vc/local/RequestedCredentialCache.ts @@ -0,0 +1,43 @@ +import { serialize, validate } from "@js-soft/ts-serval"; +import { CoreId } from "@nmshd/core-types"; +import { CoreSynchronizable, SynchronizedCollection } from "@nmshd/transport"; +import { nameof } from "ts-simple-nameof"; +import { ConsumptionIds } from "../../../consumption/ConsumptionIds"; +import { OpenId4VciCredentialResponseJSON } from "./OpenId4VciCredentialResponseJSON"; + +class RequestedCredentialCacheEntry extends CoreSynchronizable { + public override technicalProperties: string[] = [ + nameof((r) => r.credentialOfferUrl), + nameof((r) => r.credentialResponses) + ]; + + @serialize() + @validate() + public credentialOfferUrl: string; + + @serialize({ any: true }) + @validate() + public credentialResponses: OpenId4VciCredentialResponseJSON[]; + + public static create(id: CoreId, credentialOfferUrl: string, credentialResponses: OpenId4VciCredentialResponseJSON[]): RequestedCredentialCacheEntry { + return this.fromAny({ + id: id, + credentialOfferUrl: credentialOfferUrl, + credentialResponses + }); + } +} + +export class RequestedCredentialCache { + public constructor(private readonly collection: SynchronizedCollection) {} + + public async get(credentialOfferUrl: string): Promise { + const doc = await this.collection.findOne({ credentialOfferUrl: credentialOfferUrl }); + return doc ? RequestedCredentialCacheEntry.fromAny(doc).credentialResponses : undefined; + } + + public async set(credentialOfferUrl: string, credentialResponses: OpenId4VciCredentialResponseJSON[]): Promise { + const id = await ConsumptionIds.requestedCredentialCacheEntry.generate(); + await this.collection.create(RequestedCredentialCacheEntry.create(id, credentialOfferUrl, credentialResponses)); + } +} diff --git a/packages/consumption/src/modules/requests/events/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts b/packages/consumption/src/modules/requests/events/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts new file mode 100644 index 000000000..6296d65d0 --- /dev/null +++ b/packages/consumption/src/modules/requests/events/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts @@ -0,0 +1,16 @@ +import { CoreAddress } from "@nmshd/core-types"; +import { TransportDataEvent } from "@nmshd/transport"; + +export interface ShareCredentialOfferRequestItemProcessedByRecipientEventData { + credentialOfferUrl: string; + accepted: boolean; + peer: CoreAddress; +} + +export class ShareCredentialOfferRequestItemProcessedByRecipientEvent extends TransportDataEvent { + public static readonly namespace = "consumption.shareCredentialOfferRequestItemProcessedByRecipient"; + + public constructor(eventTargetAddress: string, data: ShareCredentialOfferRequestItemProcessedByRecipientEventData) { + super(ShareCredentialOfferRequestItemProcessedByRecipientEvent.namespace, eventTargetAddress, data); + } +} diff --git a/packages/consumption/src/modules/requests/events/index.ts b/packages/consumption/src/modules/requests/events/index.ts index 0e6febf86..36068ce3f 100644 --- a/packages/consumption/src/modules/requests/events/index.ts +++ b/packages/consumption/src/modules/requests/events/index.ts @@ -3,3 +3,4 @@ export * from "./IncomingRequestStatusChangedEvent"; export * from "./OutgoingRequestCreatedAndCompletedEvent"; export * from "./OutgoingRequestCreatedEvent"; export * from "./OutgoingRequestStatusChangedEvent"; +export * from "./ShareCredentialOfferRequestItemProcessedByRecipientEvent"; diff --git a/packages/consumption/src/modules/requests/index.ts b/packages/consumption/src/modules/requests/index.ts index 5918b2832..985d56e91 100644 --- a/packages/consumption/src/modules/requests/index.ts +++ b/packages/consumption/src/modules/requests/index.ts @@ -30,6 +30,7 @@ export * from "./itemProcessors/RequestItemConstructor"; export * from "./itemProcessors/RequestItemProcessorConstructor"; export * from "./itemProcessors/RequestItemProcessorRegistry"; export * from "./itemProcessors/shareAttribute/ShareAttributeRequestItemProcessor"; +export * from "./itemProcessors/shareCredentialOffer/ShareCredentialOfferRequestItemProcessor"; export * from "./itemProcessors/transferFileOwnership/TransferFileOwnershipRequestItemProcessor"; export * from "./local/LocalRequest"; export * from "./local/LocalRequestStatus"; diff --git a/packages/consumption/src/modules/requests/itemProcessors/shareCredentialOffer/ShareCredentialOfferRequestItemProcessor.ts b/packages/consumption/src/modules/requests/itemProcessors/shareCredentialOffer/ShareCredentialOfferRequestItemProcessor.ts new file mode 100644 index 000000000..3350e6573 --- /dev/null +++ b/packages/consumption/src/modules/requests/itemProcessors/shareCredentialOffer/ShareCredentialOfferRequestItemProcessor.ts @@ -0,0 +1,65 @@ +import { AcceptResponseItem, RejectResponseItem, Request, ResponseItemResult, ShareCredentialOfferRequestItem } from "@nmshd/content"; +import { CoreAddress } from "@nmshd/core-types"; +import { ConsumptionCoreErrors } from "../../../../consumption/ConsumptionCoreErrors"; +import { ValidationResult } from "../../../common/ValidationResult"; +import { ShareCredentialOfferRequestItemProcessedByRecipientEvent } from "../../events"; +import { AcceptRequestItemParametersJSON } from "../../incoming/decide/AcceptRequestItemParameters"; +import { GenericRequestItemProcessor } from "../GenericRequestItemProcessor"; +import { LocalRequestInfo } from "../IRequestItemProcessor"; + +export class ShareCredentialOfferRequestItemProcessor extends GenericRequestItemProcessor { + public override async canCreateOutgoingRequestItem(requestItem: ShareCredentialOfferRequestItem, _request: Request, _recipient?: CoreAddress): Promise { + if (process.env.TEST_ENVIRONMENT === "container") return ValidationResult.success(); // for the test scenario that this runs inside a container which can't resolve a localhost credential offer + // TODO: look for alternative approaches + + const offer = await this.consumptionController.openId4Vc.resolveCredentialOffer(requestItem.credentialOfferUrl); + + const preAuthorizedCodeGrant = offer.credentialOfferPayload.grants?.["urn:ietf:params:oauth:grant-type:pre-authorized_code"]; + const isUnauthenticatedOffer = preAuthorizedCodeGrant && !preAuthorizedCodeGrant.tx_code; + if (!isUnauthenticatedOffer) { + return ValidationResult.error( + ConsumptionCoreErrors.requests.invalidRequestItem("Only unauthenticated credential offers (pre-authorized code grants without tx_code) are supported.") + ); + } + + return ValidationResult.success(); + } + + public override async canAccept( + requestItem: ShareCredentialOfferRequestItem, + _params: AcceptRequestItemParametersJSON, + _requestInfo: LocalRequestInfo + ): Promise { + try { + await this.consumptionController.openId4Vc.requestAllCredentialsFromCredentialOfferUrl(requestItem.credentialOfferUrl); + return ValidationResult.success(); + } catch (error) { + return ValidationResult.error( + ConsumptionCoreErrors.requests.invalidRequestItem(`The credential offer at URL '${requestItem.credentialOfferUrl}' could not be processed. Cause: ${error}`) + ); + } + } + + public override async accept( + requestItem: ShareCredentialOfferRequestItem, + _params: AcceptRequestItemParametersJSON, + _requestInfo: LocalRequestInfo + ): Promise { + const cachedCredentials = await this.consumptionController.openId4Vc.requestAllCredentialsFromCredentialOfferUrl(requestItem.credentialOfferUrl); + await this.consumptionController.openId4Vc.storeCredentials(cachedCredentials); + + return AcceptResponseItem.from({ result: ResponseItemResult.Accepted }); + } + + public override applyIncomingResponseItem( + responseItem: AcceptResponseItem | RejectResponseItem, + requestItem: ShareCredentialOfferRequestItem, + requestInfo: LocalRequestInfo + ): ShareCredentialOfferRequestItemProcessedByRecipientEvent { + return new ShareCredentialOfferRequestItemProcessedByRecipientEvent(this.currentIdentityAddress.toString(), { + credentialOfferUrl: requestItem.credentialOfferUrl, + accepted: responseItem.result === ResponseItemResult.Accepted, + peer: requestInfo.peer + }); + } +} diff --git a/packages/consumption/src/modules/requests/outgoing/OutgoingRequestsController.ts b/packages/consumption/src/modules/requests/outgoing/OutgoingRequestsController.ts index 40c958d83..068248b40 100644 --- a/packages/consumption/src/modules/requests/outgoing/OutgoingRequestsController.ts +++ b/packages/consumption/src/modules/requests/outgoing/OutgoingRequestsController.ts @@ -387,7 +387,8 @@ export class OutgoingRequestsController extends ConsumptionBaseController { private async applyItem(requestItem: RequestItem, responseItem: ResponseItem, request: LocalRequest) { const processor = this.processorRegistry.getProcessorForItem(requestItem); - await processor.applyIncomingResponseItem(responseItem, requestItem, request); + const event = await processor.applyIncomingResponseItem(responseItem, requestItem, request); + if (event) this.eventBus.publish(event); } public async getOutgoingRequests(query?: any): Promise { diff --git a/packages/consumption/test/tsconfig.json b/packages/consumption/test/tsconfig.json index db9a0d1ee..3bbf071a7 100644 --- a/packages/consumption/test/tsconfig.json +++ b/packages/consumption/test/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "baseUrl": "../", "noEmit": true, - "composite": false + "composite": false, + "allowJs": true // we want to use the ts compiler to compile ESM node modules into CJS which is understood by jest. This is required since those node modules are javascript. }, "files": ["../../../node_modules/jest-expect-message/types/index.d.ts"], "include": ["**/*.ts", "../src/**/*.ts"], diff --git a/packages/content/src/attributes/AttributeValueTypes.ts b/packages/content/src/attributes/AttributeValueTypes.ts index fcd4dcaa6..b42eb111a 100644 --- a/packages/content/src/attributes/AttributeValueTypes.ts +++ b/packages/content/src/attributes/AttributeValueTypes.ts @@ -71,6 +71,7 @@ import { ISex, IStreetAddress, ISurname, + IVerifiableCredential, IWebsite, JobTitle, JobTitleJSON, @@ -120,6 +121,8 @@ import { StreetAddressJSON, Surname, SurnameJSON, + VerifiableCredential, + VerifiableCredentialJSON, Website, WebsiteJSON } from "./types"; @@ -155,6 +158,7 @@ export namespace AttributeValues { | SexJSON | StreetAddressJSON | SurnameJSON + | VerifiableCredentialJSON | WebsiteJSON; export type Interface = @@ -183,6 +187,7 @@ export namespace AttributeValues { | ISex | IStreetAddress | ISurname + | IVerifiableCredential | IWebsite; export type Class = @@ -211,6 +216,7 @@ export namespace AttributeValues { | Sex | StreetAddress | Surname + | VerifiableCredential | Website; export const CLASSES = [ @@ -239,6 +245,7 @@ export namespace AttributeValues { Sex, StreetAddress, Surname, + VerifiableCredential, Website ]; @@ -268,6 +275,7 @@ export namespace AttributeValues { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] as const; diff --git a/packages/content/src/attributes/types/VerifiableCredential.ts b/packages/content/src/attributes/types/VerifiableCredential.ts new file mode 100644 index 000000000..dee12cb09 --- /dev/null +++ b/packages/content/src/attributes/types/VerifiableCredential.ts @@ -0,0 +1,69 @@ +import { serialize, type, validate } from "@js-soft/ts-serval"; +import { AbstractAttributeValue, AbstractAttributeValueJSON, IAbstractAttributeValue } from "../AbstractAttributeValue"; +import { RenderHints, RenderHintsEditType, RenderHintsTechnicalType, ValueHints } from "../hints"; +import { PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH } from "./proprietary/ProprietaryAttributeValue"; + +export interface VerifiableCredentialJSON extends AbstractAttributeValueJSON { + "@type": "VerifiableCredential"; + value: string | Record; + type: string; + displayInformation?: Record[]; +} + +export interface IVerifiableCredential extends IAbstractAttributeValue { + value: string | Record; + type: string; + displayInformation?: Record[]; +} + +@type("VerifiableCredential") +export class VerifiableCredential extends AbstractAttributeValue implements IVerifiableCredential { + @serialize({ any: true }) + @validate({ customValidator: validateValue }) + public value: string | Record; + + @serialize() + @validate({ nullable: true }) + public type: string; + + @serialize() + @validate({ nullable: true, max: PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH }) + public displayInformation?: Record[]; + + public static get valueHints(): ValueHints { + return ValueHints.from({}); + } + + public static get renderHints(): RenderHints { + return RenderHints.from({ + editType: RenderHintsEditType.TextArea, + technicalType: RenderHintsTechnicalType.Unknown + }); + } + + public static from(value: IVerifiableCredential | Omit): VerifiableCredential { + return this.fromAny(value); + } + + public override toJSON(verbose?: boolean | undefined, serializeAsString?: boolean | undefined): VerifiableCredentialJSON { + return super.toJSON(verbose, serializeAsString) as VerifiableCredentialJSON; + } +} + +function validateValue(value: any) { + try { + const string = JSON.stringify(value); + // the length correspondes to 50MB - maybe this needs to be restricted further in the future + if (string.length > 52428800) { + return "stringified value must not be longer than 52428800 characters"; + } + } catch (e) { + if (e instanceof SyntaxError) { + return "must be a valid JSON object"; + } + + return "could not validate value"; + } + + return undefined; +} diff --git a/packages/content/src/attributes/types/index.ts b/packages/content/src/attributes/types/index.ts index 09a678cba..e7f261d7d 100644 --- a/packages/content/src/attributes/types/index.ts +++ b/packages/content/src/attributes/types/index.ts @@ -16,3 +16,4 @@ export * from "./proprietary"; export * from "./relationship"; export * from "./statement"; export * from "./strings"; +export * from "./VerifiableCredential"; diff --git a/packages/content/src/requests/RequestItem.ts b/packages/content/src/requests/RequestItem.ts index ef2f425b9..27bb7fbab 100644 --- a/packages/content/src/requests/RequestItem.ts +++ b/packages/content/src/requests/RequestItem.ts @@ -19,6 +19,7 @@ import { IProposeAttributeRequestItem, IReadAttributeRequestItem, IShareAttributeRequestItem, + IShareCredentialOfferRequestItem, ITransferFileOwnershipRequestItem, ProposeAttributeRequestItem, ProposeAttributeRequestItemJSON, @@ -26,6 +27,8 @@ import { ReadAttributeRequestItemJSON, ShareAttributeRequestItem, ShareAttributeRequestItemJSON, + ShareCredentialOfferRequestItem, + ShareCredentialOfferRequestItemJSON, TransferFileOwnershipRequestItem, TransferFileOwnershipRequestItemJSON } from "./items"; @@ -61,7 +64,8 @@ export type RequestItemJSONDerivations = | ConsentRequestItemJSON | AuthenticationRequestItemJSON | FormFieldRequestItemJSON - | TransferFileOwnershipRequestItemJSON; + | TransferFileOwnershipRequestItemJSON + | ShareCredentialOfferRequestItemJSON; export interface IRequestItem extends ISerializable { /** @@ -94,7 +98,8 @@ export type IRequestItemDerivations = | IConsentRequestItem | IAuthenticationRequestItem | IFormFieldRequestItem - | ITransferFileOwnershipRequestItem; + | ITransferFileOwnershipRequestItem + | IShareCredentialOfferRequestItem; export abstract class RequestItem extends Serializable { @serialize() @@ -124,7 +129,8 @@ export type RequestItemDerivations = | ConsentRequestItem | AuthenticationRequestItem | FormFieldRequestItem - | TransferFileOwnershipRequestItem; + | TransferFileOwnershipRequestItem + | ShareCredentialOfferRequestItem; export function isRequestItemDerivation(input: any): input is RequestItemDerivations { return ( @@ -137,6 +143,7 @@ export function isRequestItemDerivation(input: any): input is RequestItemDerivat input["@type"] === "ConsentRequestItem" || input["@type"] === "AuthenticationRequestItem" || input["@type"] === "FormFieldRequestItem" || - input["@type"] === "TransferFileOwnershipRequestItem" + input["@type"] === "TransferFileOwnershipRequestItem" || + input["@type"] === "ShareCredentialOfferRequestItem" ); } diff --git a/packages/content/src/requests/items/index.ts b/packages/content/src/requests/items/index.ts index af2fd29ad..9428c0c81 100644 --- a/packages/content/src/requests/items/index.ts +++ b/packages/content/src/requests/items/index.ts @@ -14,5 +14,6 @@ export * from "./proposeAttribute/ProposeAttributeRequestItem"; export * from "./readAttribute/ReadAttributeAcceptResponseItem"; export * from "./readAttribute/ReadAttributeRequestItem"; export * from "./shareAttribute/ShareAttributeRequestItem"; +export * from "./shareCredentialOffer/ShareCredentialOfferRequestItem"; export * from "./transferFileOwnership/TransferFileOwnershipAcceptResponseItem"; export * from "./transferFileOwnership/TransferFileOwnershipRequestItem"; diff --git a/packages/content/src/requests/items/shareCredentialOffer/ShareCredentialOfferRequestItem.ts b/packages/content/src/requests/items/shareCredentialOffer/ShareCredentialOfferRequestItem.ts new file mode 100644 index 000000000..97fe3699c --- /dev/null +++ b/packages/content/src/requests/items/shareCredentialOffer/ShareCredentialOfferRequestItem.ts @@ -0,0 +1,29 @@ +import { serialize, type, validate } from "@js-soft/ts-serval"; +import { RequestItemJSON } from "../.."; +import { IRequestItem, RequestItem } from "../../RequestItem"; + +export interface ShareCredentialOfferRequestItemJSON extends RequestItemJSON { + "@type": "ShareCredentialOfferRequestItem"; + credentialOfferUrl: string; +} + +export interface IShareCredentialOfferRequestItem extends IRequestItem { + credentialOfferUrl: string; +} + +@type("ShareCredentialOfferRequestItem") +export class ShareCredentialOfferRequestItem extends RequestItem implements IShareCredentialOfferRequestItem { + @serialize() + @validate() + public credentialOfferUrl: string; + + public static from( + value: IShareCredentialOfferRequestItem | Omit | ShareCredentialOfferRequestItemJSON + ): ShareCredentialOfferRequestItem { + return this.fromAny(value); + } + + public override toJSON(verbose?: boolean | undefined, serializeAsString?: boolean | undefined): ShareCredentialOfferRequestItemJSON { + return super.toJSON(verbose, serializeAsString) as ShareCredentialOfferRequestItemJSON; + } +} diff --git a/packages/runtime/package.json b/packages/runtime/package.json index f3621c414..aa7fe93bf 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -51,13 +51,29 @@ "testEnvironment": "node", "testTimeout": 60000, "transform": { - "^.+\\.ts$": [ + "^.+\\.(t|j)s$": [ "ts-jest", { "tsconfig": "test/tsconfig.json" } + ], + "^.+\\.mjs$": [ + "babel-jest", + { + "presets": [ + [ + "@babel/preset-env", + { + "modules": "commonjs" + } + ] + ] + } ] - } + }, + "transformIgnorePatterns": [ + "/node_modules/(?!(@noble|@stablelib|@credo\\-ts)/)" + ] }, "dependencies": { "@js-soft/docdb-querytranslator": "^1.1.6", @@ -75,6 +91,7 @@ "ajv": "^8.18.0", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", + "elliptic": "^6.6.1", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.23", "luxon": "^3.7.2", @@ -85,9 +102,14 @@ "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", "@js-soft/node-logger": "1.2.1", + "@nmshd/connector-sdk": "^7.3.0", + "@types/elliptic": "^6.4.18", "@types/json-stringify-safe": "^5.0.3", "@types/lodash": "^4.17.24", "@types/luxon": "^3.7.1", + "jwt-decode": "^4.0.0", + "@eudiplo/sdk-core": "^1.16.0", + "openid-client": "^6.8.1", "ts-json-schema-generator": "2.5.0", "ts-mockito": "^2.6.1" }, diff --git a/packages/runtime/src/Runtime.ts b/packages/runtime/src/Runtime.ts index b240d61b1..33aa70f07 100644 --- a/packages/runtime/src/Runtime.ts +++ b/packages/runtime/src/Runtime.ts @@ -8,6 +8,7 @@ import { IdentityMetadataController, IncomingRequestsController, NotificationsController, + OpenId4VcController, OutgoingRequestsController, SettingsController } from "@nmshd/consumption"; @@ -314,6 +315,10 @@ export abstract class Runtime { .factory(() => this.getConsumptionController().notifications) .scope(Scope.Request); + Container.bind(OpenId4VcController) + .factory(() => this.getConsumptionController().openId4Vc) + .scope(Scope.Request); + Container.bind(AnonymousTokenController) .factory(() => new AnonymousTokenController(this.transport.config, this.correlator)) .scope(Scope.Singleton); diff --git a/packages/runtime/src/dataViews/DataViewExpander.ts b/packages/runtime/src/dataViews/DataViewExpander.ts index ccfbd6b35..0501b29fd 100644 --- a/packages/runtime/src/dataViews/DataViewExpander.ts +++ b/packages/runtime/src/dataViews/DataViewExpander.ts @@ -2,6 +2,7 @@ import { Serializable, SerializableBase } from "@js-soft/ts-serval"; import { ConsumptionController, LocalRequestStatus, + OpenId4VciCredentialResponseJSON, OwnIdentityAttribute, OwnRelationshipAttribute, PeerIdentityAttribute, @@ -49,6 +50,7 @@ import { ResponseJSON, SexJSON, ShareAttributeRequestItemJSON, + ShareCredentialOfferRequestItemJSON, SurnameJSON, ThirdPartyRelationshipAttributeQueryJSON, TransferFileOwnershipAcceptResponseItemJSON, @@ -132,6 +134,7 @@ import { ResponseItemDVO, ResponseItemGroupDVO, ShareAttributeRequestItemDVO, + ShareCredentialOfferRequestItemDVO, ThirdPartyRelationshipAttributeQueryDVO, TransferFileOwnershipAcceptResponseItemDVO, TransferFileOwnershipRequestItemDVO @@ -139,6 +142,7 @@ import { import { FileDVO, IdentityDVO, MessageDVO, MessageStatus, RecipientDVO, RelationshipDVO, RelationshipDirection, RelationshipTemplateDVO } from "./transport"; export class DataViewExpander { + private readonly credentialOfferCache = new Map>(); public constructor( @Inject private readonly transport: TransportServices, @Inject private readonly consumption: ConsumptionServices, @@ -634,6 +638,40 @@ export class DataViewExpander { file } as TransferFileOwnershipRequestItemDVO; + case "ShareCredentialOfferRequestItem": + const shareCredentialOfferRequestItem = requestItem as ShareCredentialOfferRequestItemJSON; + + // Use cache to avoid duplication of requests for the same URL + let credentialResponsesPromise = this.credentialOfferCache.get(shareCredentialOfferRequestItem.credentialOfferUrl); + + if (!credentialResponsesPromise) { + credentialResponsesPromise = (async () => { + try { + return await this.consumptionController.openId4Vc.requestAllCredentialsFromCredentialOfferUrl(shareCredentialOfferRequestItem.credentialOfferUrl); + } catch { + this.credentialOfferCache.delete(shareCredentialOfferRequestItem.credentialOfferUrl); + return undefined; + } + })(); + + this.credentialOfferCache.set(shareCredentialOfferRequestItem.credentialOfferUrl, credentialResponsesPromise); + } + const credentialResponses = await credentialResponsesPromise; + + if (credentialResponses === undefined) { + throw new Error("A credential offer could not be retrieved."); + } + + return { + ...shareCredentialOfferRequestItem, + type: "ShareCredentialOfferRequestItemDVO", + id: "", + name: this.generateRequestItemName(requestItem["@type"], isDecidable), + isDecidable: isDecidable && credentialResponses.length > 0, + response: responseItemDVO, + credentialResponses + } as ShareCredentialOfferRequestItemDVO; + default: return { ...requestItem, diff --git a/packages/runtime/src/dataViews/content/RequestItemDVOs.ts b/packages/runtime/src/dataViews/content/RequestItemDVOs.ts index c3b4226bb..ff22c5901 100644 --- a/packages/runtime/src/dataViews/content/RequestItemDVOs.ts +++ b/packages/runtime/src/dataViews/content/RequestItemDVOs.ts @@ -1,3 +1,4 @@ +import { OpenId4VciCredentialResponseJSON } from "@nmshd/consumption"; import { FormFieldSettingsJSONDerivations } from "@nmshd/content"; import { LocalAttributeDVO } from "../consumption"; import { DataViewObject } from "../DataViewObject"; @@ -75,3 +76,9 @@ export interface TransferFileOwnershipRequestItemDVO extends RequestItemDVO { file: FileDVO; ownershipToken: string; } + +export interface ShareCredentialOfferRequestItemDVO extends RequestItemDVO { + type: "ShareCredentialOfferRequestItemDVO"; + credentialOfferUrl: string; + credentialResponses?: OpenId4VciCredentialResponseJSON[]; +} diff --git a/packages/runtime/src/events/EventProxy.ts b/packages/runtime/src/events/EventProxy.ts index ed9ecfc4b..3e07cedb9 100644 --- a/packages/runtime/src/events/EventProxy.ts +++ b/packages/runtime/src/events/EventProxy.ts @@ -16,7 +16,8 @@ import { OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent, OutgoingRequestStatusChangedEvent, OwnAttributeDeletedByOwnerEvent, - PeerRelationshipAttributeDeletedByPeerEvent + PeerRelationshipAttributeDeletedByPeerEvent, + ShareCredentialOfferRequestItemProcessedByRecipientEvent } from "./consumption"; import { DatawalletSynchronizedEvent, @@ -206,6 +207,16 @@ export class EventProxy { }) ); }); + + this.subscribeToSourceEvent(consumption.ShareCredentialOfferRequestItemProcessedByRecipientEvent, (event) => { + this.targetEventBus.publish( + new ShareCredentialOfferRequestItemProcessedByRecipientEvent(event.eventTargetAddress, { + credentialOfferUrl: event.data.credentialOfferUrl, + accepted: event.data.accepted, + peer: event.data.peer.toString() + }) + ); + }); } private subscribeToSourceEvent(subscriptionTarget: SubscriptionTarget, handler: EventHandler) { diff --git a/packages/runtime/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts b/packages/runtime/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts new file mode 100644 index 000000000..827a35267 --- /dev/null +++ b/packages/runtime/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts @@ -0,0 +1,15 @@ +import { DataEvent } from "../DataEvent"; + +export interface ShareCredentialOfferRequestItemProcessedByRecipientEventData { + credentialOfferUrl: string; + accepted: boolean; + peer: string; +} + +export class ShareCredentialOfferRequestItemProcessedByRecipientEvent extends DataEvent { + public static readonly namespace = "consumption.shareCredentialOfferRequestItemProcessedByRecipient"; + + public constructor(eventTargetAddress: string, data: ShareCredentialOfferRequestItemProcessedByRecipientEventData) { + super(ShareCredentialOfferRequestItemProcessedByRecipientEvent.namespace, eventTargetAddress, data); + } +} diff --git a/packages/runtime/src/events/consumption/index.ts b/packages/runtime/src/events/consumption/index.ts index 0adbf3cd9..02ea9ed25 100644 --- a/packages/runtime/src/events/consumption/index.ts +++ b/packages/runtime/src/events/consumption/index.ts @@ -16,3 +16,4 @@ export * from "./OwnAttributeDeletedByOwnerEvent"; export * from "./PeerRelationshipAttributeDeletedByPeerEvent"; export * from "./RelationshipEvent"; export * from "./RelationshipTemplateProcessedEvent"; +export * from "./ShareCredentialOfferRequestItemProcessedByRecipientEvent"; diff --git a/packages/runtime/src/extensibility/ConsumptionServices.ts b/packages/runtime/src/extensibility/ConsumptionServices.ts index 1f0e439e8..e3330e09e 100644 --- a/packages/runtime/src/extensibility/ConsumptionServices.ts +++ b/packages/runtime/src/extensibility/ConsumptionServices.ts @@ -1,5 +1,14 @@ import { Inject } from "@nmshd/typescript-ioc"; -import { AttributesFacade, DraftsFacade, IdentityMetadataFacade, IncomingRequestsFacade, NotificationsFacade, OutgoingRequestsFacade, SettingsFacade } from "./facades/consumption"; +import { + AttributesFacade, + DraftsFacade, + IdentityMetadataFacade, + IncomingRequestsFacade, + NotificationsFacade, + OpenId4VcFacade, + OutgoingRequestsFacade, + SettingsFacade +} from "./facades/consumption"; export class ConsumptionServices { public constructor( @@ -9,6 +18,7 @@ export class ConsumptionServices { @Inject public readonly incomingRequests: IncomingRequestsFacade, @Inject public readonly outgoingRequests: OutgoingRequestsFacade, @Inject public readonly notifications: NotificationsFacade, - @Inject public readonly identityMetadata: IdentityMetadataFacade + @Inject public readonly identityMetadata: IdentityMetadataFacade, + @Inject public readonly openId4Vc: OpenId4VcFacade ) {} } diff --git a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts new file mode 100644 index 000000000..cbf960bb2 --- /dev/null +++ b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts @@ -0,0 +1,25 @@ +import { Result } from "@js-soft/ts-utils"; +import { Inject } from "@nmshd/typescript-ioc"; +import { + AcceptAuthorizationRequestRequest, + AcceptAuthorizationRequestResponse, + AcceptAuthorizationRequestUseCase, + ResolveAuthorizationRequestRequest, + ResolveAuthorizationRequestResponse, + ResolveAuthorizationRequestUseCase +} from "../../../useCases"; + +export class OpenId4VcFacade { + public constructor( + @Inject private readonly resolveAuthorizationRequestUseCase: ResolveAuthorizationRequestUseCase, + @Inject private readonly acceptAuthorizationRequestUseCase: AcceptAuthorizationRequestUseCase + ) {} + + public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise> { + return await this.resolveAuthorizationRequestUseCase.execute(request); + } + + public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise> { + return await this.acceptAuthorizationRequestUseCase.execute(request); + } +} diff --git a/packages/runtime/src/extensibility/facades/consumption/index.ts b/packages/runtime/src/extensibility/facades/consumption/index.ts index 393475997..b0f7ce168 100644 --- a/packages/runtime/src/extensibility/facades/consumption/index.ts +++ b/packages/runtime/src/extensibility/facades/consumption/index.ts @@ -3,5 +3,6 @@ export * from "./DraftsFacade"; export * from "./IdentityMetadataFacade"; export * from "./IncomingRequestsFacade"; export * from "./NotificationsFacade"; +export * from "./OpenId4VcFacade"; export * from "./OutgoingRequestsFacade"; export * from "./SettingsFacade"; diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index 3635a86e3..d7b435748 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -314,6 +314,12 @@ export const CanCreateOutgoingRequestRequest: any = { }, { "$ref": "#/definitions/TransferFileOwnershipRequestItemJSON" + }, + { + "$ref": "#/definitions/ShareCredentialOfferRequestItemJSON" + }, + { + "$ref": "#/definitions/ShareAuthorizationRequestRequestItemJSON" } ] }, @@ -1176,6 +1182,9 @@ export const CanCreateOutgoingRequestRequest: any = { { "$ref": "#/definitions/SurnameJSON" }, + { + "$ref": "#/definitions/VerifiableCredentialJSON" + }, { "$ref": "#/definitions/WebsiteJSON" } @@ -1852,6 +1861,46 @@ export const CanCreateOutgoingRequestRequest: any = { ], "additionalProperties": false }, + "VerifiableCredentialJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + }, "WebsiteJSON": { "type": "object", "properties": { @@ -2114,6 +2163,7 @@ export const CanCreateOutgoingRequestRequest: any = { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] }, @@ -2699,6 +2749,78 @@ export const CanCreateOutgoingRequestRequest: any = { ], "additionalProperties": false }, + "ShareCredentialOfferRequestItemJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "ShareCredentialOfferRequestItem" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "description": { + "type": "string", + "description": "The human-readable description of this item." + }, + "metadata": { + "type": "object", + "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." + }, + "mustBeAccepted": { + "type": "boolean", + "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." + }, + "credentialOfferUrl": { + "type": "string" + } + }, + "required": [ + "@type", + "credentialOfferUrl", + "mustBeAccepted" + ], + "additionalProperties": false + }, + "ShareAuthorizationRequestRequestItemJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "ShareAuthorizationRequestRequestItem" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "description": { + "type": "string", + "description": "The human-readable description of this item." + }, + "metadata": { + "type": "object", + "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." + }, + "mustBeAccepted": { + "type": "boolean", + "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." + }, + "authorizationRequestUrl": { + "type": "string" + } + }, + "required": [ + "@type", + "authorizationRequestUrl", + "mustBeAccepted" + ], + "additionalProperties": false + }, "AddressString": { "type": "string", "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" @@ -3213,6 +3335,9 @@ export const CompleteOutgoingRequestRequest: any = { { "$ref": "#/definitions/SurnameJSON" }, + { + "$ref": "#/definitions/VerifiableCredentialJSON" + }, { "$ref": "#/definitions/WebsiteJSON" } @@ -3889,6 +4014,46 @@ export const CompleteOutgoingRequestRequest: any = { ], "additionalProperties": false }, + "VerifiableCredentialJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + }, "WebsiteJSON": { "type": "object", "properties": { @@ -5238,6 +5403,9 @@ export const CreateAndCompleteOutgoingRequestFromRelationshipTemplateResponseReq { "$ref": "#/definitions/SurnameJSON" }, + { + "$ref": "#/definitions/VerifiableCredentialJSON" + }, { "$ref": "#/definitions/WebsiteJSON" } @@ -5914,6 +6082,46 @@ export const CreateAndCompleteOutgoingRequestFromRelationshipTemplateResponseReq ], "additionalProperties": false }, + "VerifiableCredentialJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + }, "WebsiteJSON": { "type": "object", "properties": { @@ -7018,6 +7226,12 @@ export const CreateOutgoingRequestRequest: any = { }, { "$ref": "#/definitions/TransferFileOwnershipRequestItemJSON" + }, + { + "$ref": "#/definitions/ShareCredentialOfferRequestItemJSON" + }, + { + "$ref": "#/definitions/ShareAuthorizationRequestRequestItemJSON" } ] }, @@ -7880,6 +8094,9 @@ export const CreateOutgoingRequestRequest: any = { { "$ref": "#/definitions/SurnameJSON" }, + { + "$ref": "#/definitions/VerifiableCredentialJSON" + }, { "$ref": "#/definitions/WebsiteJSON" } @@ -8556,6 +8773,46 @@ export const CreateOutgoingRequestRequest: any = { ], "additionalProperties": false }, + "VerifiableCredentialJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + }, "WebsiteJSON": { "type": "object", "properties": { @@ -8818,6 +9075,7 @@ export const CreateOutgoingRequestRequest: any = { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] }, @@ -9403,27 +9661,99 @@ export const CreateOutgoingRequestRequest: any = { ], "additionalProperties": false }, - "AddressString": { - "type": "string", - "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" - } - } -} - -export const DeleteIncomingRequestRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/DeleteIncomingRequestRequest", - "definitions": { - "DeleteIncomingRequestRequest": { + "ShareCredentialOfferRequestItemJSON": { "type": "object", "properties": { - "requestId": { + "@type": { + "type": "string", + "const": "ShareCredentialOfferRequestItem" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "description": { + "type": "string", + "description": "The human-readable description of this item." + }, + "metadata": { + "type": "object", + "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." + }, + "mustBeAccepted": { + "type": "boolean", + "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." + }, + "credentialOfferUrl": { "type": "string" } }, "required": [ - "requestId" - ], + "@type", + "credentialOfferUrl", + "mustBeAccepted" + ], + "additionalProperties": false + }, + "ShareAuthorizationRequestRequestItemJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "ShareAuthorizationRequestRequestItem" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "description": { + "type": "string", + "description": "The human-readable description of this item." + }, + "metadata": { + "type": "object", + "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." + }, + "mustBeAccepted": { + "type": "boolean", + "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." + }, + "authorizationRequestUrl": { + "type": "string" + } + }, + "required": [ + "@type", + "authorizationRequestUrl", + "mustBeAccepted" + ], + "additionalProperties": false + }, + "AddressString": { + "type": "string", + "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" + } + } +} + +export const DeleteIncomingRequestRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/DeleteIncomingRequestRequest", + "definitions": { + "DeleteIncomingRequestRequest": { + "type": "object", + "properties": { + "requestId": { + "type": "string" + } + }, + "required": [ + "requestId" + ], "additionalProperties": false } } @@ -10061,6 +10391,12 @@ export const ReceivedIncomingRequestRequest: any = { }, { "$ref": "#/definitions/TransferFileOwnershipRequestItemJSON" + }, + { + "$ref": "#/definitions/ShareCredentialOfferRequestItemJSON" + }, + { + "$ref": "#/definitions/ShareAuthorizationRequestRequestItemJSON" } ] }, @@ -10923,6 +11259,9 @@ export const ReceivedIncomingRequestRequest: any = { { "$ref": "#/definitions/SurnameJSON" }, + { + "$ref": "#/definitions/VerifiableCredentialJSON" + }, { "$ref": "#/definitions/WebsiteJSON" } @@ -11599,6 +11938,46 @@ export const ReceivedIncomingRequestRequest: any = { ], "additionalProperties": false }, + "VerifiableCredentialJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + }, "WebsiteJSON": { "type": "object", "properties": { @@ -11861,6 +12240,7 @@ export const ReceivedIncomingRequestRequest: any = { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] }, @@ -12446,6 +12826,78 @@ export const ReceivedIncomingRequestRequest: any = { ], "additionalProperties": false }, + "ShareCredentialOfferRequestItemJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "ShareCredentialOfferRequestItem" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "description": { + "type": "string", + "description": "The human-readable description of this item." + }, + "metadata": { + "type": "object", + "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." + }, + "mustBeAccepted": { + "type": "boolean", + "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." + }, + "credentialOfferUrl": { + "type": "string" + } + }, + "required": [ + "@type", + "credentialOfferUrl", + "mustBeAccepted" + ], + "additionalProperties": false + }, + "ShareAuthorizationRequestRequestItemJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "ShareAuthorizationRequestRequestItem" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "description": { + "type": "string", + "description": "The human-readable description of this item." + }, + "metadata": { + "type": "object", + "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." + }, + "mustBeAccepted": { + "type": "boolean", + "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." + }, + "authorizationRequestUrl": { + "type": "string" + } + }, + "required": [ + "@type", + "authorizationRequestUrl", + "mustBeAccepted" + ], + "additionalProperties": false + }, "MessageIdString": { "type": "string", "pattern": "MSG[A-Za-z0-9]{17}" @@ -13381,6 +13833,7 @@ export const ExecuteIdentityAttributeQueryRequest: any = { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] }, @@ -13485,6 +13938,7 @@ export const ExecuteIQLQueryRequest: any = { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] }, @@ -14957,6 +15411,9 @@ export const SucceedOwnIdentityAttributeRequest: any = { { "$ref": "#/definitions/SurnameJSON" }, + { + "$ref": "#/definitions/VerifiableCredentialJSON" + }, { "$ref": "#/definitions/WebsiteJSON" } @@ -15633,6 +16090,46 @@ export const SucceedOwnIdentityAttributeRequest: any = { ], "additionalProperties": false }, + "VerifiableCredentialJSON": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + }, "WebsiteJSON": { "type": "object", "properties": { @@ -16441,6 +16938,7 @@ export const ValidateIQLQueryRequest: any = { "Sex", "StreetAddress", "Surname", + "VerifiableCredential", "Website" ] }, @@ -16807,6 +17305,187 @@ export const SentNotificationRequest: any = { } } +export const AcceptAuthorizationRequestRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AcceptAuthorizationRequestRequest", + "definitions": { + "AcceptAuthorizationRequestRequest": { + "type": "object", + "additionalProperties": false, + "properties": { + "authorizationRequest": { + "type": "object" + }, + "attributeId": { + "type": "string" + } + }, + "required": [ + "attributeId", + "authorizationRequest" + ] + } + } +} + +export const CreatePresentationTokenRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/CreatePresentationTokenRequest", + "definitions": { + "CreatePresentationTokenRequest": { + "type": "object", + "properties": { + "attributeId": { + "type": "string" + } + }, + "required": [ + "attributeId" + ], + "additionalProperties": false + } + } +} + +export const RequestCredentialsRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/RequestCredentialsRequest", + "definitions": { + "RequestCredentialsRequest": { + "$ref": "#/definitions/AbstractRequestCredentialsRequest%3Calias-2033348025-74138-74264-2033348025-0-218439%3Cstring%2Cany%3E%3E" + }, + "AbstractRequestCredentialsRequest>": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "credentialOffer": { + "type": "object" + }, + "credentialConfigurationIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "credentialConfigurationIds", + "credentialOffer" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "pinCode": { + "type": "string" + }, + "credentialOffer": { + "type": "object" + }, + "credentialConfigurationIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "credentialConfigurationIds", + "credentialOffer", + "pinCode" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "accessToken": { + "type": "string" + }, + "credentialOffer": { + "type": "object" + }, + "credentialConfigurationIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "accessToken", + "credentialConfigurationIds", + "credentialOffer" + ] + } + ] + } + } +} + +export const ResolveAuthorizationRequestRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/ResolveAuthorizationRequestRequest", + "definitions": { + "ResolveAuthorizationRequestRequest": { + "type": "object", + "properties": { + "authorizationRequestUrl": { + "type": "string" + } + }, + "required": [ + "authorizationRequestUrl" + ], + "additionalProperties": false + } + } +} + +export const ResolveCredentialOfferRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/ResolveCredentialOfferRequest", + "definitions": { + "ResolveCredentialOfferRequest": { + "type": "object", + "properties": { + "credentialOfferUrl": { + "type": "string" + } + }, + "required": [ + "credentialOfferUrl" + ], + "additionalProperties": false + } + } +} + +export const StoreCredentialsRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/StoreCredentialsRequest", + "definitions": { + "StoreCredentialsRequest": { + "type": "object", + "additionalProperties": false, + "properties": { + "credentialResponses": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "credentialResponses" + ] + } + } +} + export const CreateSettingRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/CreateSettingRequest", @@ -20919,4 +21598,51 @@ export const Sex: any = { "additionalProperties": false } } +} + +export const VerifiableCredential: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/VerifiableCredential", + "definitions": { + "VerifiableCredential": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "const": "VerifiableCredential" + }, + "@context": { + "type": "string" + }, + "@version": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "type": { + "type": "string" + }, + "displayInformation": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "@type", + "type", + "value" + ], + "additionalProperties": false + } + } } \ No newline at end of file diff --git a/packages/runtime/src/useCases/consumption/index.ts b/packages/runtime/src/useCases/consumption/index.ts index 9989c2439..7beee07e7 100644 --- a/packages/runtime/src/useCases/consumption/index.ts +++ b/packages/runtime/src/useCases/consumption/index.ts @@ -2,5 +2,6 @@ export * from "./attributes"; export * from "./drafts"; export * from "./identityMetadata"; export * from "./notifications"; +export * from "./openid4vc"; export * from "./requests"; export * from "./settings"; diff --git a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts new file mode 100644 index 000000000..0a6447906 --- /dev/null +++ b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts @@ -0,0 +1,44 @@ +import { OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; +import { Result } from "@js-soft/ts-utils"; +import { AttributesController, LocalAttribute, OpenId4VcController, OwnIdentityAttribute } from "@nmshd/consumption"; +import { CoreId } from "@nmshd/core-types"; +import { Inject } from "@nmshd/typescript-ioc"; +import { RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; + +export interface AbstractAcceptAuthorizationRequestRequest { + authorizationRequest: T; + attributeId: string; +} + +export interface AcceptAuthorizationRequestRequest extends AbstractAcceptAuthorizationRequestRequest {} + +export interface SchemaValidatableAcceptAuthorizationRequestRequest extends AbstractAcceptAuthorizationRequestRequest> {} + +export interface AcceptAuthorizationRequestResponse { + status: number; + message: string; +} + +class Validator extends SchemaValidator { + public constructor(@Inject schemaRepository: SchemaRepository) { + super(schemaRepository.getSchema("AcceptAuthorizationRequestRequest")); + } +} + +export class AcceptAuthorizationRequestUseCase extends UseCase { + public constructor( + @Inject private readonly openId4VcController: OpenId4VcController, + @Inject private readonly attributesController: AttributesController, + @Inject validator: Validator + ) { + super(validator); + } + + protected override async executeInternal(request: AcceptAuthorizationRequestRequest): Promise> { + const credential = (await this.attributesController.getLocalAttribute(CoreId.from(request.attributeId))) as OwnIdentityAttribute | undefined; + if (!credential) return Result.fail(RuntimeErrors.general.recordNotFound(LocalAttribute)); + + const result = await this.openId4VcController.acceptAuthorizationRequest(request.authorizationRequest, credential); + return Result.ok({ status: result.status, message: JSON.stringify(result.message) }); + } +} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts new file mode 100644 index 000000000..dbc25e7d4 --- /dev/null +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts @@ -0,0 +1,63 @@ +import { DcqlValidCredential } from "@credo-ts/core"; +import { OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; +import { Result } from "@js-soft/ts-utils"; +import { OpenId4VcController } from "@nmshd/consumption"; +import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { Inject } from "@nmshd/typescript-ioc"; +import stringifySafe from "json-stringify-safe"; +import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; +import { AttributeMapper } from "../attributes"; + +export interface ResolveAuthorizationRequestRequest { + authorizationRequestUrl: string; +} + +export interface ResolveAuthorizationRequestResponse { + authorizationRequest: OpenId4VpResolvedAuthorizationRequest; + matchingCredentials: LocalAttributeDTO[]; +} + +class Validator extends SchemaValidator { + public constructor(@Inject schemaRepository: SchemaRepository) { + super(schemaRepository.getSchema("ResolveAuthorizationRequestRequest")); + } +} + +export class ResolveAuthorizationRequestUseCase extends UseCase { + public constructor( + @Inject private readonly openId4VcController: OpenId4VcController, + @Inject validator: Validator + ) { + super(validator); + } + + protected override async executeInternal(request: ResolveAuthorizationRequestRequest): Promise> { + const result = await this.openId4VcController.resolveAuthorizationRequest(request.authorizationRequestUrl); + + const authorizationRequest = JSON.parse(stringifySafe(result.authorizationRequest)); + + if (result.matchingCredentials.length === 0) { + return Result.ok({ authorizationRequest, matchingCredentials: [] }); + } + + // some properties are lost while making it app-safe, we have to re-add it for PEX + // quick-fix for the simplest case with one requested credential only - otherwise every [0] would have to be generalised. + if (result.authorizationRequest.presentationExchange) { + const encodedCredential = + result.authorizationRequest.presentationExchange.credentialsForRequest.requirements[0].submissionEntry[0].verifiableCredentials[0].credentialRecord.encoded; + authorizationRequest.presentationExchange.credentialsForRequest.requirements[0].submissionEntry[0].verifiableCredentials[0].credentialRecord.encoded = + encodedCredential; + } + + if (result.authorizationRequest.dcql) { + const queryId = result.authorizationRequest.dcql.queryResult.credentials[0].id; + const queryResult = result.authorizationRequest.dcql.queryResult.credential_matches[queryId]; + if (queryResult.success) { + const recordType = (queryResult.valid_credentials[0] as DcqlValidCredential).record.type; + authorizationRequest.dcql.queryResult.credential_matches[queryId].valid_credentials[0].record.type = recordType; + } + } + + return Result.ok({ authorizationRequest, matchingCredentials: AttributeMapper.toAttributeDTOList(result.matchingCredentials) }); + } +} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/index.ts b/packages/runtime/src/useCases/consumption/openid4vc/index.ts new file mode 100644 index 000000000..74cbb49d3 --- /dev/null +++ b/packages/runtime/src/useCases/consumption/openid4vc/index.ts @@ -0,0 +1,2 @@ +export * from "./AcceptAuthorizationRequest"; +export * from "./ResolveAuthorizationRequest"; diff --git a/packages/runtime/test/consumption/openid4vc.test.ts b/packages/runtime/test/consumption/openid4vc.test.ts new file mode 100644 index 000000000..efc94f675 --- /dev/null +++ b/packages/runtime/test/consumption/openid4vc.test.ts @@ -0,0 +1,339 @@ +import { SdJwtVcRecord } from "@credo-ts/core"; +import { EudiploClient } from "@eudiplo/sdk-core"; +import { AcceptProposeAttributeRequestItemParametersWithNewAttributeJSON, AcceptShareAuthorizationRequestRequestItemParametersJSON, decodeRecord } from "@nmshd/consumption"; +import { RequestJSON, ShareAuthorizationRequestRequestItemJSON, VerifiableCredentialJSON } from "@nmshd/content"; +import axios, { AxiosInstance } from "axios"; +import * as client from "openid-client"; +import path from "path"; +import { DockerComposeEnvironment, StartedDockerComposeEnvironment, Wait } from "testcontainers"; +import { Agent as UndiciAgent, fetch as undiciFetch } from "undici"; +import { IncomingRequestStatusChangedEvent } from "../../src"; +import { RuntimeServiceProvider, syncUntilHasMessageWithRequest, syncUntilHasRelationships, TestRuntimeServices } from "../lib"; + +const fetchInstance: typeof fetch = (async (input: any, init: any) => { + const response = await undiciFetch(input, { ...init, dispatcher: new UndiciAgent({}) }); + return response; +}) as unknown as typeof fetch; + +const runtimeServiceProvider = new RuntimeServiceProvider(fetchInstance); +let runtimeServices1: TestRuntimeServices; + +let serviceAxiosInstance: AxiosInstance; + +let dockerComposeStack: StartedDockerComposeEnvironment | undefined; + +beforeAll(async () => { + const runtimeServices = await runtimeServiceProvider.launch(1, { enableDeciderModule: true, enableRequestModule: true }); + runtimeServices1 = runtimeServices[0]; + + let oid4vcServiceBaseUrl = process.env.OPENID4VC_SERVICE_BASEURL!; + if (!oid4vcServiceBaseUrl) { + dockerComposeStack = await startOid4VcComposeStack(); + const mappedPort = dockerComposeStack.getContainer("oid4vc-service-1").getMappedPort(9000); + oid4vcServiceBaseUrl = `http://localhost:${mappedPort}`; + } + serviceAxiosInstance = axios.create({ + baseURL: oid4vcServiceBaseUrl, + headers: { + // eslint-disable-next-line @typescript-eslint/naming-convention + "Content-Type": "application/json" + } + }); + await createActiveRelationshipToService(runtimeServices1, serviceAxiosInstance); +}, 120000); + +afterAll(async () => { + await runtimeServiceProvider.stop(); + + if (dockerComposeStack) await dockerComposeStack.down(); +}); + +describe("EUDIPLO", () => { + const clientId = "test-admin"; + const clientSecret = "57c9cd444bf402b2cc1f5a0d2dafd3955bd9042c0372db17a4ede2d5fbda88e5"; + + const eudiploPresentationConfigurationId = "test"; + const eudiploCredentialConfigurationId = "test"; + + let eudiploClient: EudiploClient; + + beforeAll(() => { + const baseUrl = `http://localhost:3000`; + + eudiploClient = new EudiploClient({ + baseUrl, + clientId, + clientSecret + }); + }); + + test("issuance", async () => { + const credentialOfferUrl = ( + await eudiploClient.createIssuanceOffer({ + responseType: "uri", + credentialConfigurationIds: [eudiploCredentialConfigurationId], + flow: "pre_authorized_code" + }) + ).uri; + + const resolveCredentialOfferResult = await runtimeServices1.consumption.openId4Vc.resolveCredentialOffer({ credentialOfferUrl }); + expect(resolveCredentialOfferResult).toBeSuccessful(); + + const credentialResponsesResult = await runtimeServices1.consumption.openId4Vc.requestCredentials({ + credentialOffer: resolveCredentialOfferResult.value.credentialOffer, + credentialConfigurationIds: [eudiploCredentialConfigurationId] + }); + const storeCredentialsResponse = await runtimeServices1.consumption.openId4Vc.storeCredentials({ + credentialResponses: credentialResponsesResult.value.credentialResponses + }); + expect(storeCredentialsResponse).toBeSuccessful(); + expect((storeCredentialsResponse.value.content.value as VerifiableCredentialJSON).displayInformation?.[0].logo).toBeDefined(); + expect((storeCredentialsResponse.value.content.value as VerifiableCredentialJSON).displayInformation?.[0].name).toBe("test"); + }); + + test("issuance with pin authentication", async () => { + const pin = "1234"; + + const credentialOfferUrl = ( + await eudiploClient.createIssuanceOffer({ + responseType: "uri", + credentialConfigurationIds: [eudiploCredentialConfigurationId], + flow: "pre_authorized_code", + txCode: pin + }) + ).uri; + + const result = await runtimeServices1.consumption.openId4Vc.resolveCredentialOffer({ + credentialOfferUrl + }); + + expect(result).toBeSuccessful(); + + const credentialOffer = result.value.credentialOffer; + const requestedCredentials = credentialOffer.credentialOfferPayload.credential_configuration_ids; + + const wrongPinRequestResult = await runtimeServices1.consumption.openId4Vc.requestCredentials({ + credentialOffer, + credentialConfigurationIds: requestedCredentials, + pinCode: `1${pin}` + }); + expect(wrongPinRequestResult.isError).toBe(true); + + const requestResult = await runtimeServices1.consumption.openId4Vc.requestCredentials({ + credentialOffer, + credentialConfigurationIds: requestedCredentials, + pinCode: pin + }); + expect(requestResult).toBeSuccessful(); + }); + + // external authentication buggy in the latest release (1.16.0) + // eslint-disable-next-line jest/no-disabled-tests + test.skip("issuance with external authentication", async () => { + const credentialOfferUrl = ( + await eudiploClient.createIssuanceOffer({ + responseType: "uri", + credentialConfigurationIds: [eudiploCredentialConfigurationId], + flow: "authorization_code" + }) + ).uri; + + const resolveCredentialOfferResult = await runtimeServices1.consumption.openId4Vc.resolveCredentialOffer({ credentialOfferUrl }); + expect(resolveCredentialOfferResult).toBeSuccessful(); + + const server = URL.parse("https://kc-openid4vc.is.enmeshed.eu/realms/enmeshed-openid4vci")!; + const clientId = "wallet"; + const config: client.Configuration = await client.discovery(server, clientId); + const grantReq = await client.genericGrantRequest(config, "password", { + username: "test", + password: "test", + scope: "wallet-demo" + }); + + const credentialResponsesResult = await runtimeServices1.consumption.openId4Vc.requestCredentials({ + credentialOffer: resolveCredentialOfferResult.value.credentialOffer, + credentialConfigurationIds: [eudiploCredentialConfigurationId], + accessToken: grantReq.access_token + }); + expect(credentialResponsesResult).toBeSuccessful(); + }); + + test("presentation", async () => { + const authorizationRequestUrl = ( + await eudiploClient.createPresentationRequest({ + responseType: "uri", + configId: eudiploPresentationConfigurationId + }) + ).uri; + + const loadResult = await runtimeServices1.consumption.openId4Vc.resolveAuthorizationRequest({ authorizationRequestUrl }); + const matchingCredentials = loadResult.value.matchingCredentials; + expect(matchingCredentials).toHaveLength(1); + + const queryResult = loadResult.value.authorizationRequest.dcql!.queryResult; + expect(queryResult.can_be_satisfied).toBe(true); + + const presentationResult = await runtimeServices1.consumption.openId4Vc.acceptAuthorizationRequest({ + authorizationRequest: loadResult.value.authorizationRequest, + attributeId: matchingCredentials[0].id + }); + expect(presentationResult).toBeSuccessful(); + expect(presentationResult.value.status).toBe(200); + }); + + // TODO: unskip once fix to CanCreateShareCredentialOffer has been deployed to the connector + // eslint-disable-next-line jest/no-disabled-tests + test.skip("issuance with request", async () => { + const oldCredentials = ( + await runtimeServices1.consumption.attributes.getAttributes({ + query: { + "content.value.@type": "VerifiableCredential" + } + }) + ).value; + + const sentMessage = ( + await serviceAxiosInstance.post("/enmeshed-demo/credential", { + recipient: runtimeServices1.address, + credentialConfigurationId: eudiploCredentialConfigurationId + }) + ).data.result; + + const requestId = (sentMessage.content as RequestJSON).id!; + await syncUntilHasMessageWithRequest(runtimeServices1.transport, requestId); + await runtimeServices1.consumption.incomingRequests.accept({ + requestId, + items: [{ accept: true }] + }); + + const currentCredentials = ( + await runtimeServices1.consumption.attributes.getAttributes({ + query: { + "content.value.@type": "VerifiableCredential" + } + }) + ).value; + expect(currentCredentials).toHaveLength(oldCredentials.length + 1); + + const oldCredentialIds = oldCredentials.map((c) => c.id); + const createdCredential = currentCredentials.find((c) => !oldCredentialIds.includes(c.id)); + expect(createdCredential).toBeDefined(); + + const credentialContent = createdCredential!.content.value as VerifiableCredentialJSON; + const decodedCredential = decodeRecord(credentialContent.type, credentialContent.value) as SdJwtVcRecord; + expect(decodedCredential.firstCredential.prettyClaims.givenName).toBe("aGivenName"); + expect(credentialContent.value.split("~")).toHaveLength(3); // given name is selectively disclosable, hence length 3 + }); + + test("presentation with request", async () => { + const sentMessage = ( + await serviceAxiosInstance.post("/enmeshed-demo/presentationRequests", { + recipient: runtimeServices1.address, + configId: eudiploCredentialConfigurationId + }) + ).data.result; + + const requestId = (sentMessage.content as RequestJSON).id!; + const receivedMessage = await syncUntilHasMessageWithRequest(runtimeServices1.transport, requestId); + const authorizationRequestUrl = (receivedMessage.content.items[0] as ShareAuthorizationRequestRequestItemJSON).authorizationRequestUrl; + + const matchingAttribute = ( + await runtimeServices1.consumption.openId4Vc.resolveAuthorizationRequest({ + authorizationRequestUrl + }) + ).value.matchingCredentials[0]; + await runtimeServices1.consumption.incomingRequests.accept({ + requestId, + items: [{ accept: true, attributeId: matchingAttribute.id } as AcceptShareAuthorizationRequestRequestItemParametersJSON] + }); + + const sessionId = authorizationRequestUrl.split("%2F").at(-3)!; + + const sessionStatus = (await eudiploClient.getSession(sessionId)).status; + expect(sessionStatus).toBe("completed"); // in case of failed presentation: Status remains "active" + }); +}); + +async function startOid4VcComposeStack() { + let baseUrl = process.env.NMSHD_TEST_BASEURL!; + let addressGenerationHostnameOverride: string | undefined; + + if (baseUrl.includes("localhost")) { + addressGenerationHostnameOverride = "localhost"; + baseUrl = baseUrl.replace("localhost", "host.docker.internal"); + } + + const composeFolder = path.resolve(path.join(__dirname, "..", "..", "..", "..", ".dev")); + const composeStack = await new DockerComposeEnvironment(composeFolder, "compose.openid4vc.yml") + .withProjectName("runtime-oid4vc-tests") + .withEnvironment({ + // eslint-disable-next-line @typescript-eslint/naming-convention + TEST_ENVIRONMENT: "container", + // eslint-disable-next-line @typescript-eslint/naming-convention + NMSHD_TEST_BASEURL: baseUrl, + + // eslint-disable-next-line @typescript-eslint/naming-convention + NMSHD_TEST_ADDRESSGENERATIONHOSTNAMEOVERRIDE: addressGenerationHostnameOverride + } as Record) + .withStartupTimeout(60000) + .withWaitStrategy("oid4vc-service-1", Wait.forHealthCheck()) + .up(); + + return composeStack; +} + +async function createActiveRelationshipToService(runtime: TestRuntimeServices, serviceAxiosInstance: AxiosInstance) { + const relationshipTemplateReference = ( + await serviceAxiosInstance.post("/enmeshed-demo/relationshipTemplates", { + givenName: "aGivenName", + familyName: "aFamilyName", + city: "aCity", + zipCode: "aZipCode", + country: "DE", + houseNo: "aHouseNo", + street: "aStreet", + recipient: "aRecipient", + birthDay: 1, + birthMonth: 1, + birthYear: 2000 + }) + ).data.result; + + const loadTemplateResult = await runtime.transport.relationshipTemplates.loadPeerRelationshipTemplate({ reference: relationshipTemplateReference }); + expect(loadTemplateResult).toBeSuccessful(); + + const requestId = (await runtime.eventBus.waitForEvent(IncomingRequestStatusChangedEvent)).data.request.id; + + const acceptRequestResult = await runtime.consumption.incomingRequests.accept({ + requestId, + items: [ + { items: [{ accept: true }] }, + { + items: [ + { accept: true, attribute: { "@type": "IdentityAttribute", owner: "", value: { "@type": "GivenName", value: "aGivenName" } } }, + { accept: true, attribute: { "@type": "IdentityAttribute", owner: "", value: { "@type": "Surname", value: "aFamilyName" } } }, + { + accept: true, + attribute: { + "@type": "IdentityAttribute", + owner: "", + value: { + "@type": "StreetAddress", + city: "aCity", + country: "DE", + houseNo: "aHouseNo", + street: "aStreet", + zipCode: "aZipCode", + recipient: "aRecipient" + } + } + }, + { accept: true, attribute: { "@type": "IdentityAttribute", owner: "", value: { "@type": "BirthDate", day: 1, month: 1, year: 2000 } } } + ] as AcceptProposeAttributeRequestItemParametersWithNewAttributeJSON[] + } + ] + }); + expect(acceptRequestResult).toBeSuccessful(); + + await syncUntilHasRelationships(runtime.transport); +} diff --git a/packages/runtime/test/customMatchers.ts b/packages/runtime/test/customMatchers.ts index 7c003837a..fcc3f1015 100644 --- a/packages/runtime/test/customMatchers.ts +++ b/packages/runtime/test/customMatchers.ts @@ -9,7 +9,10 @@ expect.extend({ return { pass: actual.isSuccess, - message: () => `expected a successful result; got an error result with the error message '${actual.error.message}'.` + message: () => + actual.error.data + ? `expected a successful result; got an error result with the error code '${actual.error.code}', the error message '${actual.error.message}', and the following data: ${JSON.stringify(actual.error.data, null, 2)}.` + : `expected a successful result; got an error result with the error code '${actual.error.code}' and the error message '${actual.error.message}'.` }; }, diff --git a/packages/runtime/test/lib/RuntimeServiceProvider.ts b/packages/runtime/test/lib/RuntimeServiceProvider.ts index c0b4b79cd..d0791894b 100644 --- a/packages/runtime/test/lib/RuntimeServiceProvider.ts +++ b/packages/runtime/test/lib/RuntimeServiceProvider.ts @@ -24,6 +24,8 @@ export interface LaunchConfiguration { } export class RuntimeServiceProvider { + public constructor(private readonly fetchInstance?: typeof fetch) {} + private readonly runtimes: TestRuntime[] = []; public static get transportConfig(): Omit { @@ -75,7 +77,8 @@ export class RuntimeServiceProvider { const runtime = new TestRuntime( config, { - setDefaultOwnIdentityAttributes: launchConfiguration.enableDefaultOwnIdentityAttributes ?? false + setDefaultOwnIdentityAttributes: launchConfiguration.enableDefaultOwnIdentityAttributes ?? false, + fetchInstance: this.fetchInstance }, launchConfiguration.useCorrelator ? correlator : undefined ); diff --git a/packages/runtime/test/tsconfig.json b/packages/runtime/test/tsconfig.json index db9a0d1ee..3bbf071a7 100644 --- a/packages/runtime/test/tsconfig.json +++ b/packages/runtime/test/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "baseUrl": "../", "noEmit": true, - "composite": false + "composite": false, + "allowJs": true // we want to use the ts compiler to compile ESM node modules into CJS which is understood by jest. This is required since those node modules are javascript. }, "files": ["../../../node_modules/jest-expect-message/types/index.d.ts"], "include": ["**/*.ts", "../src/**/*.ts"], diff --git a/packages/tsconfig.base.json b/packages/tsconfig.base.json index 5ef06cf28..e72dc85c2 100644 --- a/packages/tsconfig.base.json +++ b/packages/tsconfig.base.json @@ -20,6 +20,8 @@ "noImplicitOverride": true, "useDefineForClassFields": false, "lib": ["ES2022", "DOM"], - "composite": true + "composite": true, + // ONLY POC - THIS IS STRICTLY FORBIDDEN IN PRODUCTION + "skipLibCheck": true } } diff --git a/patches/@openid4vc+openid4vp+0.4.0+001+initial.patch b/patches/@openid4vc+openid4vp+0.4.0+001+initial.patch new file mode 100644 index 000000000..45d850b8d --- /dev/null +++ b/patches/@openid4vc+openid4vp+0.4.0+001+initial.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@openid4vc/openid4vp/dist/index.mjs b/node_modules/@openid4vc/openid4vp/dist/index.mjs +index 18d18f8..1948db5 100644 +--- a/node_modules/@openid4vc/openid4vp/dist/index.mjs ++++ b/node_modules/@openid4vc/openid4vp/dist/index.mjs +@@ -619,7 +619,7 @@ async function validateOpenid4vpClientId(options, parserConfig) { + }); + if (!isOpenid4vpAuthorizationRequestDcApi(authorizationRequestPayload)) { + const uri = authorizationRequestPayload.redirect_uri ?? authorizationRequestPayload.response_uri; +- if (!uri || new URL(uri).hostname !== clientIdIdentifier) throw new Oauth2ServerErrorResponseError({ ++ if (!uri || new URL(uri).hostname.toLowerCase() !== clientIdIdentifier.toLowerCase()) throw new Oauth2ServerErrorResponseError({ + error: Oauth2ErrorCodes.InvalidRequest, + error_description: "Invalid client identifier. The fully qualified domain name of the redirect_uri value MUST match the Client Identifier without the prefix x509_san_dns." + }); From 43d28c3221f79d19f21c09483db1fa65cf83d140 Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 27 Mar 2026 16:29:35 +0100 Subject: [PATCH 02/13] Merge main into 'initial-oid4vc-merge' --- .ci/runChecks.sh | 2 +- .dev/compose.backbone.yml | 16 +- .dev/compose.yml | 2 +- .github/workflows/test.yml | 12 +- .nvmrc | 2 +- package-lock.json | 1157 +++++++++-------- package.json | 10 +- packages/app-runtime/package.json | 2 +- packages/consumption/package.json | 2 +- packages/core-types/package.json | 2 +- .../src/SharedPasswordProtection.ts | 17 +- .../test/references/Reference.test.ts | 22 +- packages/runtime-types/package.json | 5 +- .../consumption/AttributeTagCollectionDTO.ts | 0 .../src/{ => dtos}/consumption/DraftDTO.ts | 0 .../consumption/IdentityMetadataDTO.ts | 0 .../consumption/LocalAttributeDTO.ts | 0 .../LocalAttributeDeletionInfoDTO.ts | 0 .../LocalAttributeForwardingDetailsDTO.ts | 0 .../consumption/LocalNotificationDTO.ts | 0 .../{ => dtos}/consumption/LocalRequestDTO.ts | 0 .../consumption/RequestValidationResultDTO.ts | 0 .../src/{ => dtos}/consumption/SettingDTO.ts | 0 .../src/{ => dtos}/consumption/index.ts | 0 packages/runtime-types/src/dtos/index.ts | 2 + .../{ => dtos}/transport/AnnouncementDTO.ts | 0 .../src/{ => dtos}/transport/ChallengeDTO.ts | 0 .../src/{ => dtos}/transport/DeviceDTO.ts | 0 .../transport/DeviceOnboardingInfoDTO.ts | 0 .../src/{ => dtos}/transport/EmptyTokenDTO.ts | 3 - .../src/{ => dtos}/transport/FileDTO.ts | 0 .../src/{ => dtos}/transport/IdentityDTO.ts | 0 .../transport/IdentityDeletionProcessDTO.ts | 0 .../src/{ => dtos}/transport/MessageDTO.ts | 0 .../transport/MessageWithAttachmentsDTO.ts | 0 .../transport/PasswordProtectionDTO.ts | 0 .../PublicRelationshipTemplateReferenceDTO.ts | 0 .../src/{ => dtos}/transport/RecipientDTO.ts | 0 .../{ => dtos}/transport/RelationshipDTO.ts | 0 .../transport/RelationshipTemplateDTO.ts | 0 .../src/{ => dtos}/transport/TokenDTO.ts | 0 .../src/{ => dtos}/transport/index.ts | 0 .../src/events/DataEvent.ts | 0 .../consumption/AttributeCreatedEvent.ts | 2 +- .../consumption/AttributeDeletedEvent.ts | 2 +- .../AttributeForwardingDetailsChangedEvent.ts | 2 +- .../consumption/AttributeSucceededEvent.ts | 2 +- .../AttributeWasViewedAtChangedEvent.ts | 2 +- .../ForwardedAttributeDeletedByPeerEvent.ts | 2 +- .../IncomingRequestReceivedEvent.ts | 2 +- .../IncomingRequestStatusChangedEvent.ts | 3 +- .../events/consumption/MailReceivedEvent.ts | 2 +- .../consumption/MessageProcessedEvent.ts | 2 +- ...OutgoingRequestCreatedAndCompletedEvent.ts | 2 +- .../OutgoingRequestCreatedEvent.ts | 2 +- ...ionshipCreationCreatedAndCompletedEvent.ts | 2 +- .../OutgoingRequestStatusChangedEvent.ts | 3 +- .../OwnAttributeDeletedByOwnerEvent.ts | 2 +- ...RelationshipAttributeDeletedByPeerEvent.ts | 2 +- .../events/consumption/RelationshipEvent.ts | 2 +- .../RelationshipTemplateProcessedEvent.ts | 2 +- ...ferRequestItemProcessedByRecipientEvent.ts | 0 .../src/events/consumption/index.ts | 0 .../src/events/index.ts | 0 .../events/runtime/ModulesInitializedEvent.ts | 0 .../src/events/runtime/ModulesLoadedEvent.ts | 0 .../src/events/runtime/ModulesStartedEvent.ts | 0 .../events/runtime/RuntimeInitializedEvent.ts | 0 .../runtime/RuntimeInitializingEvent.ts | 0 .../src/events/runtime/index.ts | 0 .../transport/DatawalletSynchronizedEvent.ts | 0 .../transport/FileOwnershipClaimedEvent.ts | 2 +- .../transport/FileOwnershipLockedEvent.ts | 2 +- ...entityDeletionProcessStatusChangedEvent.ts | 2 +- .../events/transport/MessageDeliveredEvent.ts | 2 +- .../events/transport/MessageReceivedEvent.ts | 2 +- .../src/events/transport/MessageSentEvent.ts | 2 +- .../transport/MessageWasReadAtChangedEvent.ts | 2 +- .../src/events/transport/PeerDeletedEvent.ts | 2 +- .../transport/PeerDeletionCancelledEvent.ts | 2 +- .../PeerRelationshipTemplateLoadedEvent.ts | 2 +- .../events/transport/PeerToBeDeletedEvent.ts | 2 +- .../transport/RelationshipChangedEvent.ts | 2 +- .../RelationshipDecomposedBySelfEvent.ts | 0 .../RelationshipReactivationCompletedEvent.ts | 2 +- .../RelationshipReactivationRequestedEvent.ts | 2 +- ...onshipTemplateAllocationsExhaustedEvent.ts | 2 +- .../src/events/transport/index.ts | 0 packages/runtime-types/src/index.ts | 4 +- packages/runtime-types/tsconfig.json | 2 +- packages/runtime/package.json | 12 +- packages/runtime/src/Runtime.ts | 3 +- packages/runtime/src/events/EventProxy.ts | 30 +- packages/runtime/src/index.ts | 1 - packages/runtime/src/modules/DeciderModule.ts | 4 +- packages/runtime/src/modules/MessageModule.ts | 2 +- .../runtime/src/modules/NotificationModule.ts | 2 +- packages/runtime/src/modules/RequestModule.ts | 10 +- .../FillDeviceOnboardingTokenWithNewDevice.ts | 6 +- .../useCases/transport/tokens/TokenMapper.ts | 1 - .../runtime/test/anonymous/tokens.test.ts | 5 - .../runtime/test/consumption/iqlQuery.test.ts | 3 +- .../runtime/test/consumption/requests.test.ts | 3 +- packages/runtime/tsconfig.json | 2 +- packages/transport/package.json | 12 +- .../src/core/types/PasswordProtection.ts | 5 +- .../tokens/AnonymousTokenController.ts | 16 +- .../src/modules/tokens/TokenController.ts | 40 +- .../src/modules/tokens/local/EmptyToken.ts | 24 +- .../tokens/local/SendEmptyTokenParameters.ts | 5 + .../local/UpdateTokenContentParameters.ts | 7 +- .../tokens/AnonymousTokenController.test.ts | 3 +- .../modules/tokens/TokenController.test.ts | 5 +- 113 files changed, 786 insertions(+), 745 deletions(-) rename packages/runtime-types/src/{ => dtos}/consumption/AttributeTagCollectionDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/DraftDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/IdentityMetadataDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/LocalAttributeDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/LocalAttributeDeletionInfoDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/LocalAttributeForwardingDetailsDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/LocalNotificationDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/LocalRequestDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/RequestValidationResultDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/SettingDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/consumption/index.ts (100%) create mode 100644 packages/runtime-types/src/dtos/index.ts rename packages/runtime-types/src/{ => dtos}/transport/AnnouncementDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/ChallengeDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/DeviceDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/DeviceOnboardingInfoDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/EmptyTokenDTO.ts (56%) rename packages/runtime-types/src/{ => dtos}/transport/FileDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/IdentityDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/IdentityDeletionProcessDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/MessageDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/MessageWithAttachmentsDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/PasswordProtectionDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/PublicRelationshipTemplateReferenceDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/RecipientDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/RelationshipDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/RelationshipTemplateDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/TokenDTO.ts (100%) rename packages/runtime-types/src/{ => dtos}/transport/index.ts (100%) rename packages/{runtime => runtime-types}/src/events/DataEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/consumption/AttributeCreatedEvent.ts (85%) rename packages/{runtime => runtime-types}/src/events/consumption/AttributeDeletedEvent.ts (85%) rename packages/{runtime => runtime-types}/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/consumption/AttributeSucceededEvent.ts (89%) rename packages/{runtime => runtime-types}/src/events/consumption/AttributeWasViewedAtChangedEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/consumption/IncomingRequestReceivedEvent.ts (89%) rename packages/{runtime => runtime-types}/src/events/consumption/IncomingRequestStatusChangedEvent.ts (85%) rename packages/{runtime => runtime-types}/src/events/consumption/MailReceivedEvent.ts (89%) rename packages/{runtime => runtime-types}/src/events/consumption/MessageProcessedEvent.ts (93%) rename packages/{runtime => runtime-types}/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts (89%) rename packages/{runtime => runtime-types}/src/events/consumption/OutgoingRequestCreatedEvent.ts (89%) rename packages/{runtime => runtime-types}/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts (90%) rename packages/{runtime => runtime-types}/src/events/consumption/OutgoingRequestStatusChangedEvent.ts (85%) rename packages/{runtime => runtime-types}/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/consumption/RelationshipEvent.ts (88%) rename packages/{runtime => runtime-types}/src/events/consumption/RelationshipTemplateProcessedEvent.ts (96%) rename packages/{runtime => runtime-types}/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/consumption/index.ts (100%) rename packages/{runtime => runtime-types}/src/events/index.ts (100%) rename packages/{runtime => runtime-types}/src/events/runtime/ModulesInitializedEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/runtime/ModulesLoadedEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/runtime/ModulesStartedEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/runtime/RuntimeInitializedEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/runtime/RuntimeInitializingEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/runtime/index.ts (100%) rename packages/{runtime => runtime-types}/src/events/transport/DatawalletSynchronizedEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/transport/FileOwnershipClaimedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/transport/FileOwnershipLockedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/transport/MessageDeliveredEvent.ts (89%) rename packages/{runtime => runtime-types}/src/events/transport/MessageReceivedEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/transport/MessageSentEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/transport/MessageWasReadAtChangedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/transport/PeerDeletedEvent.ts (85%) rename packages/{runtime => runtime-types}/src/events/transport/PeerDeletionCancelledEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/transport/PeerToBeDeletedEvent.ts (85%) rename packages/{runtime => runtime-types}/src/events/transport/RelationshipChangedEvent.ts (86%) rename packages/{runtime => runtime-types}/src/events/transport/RelationshipDecomposedBySelfEvent.ts (100%) rename packages/{runtime => runtime-types}/src/events/transport/RelationshipReactivationCompletedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/transport/RelationshipReactivationRequestedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts (87%) rename packages/{runtime => runtime-types}/src/events/transport/index.ts (100%) diff --git a/.ci/runChecks.sh b/.ci/runChecks.sh index 27f95fd8d..ff2e07adc 100755 --- a/.ci/runChecks.sh +++ b/.ci/runChecks.sh @@ -6,4 +6,4 @@ npm run lint:eslint npm run lint:prettier npm run --workspaces cdep npx --workspaces license-check -npx better-npm-audit audit --exclude 1113371,1113402,1112030 +npx better-npm-audit audit --exclude 1115432 diff --git a/.dev/compose.backbone.yml b/.dev/compose.backbone.yml index c9350d334..709deb5b4 100644 --- a/.dev/compose.backbone.yml +++ b/.dev/compose.backbone.yml @@ -2,7 +2,7 @@ name: local-test-backbone services: consumer-api: - image: ghcr.io/nmshd/backbone-consumer-api:7.1.3@sha256:25c09fd48f6380ca6b953dccacdac06a16c28ebfd4945c81a0b7ee5bbef829b5 + image: ghcr.io/nmshd/backbone-consumer-api:7.1.4@sha256:3b2246b551f576982e99c4fe23cbb7fa8eae4c59956233761d877318d9ba86f2 container_name: consumer-api hostname: consumer-api environment: @@ -25,7 +25,7 @@ services: target: app/appsettings.override.json event-handler-service: - image: ghcr.io/nmshd/backbone-event-handler:7.1.3@sha256:c9f9d57f484b8f678d1a3a84895b59d4f952f00e7ab02a55d15e59a7eae2fb11 + image: ghcr.io/nmshd/backbone-event-handler:7.1.4@sha256:f4b2795e317e867b507a193f53adeb9aab48fc32e3ba4a58fdcb2ec0781741da container_name: event-handler-service depends_on: database: @@ -39,7 +39,7 @@ services: target: app/appsettings.override.json sse-server: - image: ghcr.io/nmshd/backbone-sse-server:7.1.3@sha256:5840d7cfa54187fa59154b8099c6586833b90965b5f92f26a38bdcefbc8fb4ec + image: ghcr.io/nmshd/backbone-sse-server:7.1.4@sha256:96acdb1ea8f9f5a3cf89ea89189086ecadebe8cf069af404a0d4563b551b853d container_name: sse-server hostname: sse-server ports: @@ -52,7 +52,7 @@ services: target: app/appsettings.override.json admin-ui: - image: ghcr.io/nmshd/backbone-admin-ui:7.1.3@sha256:637d671ed7a5aafd71807a4febabb0da8f8f05394da59f59a53b6a013b8a232d + image: ghcr.io/nmshd/backbone-admin-ui:7.1.4@sha256:66c65b7eb9f388e5629bd019c7ab4bc170d81bf84a650823b330034ec0155f9e container_name: admin-ui hostname: admin-ui ports: @@ -72,7 +72,7 @@ services: database-migrator: container_name: database-migrator - image: ghcr.io/nmshd/backbone-database-migrator:7.1.3@sha256:120b724eeddb58bb5f8c4aa2d9107e322bb6eea1707498daf932e6328464af58 + image: ghcr.io/nmshd/backbone-database-migrator:7.1.4@sha256:80953d2ba69353c8aeacc70051249b43c972b358fad2a94158af2e49ccee6dce environment: Infrastructure__SqlDatabase__Provider: Postgres Infrastructure__SqlDatabase__ConnectionString: "Server=postgres;Database=enmeshed;User Id=postgres;Password=Passw0rd;Port=5432" @@ -89,7 +89,7 @@ services: database: container_name: bkb-postgres hostname: postgres - image: postgres@sha256:55586516b2fd477faa8f0f05ec0a72b196fb7e2bce8df3adfb9c6a0ed607214f + image: postgres@sha256:a9abf4275f9e99bff8e6aed712b3b7dfec9cac1341bba01c1ffdfce9ff9fc34a environment: - POSTGRES_PASSWORD=Passw0rd - POSTGRES_DB=enmeshed @@ -109,13 +109,13 @@ services: rabbitmq: container_name: bkb-rabbitmq hostname: rabbitmq - image: rabbitmq:4.2.4-alpine@sha256:c8a204d5b0bba833cbff44067b482b40152e8156d811a369e92fa0f1da8cb9c0 + image: rabbitmq:4.2.5-alpine@sha256:53e51f8469ef13d0a1a2b03c0d36dcf4efbf13089f552440ec5620ca07f2c64e ### seeds ### seed-client: container_name: seed-client - image: ghcr.io/nmshd/backbone-admin-cli:7.1.3@sha256:619aa192e3ce925c22342fa7bb3dd82437ad5fe6281c7f9fb84dad33d5dd3646 + image: ghcr.io/nmshd/backbone-admin-cli:7.1.4@sha256:b07d9b30d7b54572ea37cf0d6d91bbb7c067011a45c55cdd60683f9604348a04 depends_on: consumer-api: condition: service_healthy diff --git a/.dev/compose.yml b/.dev/compose.yml index 459b0166e..568e58954 100644 --- a/.dev/compose.yml +++ b/.dev/compose.yml @@ -2,7 +2,7 @@ name: runtime-tests services: runtime-mongo: - image: mongo@sha256:474f5c3bf0e355bb97dafda730e725169a4d51c5578abf7be9ec7ad3fdee4481 + image: mongo@sha256:d343c378b5c6e2fe373174abcf4a877be0dfc721b5d0b9d582204dccb1c00b86 container_name: runtime-mongo ports: - "27021:27017" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a40f429e5..141df48ad 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,7 +34,7 @@ jobs: NMSHD_TEST_CLIENTSECRET: test NMSHD_TEST_BASEURL_SSE_SERVER: http://localhost:8092 - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 env: fail_ci_if_error: true CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -76,7 +76,7 @@ jobs: NMSHD_TEST_CLIENTID: test NMSHD_TEST_CLIENTSECRET: test - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 env: fail_ci_if_error: true CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -92,7 +92,7 @@ jobs: - run: npm run build:node - run: npm run test:ci --workspace=@nmshd/content - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 env: fail_ci_if_error: true CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -108,7 +108,7 @@ jobs: - run: npm run build:node - run: npm run test:ci --workspace=@nmshd/core-types - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 env: fail_ci_if_error: true CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -167,7 +167,7 @@ jobs: NMSHD_TEST_CLIENTID: test NMSHD_TEST_CLIENTSECRET: test - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 env: fail_ci_if_error: true CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -213,7 +213,7 @@ jobs: NMSHD_TEST_CLIENTID: test NMSHD_TEST_CLIENTSECRET: test - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 env: fail_ci_if_error: true CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.nvmrc b/.nvmrc index 82a97dd3a..9af712241 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -25.7.0 +25.8.2 diff --git a/package-lock.json b/package-lock.json index 1d50a85eb..20e842949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,16 +19,16 @@ "devDependencies": { "@babel/preset-env": "^7.29.0", "@babel/preset-typescript": "^7.28.5", - "@js-soft/eslint-config-ts": "^2.0.4", + "@js-soft/eslint-config-ts": "^2.0.5", "@js-soft/license-check": "^1.0.10", "@types/jest": "^30.0.0", - "@types/node": "^24.10.15", + "@types/node": "^24.12.0", "enhanced-publish": "^1.1.7", - "eslint": "^9.39.3", - "jest": "^30.2.0", + "eslint": "^10.1.0", + "jest": "^30.3.0", "jest-expect-message": "^1.1.3", "madge": "^8.0.0", - "npm-check-updates": "^19.4.1", + "npm-check-updates": "^19.6.6", "patch-package": "^8.0.1", "prettier": "^3.8.1", "ts-jest": "^29.4.6", @@ -1934,21 +1934,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", "dev": true, "license": "MIT", "optional": true, @@ -1957,9 +1957,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dev": true, "license": "MIT", "optional": true, @@ -2004,66 +2004,75 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", + "version": "0.23.3", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.4", "dev": true, - "license": "Apache-2.0", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@eslint/core": "^1.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", "dev": true, "license": "MIT", "engines": { @@ -2074,23 +2083,23 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", + "version": "3.0.3", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", + "version": "0.6.1", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.1.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eudiplo/sdk-core": { @@ -2484,15 +2493,15 @@ } }, "node_modules/@jest/console": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", "slash": "^3.0.0" }, "engines": { @@ -2500,37 +2509,36 @@ } }, "node_modules/@jest/core": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", + "@jest/console": "30.3.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", "slash": "^3.0.0" }, "engines": { @@ -2546,7 +2554,7 @@ } }, "node_modules/@jest/diff-sequences": { - "version": "30.0.1", + "version": "30.3.0", "dev": true, "license": "MIT", "engines": { @@ -2554,33 +2562,33 @@ } }, "node_modules/@jest/environment": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-mock": "30.2.0" + "jest-mock": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" + "expect": "30.3.0", + "jest-snapshot": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -2591,16 +2599,16 @@ } }, "node_modules/@jest/fake-timers": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2615,14 +2623,14 @@ } }, "node_modules/@jest/globals": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2641,30 +2649,30 @@ } }, "node_modules/@jest/reporters": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", - "glob": "^10.3.10", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -2693,11 +2701,11 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -2720,12 +2728,12 @@ } }, "node_modules/@jest/test-result": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -2734,13 +2742,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.2.0", + "@jest/test-result": "30.3.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", + "jest-haste-map": "30.3.0", "slash": "^3.0.0" }, "engines": { @@ -2748,22 +2756,21 @@ } }, "node_modules/@jest/transform": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", + "jest-haste-map": "30.3.0", "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", + "jest-util": "30.3.0", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" @@ -2773,7 +2780,7 @@ } }, "node_modules/@jest/types": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -2878,12 +2885,12 @@ "license": "MIT" }, "node_modules/@js-soft/eslint-config-ts": { - "version": "2.0.4", + "version": "2.0.5", "dev": true, "license": "MIT", "dependencies": { "@eslint/js": "^9.37.0", - "eslint-plugin-chai-expect": "^3.1.0", + "eslint-plugin-chai-expect": "^4.0.0", "eslint-plugin-chai-friendly": "^1.1.0", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-mocha": "^11.2.0", @@ -2907,10 +2914,13 @@ }, "node_modules/@js-soft/logging-abstractions": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "node_modules/@js-soft/node-logger": { - "version": "1.2.1", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@js-soft/node-logger/-/node-logger-1.2.2.tgz", + "integrity": "sha512-qwLJ/eGYvLzcIzgnGRRZNWD6QeBvKExLoEOZMpwiohY/g5EwRt4DYnyf5XM574DnlyAo6+cKJ/IpVNJVdOicUg==", "dev": true, "license": "MIT", "dependencies": { @@ -3230,7 +3240,7 @@ } }, "node_modules/@npmcli/package-json": { - "version": "7.0.4", + "version": "7.0.5", "dev": true, "license": "ISC", "dependencies": { @@ -3240,42 +3250,42 @@ "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/package-json/node_modules/balanced-match": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "5.0.2", + "version": "5.0.5", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "13.0.5", + "version": "13.0.6", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.2.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3290,21 +3300,21 @@ } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "10.2.1", + "version": "10.2.4", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/package-json/node_modules/path-scurry": { - "version": "2.0.1", + "version": "2.0.2", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3312,7 +3322,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3329,6 +3339,15 @@ "node": ">=10" } }, + "node_modules/@npmcli/package-json/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/@npmcli/promise-spawn": { "version": "9.0.1", "dev": true, @@ -3836,7 +3855,7 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", + "version": "15.1.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4075,33 +4094,33 @@ } }, "node_modules/@tufjs/models/node_modules/balanced-match": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "5.0.2", + "version": "5.0.5", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.2.1", + "version": "10.2.4", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4205,6 +4224,11 @@ "@types/bn.js": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "dev": true, @@ -4275,8 +4299,6 @@ }, "node_modules/@types/lodash": { "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", "dev": true, "license": "MIT" }, @@ -4290,16 +4312,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.15.tgz", - "integrity": "sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg==", + "version": "24.12.0", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@types/qs": { - "version": "6.14.0", + "version": "6.15.0", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -4398,15 +4418,15 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/type-utils": "8.56.0", - "@typescript-eslint/utils": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/type-utils": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -4419,7 +4439,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.56.0", + "@typescript-eslint/parser": "^8.57.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -4433,14 +4453,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3" }, "engines": { @@ -4456,12 +4476,12 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.0", - "@typescript-eslint/types": "^8.56.0", + "@typescript-eslint/tsconfig-utils": "^8.57.2", + "@typescript-eslint/types": "^8.57.2", "debug": "^4.4.3" }, "engines": { @@ -4476,12 +4496,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0" + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4492,7 +4512,7 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "engines": { @@ -4507,13 +4527,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0", - "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -4530,7 +4550,7 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "engines": { @@ -4542,16 +4562,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.0", - "@typescript-eslint/tsconfig-utils": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/project-service": "8.57.2", + "@typescript-eslint/tsconfig-utils": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" @@ -4567,23 +4587,34 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", + "version": "5.0.5", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", + "version": "10.2.4", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4601,14 +4632,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0" + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4623,11 +4654,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/types": "8.57.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -4638,17 +4669,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "dev": true, @@ -4760,6 +4780,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4774,6 +4797,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4788,6 +4814,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4802,6 +4831,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4816,6 +4848,9 @@ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4830,6 +4865,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4842,6 +4880,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4850,12 +4891,13 @@ }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -5064,7 +5106,7 @@ } }, "node_modules/ajv": { - "version": "6.12.6", + "version": "6.14.0", "dev": true, "license": "MIT", "dependencies": { @@ -5287,11 +5329,6 @@ "dev": true, "license": "MIT" }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, "node_modules/array-find-index": { "version": "1.0.2", "dev": true, @@ -5348,7 +5385,7 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.5", + "version": "1.13.6", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -5357,7 +5394,7 @@ } }, "node_modules/b4a": { - "version": "1.7.5", + "version": "1.8.0", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -5370,14 +5407,14 @@ } }, "node_modules/babel-jest": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.2.0", + "@jest/transform": "30.3.0", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.2.0", + "babel-preset-jest": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -5408,7 +5445,7 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -5480,11 +5517,11 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.2.0", + "babel-plugin-jest-hoist": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { @@ -5513,7 +5550,7 @@ } }, "node_modules/bare-fs": { - "version": "4.5.4", + "version": "4.5.5", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5537,7 +5574,7 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", + "version": "3.8.0", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5555,7 +5592,7 @@ } }, "node_modules/bare-stream": { - "version": "2.8.0", + "version": "2.8.1", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5836,35 +5873,35 @@ } }, "node_modules/cacache/node_modules/balanced-match": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/cacache/node_modules/brace-expansion": { - "version": "5.0.2", + "version": "5.0.5", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/cacache/node_modules/glob": { - "version": "13.0.5", + "version": "13.0.6", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.2.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5879,21 +5916,21 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "10.2.1", + "version": "10.2.4", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/path-scurry": { - "version": "2.0.1", + "version": "2.0.2", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -5901,7 +5938,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5966,7 +6003,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001770", + "version": "1.0.30001774", "dev": true, "funding": [ { @@ -6461,7 +6498,7 @@ } }, "node_modules/dedent": { - "version": "1.7.1", + "version": "1.7.2", "dev": true, "license": "MIT", "peerDependencies": { @@ -6712,7 +6749,7 @@ } }, "node_modules/docker-compose": { - "version": "1.3.1", + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { @@ -6825,7 +6862,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", + "version": "1.5.302", "dev": true, "license": "ISC" }, @@ -7017,33 +7054,28 @@ } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "10.1.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.3", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -7053,8 +7085,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -7062,7 +7093,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -7077,14 +7108,14 @@ } }, "node_modules/eslint-plugin-chai-expect": { - "version": "3.1.0", + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": "10.* || 12.* || || 14.* || 16.* || >= 18.*" + "node": ">= 20" }, "peerDependencies": { - "eslint": ">=2.0.0 <= 9.x" + "eslint": ">=2.0.0 <=10.x" } }, "node_modules/eslint-plugin-chai-friendly": { @@ -7150,42 +7181,77 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", + "version": "9.1.2", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", + "version": "5.0.1", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.4", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/espree": { - "version": "10.4.0", + "version": "11.2.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7331,16 +7397,16 @@ } }, "node_modules/expect": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.2.0", + "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -7570,7 +7636,7 @@ } }, "node_modules/flatted": { - "version": "3.3.3", + "version": "3.4.2", "dev": true, "license": "ISC" }, @@ -7833,7 +7899,7 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -7841,11 +7907,11 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", + "version": "9.0.9", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -7854,17 +7920,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globals": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gonzales-pe": { "version": "4.3.0", "dev": true, @@ -7895,7 +7950,7 @@ "license": "ISC" }, "node_modules/handlebars": { - "version": "4.7.8", + "version": "4.7.9", "dev": true, "license": "MIT", "dependencies": { @@ -8115,53 +8170,38 @@ } }, "node_modules/ignore-walk/node_modules/balanced-match": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "5.0.2", + "version": "5.0.5", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.2.1", + "version": "10.2.4", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/import-local": { "version": "3.2.0", "dev": true, @@ -8474,14 +8514,14 @@ } }, "node_modules/jest": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.2.0", - "@jest/types": "30.2.0", + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", "import-local": "^3.2.0", - "jest-cli": "30.2.0" + "jest-cli": "30.3.0" }, "bin": { "jest": "bin/jest.js" @@ -8499,12 +8539,12 @@ } }, "node_modules/jest-changed-files": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "p-limit": "^3.1.0" }, "engines": { @@ -8512,27 +8552,27 @@ } }, "node_modules/jest-circus": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", "p-limit": "^3.1.0", - "pretty-format": "30.2.0", + "pretty-format": "30.3.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -8542,19 +8582,19 @@ } }, "node_modules/jest-cli": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "yargs": "^17.7.2" }, "bin": { @@ -8656,32 +8696,31 @@ } }, "node_modules/jest-config": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.2.0", - "@jest/types": "30.2.0", - "babel-jest": "30.2.0", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", - "glob": "^10.3.10", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-circus": "30.2.0", + "jest-circus": "30.3.0", "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", + "jest-environment-node": "30.3.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-runner": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "micromatch": "^4.0.8", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "parse-json": "^5.2.0", - "pretty-format": "30.2.0", + "pretty-format": "30.3.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -8706,14 +8745,14 @@ } }, "node_modules/jest-diff": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", + "@jest/diff-sequences": "30.3.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -8731,32 +8770,32 @@ } }, "node_modules/jest-each": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "chalk": "^4.1.2", - "jest-util": "30.2.0", - "pretty-format": "30.2.0" + "jest-util": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-mock": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0" + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -8768,19 +8807,19 @@ "license": "MIT" }, "node_modules/jest-haste-map": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "micromatch": "^4.0.8", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "picomatch": "^4.0.3", "walker": "^1.0.8" }, "engines": { @@ -8790,44 +8829,55 @@ "fsevents": "^2.3.3" } }, + "node_modules/jest-haste-map/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-leak-detector": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -8835,14 +8885,25 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-mock": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-util": "30.2.0" + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -8873,16 +8934,16 @@ } }, "node_modules/jest-resolve": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", + "jest-haste-map": "30.3.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -8891,42 +8952,42 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.2.0" + "jest-snapshot": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/environment": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-leak-detector": "30.2.0", - "jest-message-util": "30.2.0", - "jest-resolve": "30.2.0", - "jest-runtime": "30.2.0", - "jest-util": "30.2.0", - "jest-watcher": "30.2.0", - "jest-worker": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8935,30 +8996,30 @@ } }, "node_modules/jest-runtime": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/globals": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8967,7 +9028,7 @@ } }, "node_modules/jest-snapshot": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -8976,20 +9037,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.2.0", + "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.2.0", + "expect": "30.3.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "pretty-format": "30.2.0", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -9009,23 +9070,23 @@ } }, "node_modules/jest-util": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "license": "MIT", "engines": { @@ -9036,16 +9097,16 @@ } }, "node_modules/jest-validate": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9063,17 +9124,17 @@ } }, "node_modules/jest-watcher": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "string-length": "^4.0.2" }, "engines": { @@ -9081,13 +9142,13 @@ } }, "node_modules/jest-worker": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -9125,17 +9186,6 @@ "dev": true, "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsesc": { "version": "3.1.0", "dev": true, @@ -9479,11 +9529,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "dev": true, @@ -9725,7 +9770,7 @@ "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.2", + "version": "3.1.5", "dev": true, "license": "ISC", "dependencies": { @@ -10216,9 +10261,9 @@ } }, "node_modules/npm-check-updates": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-19.6.2.tgz", - "integrity": "sha512-fxoQAhn90dx/pLOHY0w3U0IzW02DGDgkNwjTsPpHexo3niLxkL3xAggTQNjODMwTtWoRhP7rhnm7ji0hw/F1kA==", + "version": "19.6.6", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-19.6.6.tgz", + "integrity": "sha512-AvlRcnlUEyBEJfblUSjYMJwYKvCIWDRuCDa6x3hyUMTMkI3kslmFm0LDqwgzQfshfNh0Z3ouKiA4fLjRN7HejQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10286,7 +10331,7 @@ } }, "node_modules/npm-packlist": { - "version": "10.0.3", + "version": "10.0.4", "dev": true, "license": "ISC", "dependencies": { @@ -10603,17 +10648,6 @@ "version": "2.1.0", "license": "(MIT AND Zlib)" }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-json": { "version": "5.2.0", "dev": true, @@ -10775,7 +10809,7 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", "dev": true, "license": "MIT", "engines": { @@ -10962,7 +10996,7 @@ } }, "node_modules/pretty-format": { - "version": "30.2.0", + "version": "30.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -11341,7 +11375,7 @@ } }, "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11349,7 +11383,7 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", + "version": "5.1.9", "dev": true, "license": "ISC", "dependencies": { @@ -11507,14 +11541,6 @@ "node": ">=18" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "dev": true, @@ -11848,7 +11874,7 @@ } }, "node_modules/sjcl": { - "version": "1.0.8", + "version": "1.0.9", "license": "(BSD-2-Clause OR GPL-2.0-only)", "engines": { "node": "*" @@ -11972,7 +11998,7 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", + "version": "3.0.23", "dev": true, "license": "CC0-1.0" }, @@ -12446,7 +12472,7 @@ } }, "node_modules/tar": { - "version": "7.5.9", + "version": "7.5.11", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12461,7 +12487,7 @@ } }, "node_modules/tar-fs": { - "version": "3.1.1", + "version": "3.1.2", "dev": true, "license": "MIT", "dependencies": { @@ -12533,7 +12559,7 @@ } }, "node_modules/testcontainers": { - "version": "11.12.0", + "version": "11.13.0", "dev": true, "license": "MIT", "dependencies": { @@ -12543,23 +12569,15 @@ "async-lock": "^1.4.1", "byline": "^5.0.0", "debug": "^4.4.3", - "docker-compose": "^1.3.1", + "docker-compose": "^1.3.2", "dockerode": "^4.0.9", "get-port": "^7.1.0", "proper-lockfile": "^4.1.2", "properties-reader": "^3.0.1", "ssh-remote-port-forward": "^1.0.4", - "tar-fs": "^3.1.1", + "tar-fs": "^3.1.2", "tmp": "^0.2.5", - "undici": "^7.22.0" - } - }, - "node_modules/testcontainers/node_modules/undici": { - "version": "7.22.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" + "undici": "^7.24.3" } }, "node_modules/text-decoder": { @@ -12602,7 +12620,7 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "license": "MIT", "engines": { @@ -12771,12 +12789,13 @@ } }, "node_modules/ts-json-schema-generator": { - "version": "2.5.0", + "version": "2.9.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.15", - "commander": "^14.0.2", + "commander": "^14.0.3", + "glob": "^13.0.6", "json5": "^2.2.3", "normalize-path": "^3.0.0", "safe-stable-stringify": "^2.5.0", @@ -12790,6 +12809,25 @@ "node": ">=22.0.0" } }, + "node_modules/ts-json-schema-generator/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/ts-json-schema-generator/node_modules/brace-expansion": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/ts-json-schema-generator/node_modules/commander": { "version": "14.0.3", "dev": true, @@ -12798,6 +12836,59 @@ "node": ">=20" } }, + "node_modules/ts-json-schema-generator/node_modules/glob": { + "version": "13.0.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/lru-cache": { + "version": "11.2.6", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/ts-json-schema-generator/node_modules/minimatch": { + "version": "10.2.4", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/path-scurry": { + "version": "2.0.2", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ts-mockito": { "version": "2.6.1", "dev": true, @@ -12985,14 +13076,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.56.0", + "version": "8.57.2", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.56.0", - "@typescript-eslint/parser": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0", - "@typescript-eslint/utils": "8.56.0" + "@typescript-eslint/eslint-plugin": "8.57.2", + "@typescript-eslint/parser": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13026,10 +13117,10 @@ } }, "node_modules/undici": { - "version": "6.23.0", + "version": "7.24.4", "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/undici-types": { @@ -13484,7 +13575,7 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", + "version": "2.8.3", "dev": true, "license": "ISC", "bin": { @@ -13647,7 +13738,7 @@ "lodash": "^4.17.23" }, "devDependencies": { - "@js-soft/node-logger": "^1.2.1", + "@js-soft/node-logger": "^1.2.2", "@types/lodash": "^4.17.24", "@types/lokijs": "^1.5.14", "@types/luxon": "^3.7.1" @@ -13676,7 +13767,7 @@ "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", - "@js-soft/node-logger": "1.2.1", + "@js-soft/node-logger": "1.2.2", "@nmshd/crypto": "2.1.3", "@types/lodash": "^4.17.24", "@types/sjcl": "^1.0.34", @@ -13703,7 +13794,7 @@ "name": "@nmshd/core-types", "license": "AGPL-3.0-or-later", "dependencies": { - "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/logging-abstractions": "^1.2.2", "@js-soft/ts-serval": "2.0.16", "@nmshd/crypto": "^2.1.3", "json-stringify-safe": "^5.0.1", @@ -13713,12 +13804,18 @@ "@types/luxon": "^3.7.1" } }, + "packages/core-types/node_modules/@js-soft/logging-abstractions": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@js-soft/logging-abstractions/-/logging-abstractions-1.2.2.tgz", + "integrity": "sha512-+gAiMACXJGlBNVeg2E9MD+bC8fPr7VeaEB8poJjv9iO7IG+c4SE1X29nzSeUjV+n4zXDyQjcWUraL1U5IqdDnw==", + "license": "MIT" + }, "packages/runtime": { "name": "@nmshd/runtime", "license": "AGPL-3.0-or-later", "dependencies": { "@js-soft/docdb-querytranslator": "^1.1.6", - "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/logging-abstractions": "^1.2.2", "@js-soft/ts-serval": "2.0.16", "@js-soft/ts-utils": "^2.3.5", "@nmshd/consumption": "*", @@ -13743,7 +13840,7 @@ "@eudiplo/sdk-core": "^1.16.0", "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", - "@js-soft/node-logger": "1.2.1", + "@js-soft/node-logger": "1.2.2", "@nmshd/connector-sdk": "^7.3.0", "@types/elliptic": "^6.4.18", "@types/json-stringify-safe": "^5.0.3", @@ -13751,15 +13848,25 @@ "@types/luxon": "^3.7.1", "jwt-decode": "^4.0.0", "openid-client": "^6.8.1", - "ts-json-schema-generator": "2.5.0", + "ts-json-schema-generator": "2.9.0", "ts-mockito": "^2.6.1" } }, "packages/runtime-types": { "name": "@nmshd/runtime-types", "license": "AGPL-3.0-or-later", + "dependencies": { + "@js-soft/ts-utils": "2.3.5", + "@nmshd/content": "*" + }, "devDependencies": {} }, + "packages/runtime/node_modules/@js-soft/logging-abstractions": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@js-soft/logging-abstractions/-/logging-abstractions-1.2.2.tgz", + "integrity": "sha512-+gAiMACXJGlBNVeg2E9MD+bC8fPr7VeaEB8poJjv9iO7IG+c4SE1X29nzSeUjV+n4zXDyQjcWUraL1U5IqdDnw==", + "license": "MIT" + }, "packages/runtime/node_modules/ajv": { "version": "8.18.0", "license": "MIT", @@ -13790,11 +13897,11 @@ "license": "AGPL-3.0-or-later", "dependencies": { "@js-soft/docdb-access-abstractions": "1.3.0", - "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/logging-abstractions": "^1.2.2", "@js-soft/ts-utils": "^2.3.5", "@nmshd/core-types": "*", "@nmshd/crypto": "2.1.3", - "axios": "^1.13.5", + "axios": "^1.13.6", "fast-json-patch": "^3.1.1", "form-data": "^4.0.5", "json-stringify-safe": "^5.0.1", @@ -13807,17 +13914,23 @@ "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", - "@js-soft/node-logger": "1.2.1", + "@js-soft/node-logger": "1.2.2", "@js-soft/ts-serval": "2.0.16", "@types/json-stringify-safe": "^5.0.3", "@types/lodash": "^4.17.24", "@types/luxon": "^3.7.1", - "@types/qs": "^6.14.0", + "@types/qs": "^6.15.0", "correlation-id": "^5.2.0", - "expect": "^30.2.0", - "testcontainers": "^11.12.0", + "expect": "^30.3.0", + "testcontainers": "^11.13.0", "ts-mockito": "^2.6.1" } + }, + "packages/transport/node_modules/@js-soft/logging-abstractions": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@js-soft/logging-abstractions/-/logging-abstractions-1.2.2.tgz", + "integrity": "sha512-+gAiMACXJGlBNVeg2E9MD+bC8fPr7VeaEB8poJjv9iO7IG+c4SE1X29nzSeUjV+n4zXDyQjcWUraL1U5IqdDnw==", + "license": "MIT" } } } diff --git a/package.json b/package.json index a584a8079..f30354ee4 100644 --- a/package.json +++ b/package.json @@ -32,16 +32,16 @@ "devDependencies": { "@babel/preset-env": "^7.29.0", "@babel/preset-typescript": "^7.28.5", - "@js-soft/eslint-config-ts": "^2.0.4", + "@js-soft/eslint-config-ts": "^2.0.5", "@js-soft/license-check": "^1.0.10", "@types/jest": "^30.0.0", - "@types/node": "^24.10.15", + "@types/node": "^24.12.0", "enhanced-publish": "^1.1.7", - "eslint": "^9.39.3", - "jest": "^30.2.0", + "eslint": "^10.1.0", + "jest": "^30.3.0", "jest-expect-message": "^1.1.3", "madge": "^8.0.0", - "npm-check-updates": "^19.4.1", + "npm-check-updates": "^19.6.6", "patch-package": "^8.0.1", "prettier": "^3.8.1", "ts-jest": "^29.4.6", diff --git a/packages/app-runtime/package.json b/packages/app-runtime/package.json index 3b864279a..e2509bef2 100644 --- a/packages/app-runtime/package.json +++ b/packages/app-runtime/package.json @@ -74,7 +74,7 @@ "lodash": "^4.17.23" }, "devDependencies": { - "@js-soft/node-logger": "^1.2.1", + "@js-soft/node-logger": "^1.2.2", "@types/lodash": "^4.17.24", "@types/lokijs": "^1.5.14", "@types/luxon": "^3.7.1" diff --git a/packages/consumption/package.json b/packages/consumption/package.json index 960e6c6a0..0d0e5d4f7 100644 --- a/packages/consumption/package.json +++ b/packages/consumption/package.json @@ -94,7 +94,7 @@ "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", - "@js-soft/node-logger": "1.2.1", + "@js-soft/node-logger": "1.2.2", "@nmshd/crypto": "2.1.3", "@types/lodash": "^4.17.24", "@types/sjcl": "^1.0.34", diff --git a/packages/core-types/package.json b/packages/core-types/package.json index f919ea9f9..b4f021821 100644 --- a/packages/core-types/package.json +++ b/packages/core-types/package.json @@ -49,7 +49,7 @@ } }, "dependencies": { - "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/logging-abstractions": "^1.2.2", "@js-soft/ts-serval": "2.0.16", "@nmshd/crypto": "^2.1.3", "json-stringify-safe": "^5.0.1", diff --git a/packages/core-types/src/SharedPasswordProtection.ts b/packages/core-types/src/SharedPasswordProtection.ts index 289968f5b..2e1dfcc23 100644 --- a/packages/core-types/src/SharedPasswordProtection.ts +++ b/packages/core-types/src/SharedPasswordProtection.ts @@ -6,7 +6,6 @@ export interface ISharedPasswordProtection extends ISerializable { passwordType: "pw" | `pin${number}`; salt: ICoreBuffer; passwordLocationIndicator?: number; - password?: string; } export class SharedPasswordProtection extends Serializable implements ISharedPasswordProtection { @@ -22,10 +21,6 @@ export class SharedPasswordProtection extends Serializable implements ISharedPas @serialize({ any: true }) public passwordLocationIndicator?: number; - @validate({ nullable: true }) - @serialize() - public password?: string; - public static from(value: ISharedPasswordProtection): SharedPasswordProtection { return this.fromAny(value); } @@ -34,8 +29,8 @@ export class SharedPasswordProtection extends Serializable implements ISharedPas if (value === undefined || value === "") return undefined; const splittedPasswordParts = value.split("&"); - if (![2, 3, 4].includes(splittedPasswordParts.length)) { - throw new CoreError("error.core-types.invalidTruncatedReference", "The password part of a TruncatedReference must consist of 2, 3 or 4 components."); + if (![2, 3].includes(splittedPasswordParts.length)) { + throw new CoreError("error.core-types.invalidTruncatedReference", "The password part of a TruncatedReference must consist of 2 or 3 components."); } const passwordType = splittedPasswordParts[0] as "pw" | `pin${number}`; @@ -43,9 +38,7 @@ export class SharedPasswordProtection extends Serializable implements ISharedPas const salt = this.parseSalt(splittedPasswordParts[1]); - const password = splittedPasswordParts.length > 3 && splittedPasswordParts[3] ? splittedPasswordParts[3] : undefined; - - return SharedPasswordProtection.from({ passwordType, salt, passwordLocationIndicator, password }); + return SharedPasswordProtection.from({ passwordType, salt, passwordLocationIndicator }); } private static parseSalt(value: string): CoreBuffer { @@ -60,8 +53,8 @@ export class SharedPasswordProtection extends Serializable implements ISharedPas public truncate(): string { const base = `${this.passwordType}&${this.salt.toBase64()}`; - if (this.passwordLocationIndicator === undefined && this.password === undefined) return base; + if (this.passwordLocationIndicator === undefined) return base; - return `${base}&${this.passwordLocationIndicator ?? ""}${this.password ? `&${this.password}` : ""}`; + return `${base}&${this.passwordLocationIndicator ?? ""}`; } } diff --git a/packages/core-types/test/references/Reference.test.ts b/packages/core-types/test/references/Reference.test.ts index d806209c1..bf55ac2e8 100644 --- a/packages/core-types/test/references/Reference.test.ts +++ b/packages/core-types/test/references/Reference.test.ts @@ -50,27 +50,7 @@ describe("Reference", () => { ); }); - test("toUrl with a cleartext password in the passwordProtection reference fields used", () => { - const reference = Reference.from({ - id: CoreId.from("ANID1234"), - backboneBaseUrl: "https://backbone.example.com", - key: CryptoSecretKey.from({ - secretKey: CoreBuffer.from("lerJyX8ydJDEXowq2PMMntRXXA27wgHJYA_BjnFx55Y"), - algorithm: CryptoEncryptionAlgorithm.XCHACHA20_POLY1305 - }), - passwordProtection: SharedPasswordProtection.from({ - passwordType: "pw", - salt: CoreBuffer.fromUtf8("a16byteslongsalt"), - password: "aPassword" - }) - }); - - expect(reference.toUrl()).toBe( - "https://backbone.example.com/r/ANID1234#M3xsZXJKeVg4eWRKREVYb3dxMlBNTW50UlhYQTI3d2dISllBX0JqbkZ4NTVZfHxwdyZZVEUyWW5sMFpYTnNiMjVuYzJGc2RBPT0mJmFQYXNzd29yZA" - ); - }); - - test("toUrl without a cleartext password but with a passwordLocationIndicator in the passwordProtection reference fields used", () => { + test("toUrl with a passwordLocationIndicator in the passwordProtection reference fields used", () => { const reference = Reference.from({ id: CoreId.from("ANID1234"), backboneBaseUrl: "https://backbone.example.com", diff --git a/packages/runtime-types/package.json b/packages/runtime-types/package.json index 3e175c24a..bc7e81faa 100644 --- a/packages/runtime-types/package.json +++ b/packages/runtime-types/package.json @@ -20,7 +20,10 @@ "cdep": "tsc && madge --circular dist", "lint:tsc": "tsc --noEmit" }, - "dependencies": {}, + "dependencies": { + "@js-soft/ts-utils": "2.3.5", + "@nmshd/content": "*" + }, "devDependencies": {}, "publishConfig": { "access": "public", diff --git a/packages/runtime-types/src/consumption/AttributeTagCollectionDTO.ts b/packages/runtime-types/src/dtos/consumption/AttributeTagCollectionDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/AttributeTagCollectionDTO.ts rename to packages/runtime-types/src/dtos/consumption/AttributeTagCollectionDTO.ts diff --git a/packages/runtime-types/src/consumption/DraftDTO.ts b/packages/runtime-types/src/dtos/consumption/DraftDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/DraftDTO.ts rename to packages/runtime-types/src/dtos/consumption/DraftDTO.ts diff --git a/packages/runtime-types/src/consumption/IdentityMetadataDTO.ts b/packages/runtime-types/src/dtos/consumption/IdentityMetadataDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/IdentityMetadataDTO.ts rename to packages/runtime-types/src/dtos/consumption/IdentityMetadataDTO.ts diff --git a/packages/runtime-types/src/consumption/LocalAttributeDTO.ts b/packages/runtime-types/src/dtos/consumption/LocalAttributeDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/LocalAttributeDTO.ts rename to packages/runtime-types/src/dtos/consumption/LocalAttributeDTO.ts diff --git a/packages/runtime-types/src/consumption/LocalAttributeDeletionInfoDTO.ts b/packages/runtime-types/src/dtos/consumption/LocalAttributeDeletionInfoDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/LocalAttributeDeletionInfoDTO.ts rename to packages/runtime-types/src/dtos/consumption/LocalAttributeDeletionInfoDTO.ts diff --git a/packages/runtime-types/src/consumption/LocalAttributeForwardingDetailsDTO.ts b/packages/runtime-types/src/dtos/consumption/LocalAttributeForwardingDetailsDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/LocalAttributeForwardingDetailsDTO.ts rename to packages/runtime-types/src/dtos/consumption/LocalAttributeForwardingDetailsDTO.ts diff --git a/packages/runtime-types/src/consumption/LocalNotificationDTO.ts b/packages/runtime-types/src/dtos/consumption/LocalNotificationDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/LocalNotificationDTO.ts rename to packages/runtime-types/src/dtos/consumption/LocalNotificationDTO.ts diff --git a/packages/runtime-types/src/consumption/LocalRequestDTO.ts b/packages/runtime-types/src/dtos/consumption/LocalRequestDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/LocalRequestDTO.ts rename to packages/runtime-types/src/dtos/consumption/LocalRequestDTO.ts diff --git a/packages/runtime-types/src/consumption/RequestValidationResultDTO.ts b/packages/runtime-types/src/dtos/consumption/RequestValidationResultDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/RequestValidationResultDTO.ts rename to packages/runtime-types/src/dtos/consumption/RequestValidationResultDTO.ts diff --git a/packages/runtime-types/src/consumption/SettingDTO.ts b/packages/runtime-types/src/dtos/consumption/SettingDTO.ts similarity index 100% rename from packages/runtime-types/src/consumption/SettingDTO.ts rename to packages/runtime-types/src/dtos/consumption/SettingDTO.ts diff --git a/packages/runtime-types/src/consumption/index.ts b/packages/runtime-types/src/dtos/consumption/index.ts similarity index 100% rename from packages/runtime-types/src/consumption/index.ts rename to packages/runtime-types/src/dtos/consumption/index.ts diff --git a/packages/runtime-types/src/dtos/index.ts b/packages/runtime-types/src/dtos/index.ts new file mode 100644 index 000000000..c947cd4d9 --- /dev/null +++ b/packages/runtime-types/src/dtos/index.ts @@ -0,0 +1,2 @@ +export * from "./consumption"; +export * from "./transport"; diff --git a/packages/runtime-types/src/transport/AnnouncementDTO.ts b/packages/runtime-types/src/dtos/transport/AnnouncementDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/AnnouncementDTO.ts rename to packages/runtime-types/src/dtos/transport/AnnouncementDTO.ts diff --git a/packages/runtime-types/src/transport/ChallengeDTO.ts b/packages/runtime-types/src/dtos/transport/ChallengeDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/ChallengeDTO.ts rename to packages/runtime-types/src/dtos/transport/ChallengeDTO.ts diff --git a/packages/runtime-types/src/transport/DeviceDTO.ts b/packages/runtime-types/src/dtos/transport/DeviceDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/DeviceDTO.ts rename to packages/runtime-types/src/dtos/transport/DeviceDTO.ts diff --git a/packages/runtime-types/src/transport/DeviceOnboardingInfoDTO.ts b/packages/runtime-types/src/dtos/transport/DeviceOnboardingInfoDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/DeviceOnboardingInfoDTO.ts rename to packages/runtime-types/src/dtos/transport/DeviceOnboardingInfoDTO.ts diff --git a/packages/runtime-types/src/transport/EmptyTokenDTO.ts b/packages/runtime-types/src/dtos/transport/EmptyTokenDTO.ts similarity index 56% rename from packages/runtime-types/src/transport/EmptyTokenDTO.ts rename to packages/runtime-types/src/dtos/transport/EmptyTokenDTO.ts index 162646e86..660f0dd35 100644 --- a/packages/runtime-types/src/transport/EmptyTokenDTO.ts +++ b/packages/runtime-types/src/dtos/transport/EmptyTokenDTO.ts @@ -1,9 +1,6 @@ -import { PasswordProtectionDTO } from "./PasswordProtectionDTO"; - export interface EmptyTokenDTO { id: string; expiresAt: string; - passwordProtection: PasswordProtectionDTO; reference: { truncated: string; url: string; diff --git a/packages/runtime-types/src/transport/FileDTO.ts b/packages/runtime-types/src/dtos/transport/FileDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/FileDTO.ts rename to packages/runtime-types/src/dtos/transport/FileDTO.ts diff --git a/packages/runtime-types/src/transport/IdentityDTO.ts b/packages/runtime-types/src/dtos/transport/IdentityDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/IdentityDTO.ts rename to packages/runtime-types/src/dtos/transport/IdentityDTO.ts diff --git a/packages/runtime-types/src/transport/IdentityDeletionProcessDTO.ts b/packages/runtime-types/src/dtos/transport/IdentityDeletionProcessDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/IdentityDeletionProcessDTO.ts rename to packages/runtime-types/src/dtos/transport/IdentityDeletionProcessDTO.ts diff --git a/packages/runtime-types/src/transport/MessageDTO.ts b/packages/runtime-types/src/dtos/transport/MessageDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/MessageDTO.ts rename to packages/runtime-types/src/dtos/transport/MessageDTO.ts diff --git a/packages/runtime-types/src/transport/MessageWithAttachmentsDTO.ts b/packages/runtime-types/src/dtos/transport/MessageWithAttachmentsDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/MessageWithAttachmentsDTO.ts rename to packages/runtime-types/src/dtos/transport/MessageWithAttachmentsDTO.ts diff --git a/packages/runtime-types/src/transport/PasswordProtectionDTO.ts b/packages/runtime-types/src/dtos/transport/PasswordProtectionDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/PasswordProtectionDTO.ts rename to packages/runtime-types/src/dtos/transport/PasswordProtectionDTO.ts diff --git a/packages/runtime-types/src/transport/PublicRelationshipTemplateReferenceDTO.ts b/packages/runtime-types/src/dtos/transport/PublicRelationshipTemplateReferenceDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/PublicRelationshipTemplateReferenceDTO.ts rename to packages/runtime-types/src/dtos/transport/PublicRelationshipTemplateReferenceDTO.ts diff --git a/packages/runtime-types/src/transport/RecipientDTO.ts b/packages/runtime-types/src/dtos/transport/RecipientDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/RecipientDTO.ts rename to packages/runtime-types/src/dtos/transport/RecipientDTO.ts diff --git a/packages/runtime-types/src/transport/RelationshipDTO.ts b/packages/runtime-types/src/dtos/transport/RelationshipDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/RelationshipDTO.ts rename to packages/runtime-types/src/dtos/transport/RelationshipDTO.ts diff --git a/packages/runtime-types/src/transport/RelationshipTemplateDTO.ts b/packages/runtime-types/src/dtos/transport/RelationshipTemplateDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/RelationshipTemplateDTO.ts rename to packages/runtime-types/src/dtos/transport/RelationshipTemplateDTO.ts diff --git a/packages/runtime-types/src/transport/TokenDTO.ts b/packages/runtime-types/src/dtos/transport/TokenDTO.ts similarity index 100% rename from packages/runtime-types/src/transport/TokenDTO.ts rename to packages/runtime-types/src/dtos/transport/TokenDTO.ts diff --git a/packages/runtime-types/src/transport/index.ts b/packages/runtime-types/src/dtos/transport/index.ts similarity index 100% rename from packages/runtime-types/src/transport/index.ts rename to packages/runtime-types/src/dtos/transport/index.ts diff --git a/packages/runtime/src/events/DataEvent.ts b/packages/runtime-types/src/events/DataEvent.ts similarity index 100% rename from packages/runtime/src/events/DataEvent.ts rename to packages/runtime-types/src/events/DataEvent.ts diff --git a/packages/runtime/src/events/consumption/AttributeCreatedEvent.ts b/packages/runtime-types/src/events/consumption/AttributeCreatedEvent.ts similarity index 85% rename from packages/runtime/src/events/consumption/AttributeCreatedEvent.ts rename to packages/runtime-types/src/events/consumption/AttributeCreatedEvent.ts index c12f384bf..53e87b014 100644 --- a/packages/runtime/src/events/consumption/AttributeCreatedEvent.ts +++ b/packages/runtime-types/src/events/consumption/AttributeCreatedEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class AttributeCreatedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/AttributeDeletedEvent.ts b/packages/runtime-types/src/events/consumption/AttributeDeletedEvent.ts similarity index 85% rename from packages/runtime/src/events/consumption/AttributeDeletedEvent.ts rename to packages/runtime-types/src/events/consumption/AttributeDeletedEvent.ts index 9df4c5344..b2a9977ab 100644 --- a/packages/runtime/src/events/consumption/AttributeDeletedEvent.ts +++ b/packages/runtime-types/src/events/consumption/AttributeDeletedEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class AttributeDeletedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts b/packages/runtime-types/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts similarity index 87% rename from packages/runtime/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts rename to packages/runtime-types/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts index 49e0a9f9d..437fd3161 100644 --- a/packages/runtime/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts +++ b/packages/runtime-types/src/events/consumption/AttributeForwardingDetailsChangedEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class AttributeForwardingDetailsChangedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/AttributeSucceededEvent.ts b/packages/runtime-types/src/events/consumption/AttributeSucceededEvent.ts similarity index 89% rename from packages/runtime/src/events/consumption/AttributeSucceededEvent.ts rename to packages/runtime-types/src/events/consumption/AttributeSucceededEvent.ts index c2903593a..d70ff3a56 100644 --- a/packages/runtime/src/events/consumption/AttributeSucceededEvent.ts +++ b/packages/runtime-types/src/events/consumption/AttributeSucceededEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export interface AttributeSucceededEventData { diff --git a/packages/runtime/src/events/consumption/AttributeWasViewedAtChangedEvent.ts b/packages/runtime-types/src/events/consumption/AttributeWasViewedAtChangedEvent.ts similarity index 86% rename from packages/runtime/src/events/consumption/AttributeWasViewedAtChangedEvent.ts rename to packages/runtime-types/src/events/consumption/AttributeWasViewedAtChangedEvent.ts index 7018b07f7..95374c304 100644 --- a/packages/runtime/src/events/consumption/AttributeWasViewedAtChangedEvent.ts +++ b/packages/runtime-types/src/events/consumption/AttributeWasViewedAtChangedEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class AttributeWasViewedAtChangedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts b/packages/runtime-types/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts similarity index 87% rename from packages/runtime/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts rename to packages/runtime-types/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts index c1d444572..2f75b040e 100644 --- a/packages/runtime/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts +++ b/packages/runtime-types/src/events/consumption/ForwardedAttributeDeletedByPeerEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class ForwardedAttributeDeletedByPeerEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/IncomingRequestReceivedEvent.ts b/packages/runtime-types/src/events/consumption/IncomingRequestReceivedEvent.ts similarity index 89% rename from packages/runtime/src/events/consumption/IncomingRequestReceivedEvent.ts rename to packages/runtime-types/src/events/consumption/IncomingRequestReceivedEvent.ts index 5a597b07f..6a135761e 100644 --- a/packages/runtime/src/events/consumption/IncomingRequestReceivedEvent.ts +++ b/packages/runtime-types/src/events/consumption/IncomingRequestReceivedEvent.ts @@ -1,4 +1,4 @@ -import { LocalRequestDTO } from "@nmshd/runtime-types"; +import { LocalRequestDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class IncomingRequestReceivedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/IncomingRequestStatusChangedEvent.ts b/packages/runtime-types/src/events/consumption/IncomingRequestStatusChangedEvent.ts similarity index 85% rename from packages/runtime/src/events/consumption/IncomingRequestStatusChangedEvent.ts rename to packages/runtime-types/src/events/consumption/IncomingRequestStatusChangedEvent.ts index 259e998b0..c6357bf72 100644 --- a/packages/runtime/src/events/consumption/IncomingRequestStatusChangedEvent.ts +++ b/packages/runtime-types/src/events/consumption/IncomingRequestStatusChangedEvent.ts @@ -1,5 +1,4 @@ -import { LocalRequestStatus } from "@nmshd/consumption"; -import { LocalRequestDTO } from "@nmshd/runtime-types"; +import { LocalRequestDTO, LocalRequestStatus } from "../../dtos"; import { DataEvent } from "../DataEvent"; export interface IncomingRequestStatusChangedEventData { diff --git a/packages/runtime/src/events/consumption/MailReceivedEvent.ts b/packages/runtime-types/src/events/consumption/MailReceivedEvent.ts similarity index 89% rename from packages/runtime/src/events/consumption/MailReceivedEvent.ts rename to packages/runtime-types/src/events/consumption/MailReceivedEvent.ts index aa75888d2..083feabe2 100644 --- a/packages/runtime/src/events/consumption/MailReceivedEvent.ts +++ b/packages/runtime-types/src/events/consumption/MailReceivedEvent.ts @@ -1,5 +1,5 @@ import { Mail } from "@nmshd/content"; -import { MessageDTO } from "@nmshd/runtime-types"; +import { MessageDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class MailReceivedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/MessageProcessedEvent.ts b/packages/runtime-types/src/events/consumption/MessageProcessedEvent.ts similarity index 93% rename from packages/runtime/src/events/consumption/MessageProcessedEvent.ts rename to packages/runtime-types/src/events/consumption/MessageProcessedEvent.ts index 3c6627c8a..0ef277d32 100644 --- a/packages/runtime/src/events/consumption/MessageProcessedEvent.ts +++ b/packages/runtime-types/src/events/consumption/MessageProcessedEvent.ts @@ -1,4 +1,4 @@ -import { MessageDTO } from "@nmshd/runtime-types"; +import { MessageDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class MessageProcessedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts b/packages/runtime-types/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts similarity index 89% rename from packages/runtime/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts rename to packages/runtime-types/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts index 7a4cc6490..222c69813 100644 --- a/packages/runtime/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts +++ b/packages/runtime-types/src/events/consumption/OutgoingRequestCreatedAndCompletedEvent.ts @@ -1,4 +1,4 @@ -import { LocalRequestDTO } from "@nmshd/runtime-types"; +import { LocalRequestDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class OutgoingRequestCreatedAndCompletedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/OutgoingRequestCreatedEvent.ts b/packages/runtime-types/src/events/consumption/OutgoingRequestCreatedEvent.ts similarity index 89% rename from packages/runtime/src/events/consumption/OutgoingRequestCreatedEvent.ts rename to packages/runtime-types/src/events/consumption/OutgoingRequestCreatedEvent.ts index 86a7d78a6..4c5b36c17 100644 --- a/packages/runtime/src/events/consumption/OutgoingRequestCreatedEvent.ts +++ b/packages/runtime-types/src/events/consumption/OutgoingRequestCreatedEvent.ts @@ -1,4 +1,4 @@ -import { LocalRequestDTO } from "@nmshd/runtime-types"; +import { LocalRequestDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class OutgoingRequestCreatedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts b/packages/runtime-types/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts similarity index 90% rename from packages/runtime/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts rename to packages/runtime-types/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts index 8ef257daa..73483401f 100644 --- a/packages/runtime/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts +++ b/packages/runtime-types/src/events/consumption/OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent.ts @@ -1,4 +1,4 @@ -import { LocalRequestDTO } from "@nmshd/runtime-types"; +import { LocalRequestDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/OutgoingRequestStatusChangedEvent.ts b/packages/runtime-types/src/events/consumption/OutgoingRequestStatusChangedEvent.ts similarity index 85% rename from packages/runtime/src/events/consumption/OutgoingRequestStatusChangedEvent.ts rename to packages/runtime-types/src/events/consumption/OutgoingRequestStatusChangedEvent.ts index b523184d8..03b46c21d 100644 --- a/packages/runtime/src/events/consumption/OutgoingRequestStatusChangedEvent.ts +++ b/packages/runtime-types/src/events/consumption/OutgoingRequestStatusChangedEvent.ts @@ -1,5 +1,4 @@ -import { LocalRequestStatus } from "@nmshd/consumption"; -import { LocalRequestDTO } from "@nmshd/runtime-types"; +import { LocalRequestDTO, LocalRequestStatus } from "../../dtos"; import { DataEvent } from "../DataEvent"; export interface OutgoingRequestStatusChangedEventData { diff --git a/packages/runtime/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts b/packages/runtime-types/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts similarity index 86% rename from packages/runtime/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts rename to packages/runtime-types/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts index ea9336141..4835c1caa 100644 --- a/packages/runtime/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts +++ b/packages/runtime-types/src/events/consumption/OwnAttributeDeletedByOwnerEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class OwnAttributeDeletedByOwnerEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts b/packages/runtime-types/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts similarity index 87% rename from packages/runtime/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts rename to packages/runtime-types/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts index 63252c626..c00c32c23 100644 --- a/packages/runtime/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts +++ b/packages/runtime-types/src/events/consumption/PeerRelationshipAttributeDeletedByPeerEvent.ts @@ -1,4 +1,4 @@ -import { LocalAttributeDTO } from "@nmshd/runtime-types"; +import { LocalAttributeDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class PeerRelationshipAttributeDeletedByPeerEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/RelationshipEvent.ts b/packages/runtime-types/src/events/consumption/RelationshipEvent.ts similarity index 88% rename from packages/runtime/src/events/consumption/RelationshipEvent.ts rename to packages/runtime-types/src/events/consumption/RelationshipEvent.ts index e75cb6b83..f754502fc 100644 --- a/packages/runtime/src/events/consumption/RelationshipEvent.ts +++ b/packages/runtime-types/src/events/consumption/RelationshipEvent.ts @@ -1,5 +1,5 @@ import { Event } from "@js-soft/ts-utils"; -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class RelationshipEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/RelationshipTemplateProcessedEvent.ts b/packages/runtime-types/src/events/consumption/RelationshipTemplateProcessedEvent.ts similarity index 96% rename from packages/runtime/src/events/consumption/RelationshipTemplateProcessedEvent.ts rename to packages/runtime-types/src/events/consumption/RelationshipTemplateProcessedEvent.ts index 152ade1c5..3c827274e 100644 --- a/packages/runtime/src/events/consumption/RelationshipTemplateProcessedEvent.ts +++ b/packages/runtime-types/src/events/consumption/RelationshipTemplateProcessedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipTemplateDTO } from "@nmshd/runtime-types"; +import { RelationshipTemplateDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class RelationshipTemplateProcessedEvent extends DataEvent { diff --git a/packages/runtime/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts b/packages/runtime-types/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts similarity index 100% rename from packages/runtime/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts rename to packages/runtime-types/src/events/consumption/ShareCredentialOfferRequestItemProcessedByRecipientEvent.ts diff --git a/packages/runtime/src/events/consumption/index.ts b/packages/runtime-types/src/events/consumption/index.ts similarity index 100% rename from packages/runtime/src/events/consumption/index.ts rename to packages/runtime-types/src/events/consumption/index.ts diff --git a/packages/runtime/src/events/index.ts b/packages/runtime-types/src/events/index.ts similarity index 100% rename from packages/runtime/src/events/index.ts rename to packages/runtime-types/src/events/index.ts diff --git a/packages/runtime/src/events/runtime/ModulesInitializedEvent.ts b/packages/runtime-types/src/events/runtime/ModulesInitializedEvent.ts similarity index 100% rename from packages/runtime/src/events/runtime/ModulesInitializedEvent.ts rename to packages/runtime-types/src/events/runtime/ModulesInitializedEvent.ts diff --git a/packages/runtime/src/events/runtime/ModulesLoadedEvent.ts b/packages/runtime-types/src/events/runtime/ModulesLoadedEvent.ts similarity index 100% rename from packages/runtime/src/events/runtime/ModulesLoadedEvent.ts rename to packages/runtime-types/src/events/runtime/ModulesLoadedEvent.ts diff --git a/packages/runtime/src/events/runtime/ModulesStartedEvent.ts b/packages/runtime-types/src/events/runtime/ModulesStartedEvent.ts similarity index 100% rename from packages/runtime/src/events/runtime/ModulesStartedEvent.ts rename to packages/runtime-types/src/events/runtime/ModulesStartedEvent.ts diff --git a/packages/runtime/src/events/runtime/RuntimeInitializedEvent.ts b/packages/runtime-types/src/events/runtime/RuntimeInitializedEvent.ts similarity index 100% rename from packages/runtime/src/events/runtime/RuntimeInitializedEvent.ts rename to packages/runtime-types/src/events/runtime/RuntimeInitializedEvent.ts diff --git a/packages/runtime/src/events/runtime/RuntimeInitializingEvent.ts b/packages/runtime-types/src/events/runtime/RuntimeInitializingEvent.ts similarity index 100% rename from packages/runtime/src/events/runtime/RuntimeInitializingEvent.ts rename to packages/runtime-types/src/events/runtime/RuntimeInitializingEvent.ts diff --git a/packages/runtime/src/events/runtime/index.ts b/packages/runtime-types/src/events/runtime/index.ts similarity index 100% rename from packages/runtime/src/events/runtime/index.ts rename to packages/runtime-types/src/events/runtime/index.ts diff --git a/packages/runtime/src/events/transport/DatawalletSynchronizedEvent.ts b/packages/runtime-types/src/events/transport/DatawalletSynchronizedEvent.ts similarity index 100% rename from packages/runtime/src/events/transport/DatawalletSynchronizedEvent.ts rename to packages/runtime-types/src/events/transport/DatawalletSynchronizedEvent.ts diff --git a/packages/runtime/src/events/transport/FileOwnershipClaimedEvent.ts b/packages/runtime-types/src/events/transport/FileOwnershipClaimedEvent.ts similarity index 87% rename from packages/runtime/src/events/transport/FileOwnershipClaimedEvent.ts rename to packages/runtime-types/src/events/transport/FileOwnershipClaimedEvent.ts index 3d63cdd26..6771401fe 100644 --- a/packages/runtime/src/events/transport/FileOwnershipClaimedEvent.ts +++ b/packages/runtime-types/src/events/transport/FileOwnershipClaimedEvent.ts @@ -1,4 +1,4 @@ -import { FileDTO } from "@nmshd/runtime-types"; +import { FileDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class FileOwnershipClaimedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/FileOwnershipLockedEvent.ts b/packages/runtime-types/src/events/transport/FileOwnershipLockedEvent.ts similarity index 87% rename from packages/runtime/src/events/transport/FileOwnershipLockedEvent.ts rename to packages/runtime-types/src/events/transport/FileOwnershipLockedEvent.ts index e8fd9689c..81d011c49 100644 --- a/packages/runtime/src/events/transport/FileOwnershipLockedEvent.ts +++ b/packages/runtime-types/src/events/transport/FileOwnershipLockedEvent.ts @@ -1,4 +1,4 @@ -import { FileDTO } from "@nmshd/runtime-types"; +import { FileDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class FileOwnershipLockedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts b/packages/runtime-types/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts similarity index 86% rename from packages/runtime/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts rename to packages/runtime-types/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts index 3587f9522..1cdbc2dfc 100644 --- a/packages/runtime/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts +++ b/packages/runtime-types/src/events/transport/IdentityDeletionProcessStatusChangedEvent.ts @@ -1,4 +1,4 @@ -import { IdentityDeletionProcessDTO } from "@nmshd/runtime-types"; +import { IdentityDeletionProcessDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class IdentityDeletionProcessStatusChangedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/MessageDeliveredEvent.ts b/packages/runtime-types/src/events/transport/MessageDeliveredEvent.ts similarity index 89% rename from packages/runtime/src/events/transport/MessageDeliveredEvent.ts rename to packages/runtime-types/src/events/transport/MessageDeliveredEvent.ts index a20d2f2e7..d6569bfa7 100644 --- a/packages/runtime/src/events/transport/MessageDeliveredEvent.ts +++ b/packages/runtime-types/src/events/transport/MessageDeliveredEvent.ts @@ -1,4 +1,4 @@ -import { MessageDTO } from "@nmshd/runtime-types"; +import { MessageDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; // This event is currently not triggered because it is disabled in the Backbone. (JSSNMSHDD-2372) diff --git a/packages/runtime/src/events/transport/MessageReceivedEvent.ts b/packages/runtime-types/src/events/transport/MessageReceivedEvent.ts similarity index 86% rename from packages/runtime/src/events/transport/MessageReceivedEvent.ts rename to packages/runtime-types/src/events/transport/MessageReceivedEvent.ts index 1759735f9..deeb23efb 100644 --- a/packages/runtime/src/events/transport/MessageReceivedEvent.ts +++ b/packages/runtime-types/src/events/transport/MessageReceivedEvent.ts @@ -1,4 +1,4 @@ -import { MessageDTO } from "@nmshd/runtime-types"; +import { MessageDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class MessageReceivedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/MessageSentEvent.ts b/packages/runtime-types/src/events/transport/MessageSentEvent.ts similarity index 86% rename from packages/runtime/src/events/transport/MessageSentEvent.ts rename to packages/runtime-types/src/events/transport/MessageSentEvent.ts index ee6f68a8e..80a028097 100644 --- a/packages/runtime/src/events/transport/MessageSentEvent.ts +++ b/packages/runtime-types/src/events/transport/MessageSentEvent.ts @@ -1,4 +1,4 @@ -import { MessageDTO } from "@nmshd/runtime-types"; +import { MessageDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class MessageSentEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/MessageWasReadAtChangedEvent.ts b/packages/runtime-types/src/events/transport/MessageWasReadAtChangedEvent.ts similarity index 87% rename from packages/runtime/src/events/transport/MessageWasReadAtChangedEvent.ts rename to packages/runtime-types/src/events/transport/MessageWasReadAtChangedEvent.ts index 42142ea8e..8ddc16e64 100644 --- a/packages/runtime/src/events/transport/MessageWasReadAtChangedEvent.ts +++ b/packages/runtime-types/src/events/transport/MessageWasReadAtChangedEvent.ts @@ -1,4 +1,4 @@ -import { MessageDTO } from "@nmshd/runtime-types"; +import { MessageDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class MessageWasReadAtChangedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/PeerDeletedEvent.ts b/packages/runtime-types/src/events/transport/PeerDeletedEvent.ts similarity index 85% rename from packages/runtime/src/events/transport/PeerDeletedEvent.ts rename to packages/runtime-types/src/events/transport/PeerDeletedEvent.ts index 3887db15d..b5843d4ec 100644 --- a/packages/runtime/src/events/transport/PeerDeletedEvent.ts +++ b/packages/runtime-types/src/events/transport/PeerDeletedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class PeerDeletedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/PeerDeletionCancelledEvent.ts b/packages/runtime-types/src/events/transport/PeerDeletionCancelledEvent.ts similarity index 86% rename from packages/runtime/src/events/transport/PeerDeletionCancelledEvent.ts rename to packages/runtime-types/src/events/transport/PeerDeletionCancelledEvent.ts index 8c48f3afd..80762e0d1 100644 --- a/packages/runtime/src/events/transport/PeerDeletionCancelledEvent.ts +++ b/packages/runtime-types/src/events/transport/PeerDeletionCancelledEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class PeerDeletionCancelledEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts b/packages/runtime-types/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts similarity index 86% rename from packages/runtime/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts rename to packages/runtime-types/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts index 14fee707d..efc6285e9 100644 --- a/packages/runtime/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts +++ b/packages/runtime-types/src/events/transport/PeerRelationshipTemplateLoadedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipTemplateDTO } from "@nmshd/runtime-types"; +import { RelationshipTemplateDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class PeerRelationshipTemplateLoadedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/PeerToBeDeletedEvent.ts b/packages/runtime-types/src/events/transport/PeerToBeDeletedEvent.ts similarity index 85% rename from packages/runtime/src/events/transport/PeerToBeDeletedEvent.ts rename to packages/runtime-types/src/events/transport/PeerToBeDeletedEvent.ts index c51fd1604..6999e86e5 100644 --- a/packages/runtime/src/events/transport/PeerToBeDeletedEvent.ts +++ b/packages/runtime-types/src/events/transport/PeerToBeDeletedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class PeerToBeDeletedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/RelationshipChangedEvent.ts b/packages/runtime-types/src/events/transport/RelationshipChangedEvent.ts similarity index 86% rename from packages/runtime/src/events/transport/RelationshipChangedEvent.ts rename to packages/runtime-types/src/events/transport/RelationshipChangedEvent.ts index 676f1ecd7..a3483b1f9 100644 --- a/packages/runtime/src/events/transport/RelationshipChangedEvent.ts +++ b/packages/runtime-types/src/events/transport/RelationshipChangedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class RelationshipChangedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/RelationshipDecomposedBySelfEvent.ts b/packages/runtime-types/src/events/transport/RelationshipDecomposedBySelfEvent.ts similarity index 100% rename from packages/runtime/src/events/transport/RelationshipDecomposedBySelfEvent.ts rename to packages/runtime-types/src/events/transport/RelationshipDecomposedBySelfEvent.ts diff --git a/packages/runtime/src/events/transport/RelationshipReactivationCompletedEvent.ts b/packages/runtime-types/src/events/transport/RelationshipReactivationCompletedEvent.ts similarity index 87% rename from packages/runtime/src/events/transport/RelationshipReactivationCompletedEvent.ts rename to packages/runtime-types/src/events/transport/RelationshipReactivationCompletedEvent.ts index 2b68d43c9..8402ef721 100644 --- a/packages/runtime/src/events/transport/RelationshipReactivationCompletedEvent.ts +++ b/packages/runtime-types/src/events/transport/RelationshipReactivationCompletedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class RelationshipReactivationCompletedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/RelationshipReactivationRequestedEvent.ts b/packages/runtime-types/src/events/transport/RelationshipReactivationRequestedEvent.ts similarity index 87% rename from packages/runtime/src/events/transport/RelationshipReactivationRequestedEvent.ts rename to packages/runtime-types/src/events/transport/RelationshipReactivationRequestedEvent.ts index da5180bf8..49a4180b8 100644 --- a/packages/runtime/src/events/transport/RelationshipReactivationRequestedEvent.ts +++ b/packages/runtime-types/src/events/transport/RelationshipReactivationRequestedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipDTO } from "@nmshd/runtime-types"; +import { RelationshipDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class RelationshipReactivationRequestedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts b/packages/runtime-types/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts similarity index 87% rename from packages/runtime/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts rename to packages/runtime-types/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts index 0f69a49e6..eb1e1cfef 100644 --- a/packages/runtime/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts +++ b/packages/runtime-types/src/events/transport/RelationshipTemplateAllocationsExhaustedEvent.ts @@ -1,4 +1,4 @@ -import { RelationshipTemplateDTO } from "@nmshd/runtime-types"; +import { RelationshipTemplateDTO } from "../../dtos"; import { DataEvent } from "../DataEvent"; export class RelationshipTemplateAllocationsExhaustedEvent extends DataEvent { diff --git a/packages/runtime/src/events/transport/index.ts b/packages/runtime-types/src/events/transport/index.ts similarity index 100% rename from packages/runtime/src/events/transport/index.ts rename to packages/runtime-types/src/events/transport/index.ts diff --git a/packages/runtime-types/src/index.ts b/packages/runtime-types/src/index.ts index 330fa3c56..699f02314 100644 --- a/packages/runtime-types/src/index.ts +++ b/packages/runtime-types/src/index.ts @@ -1,3 +1,3 @@ -export * from "./consumption"; +export * from "./dtos"; +export * from "./events"; export * from "./RuntimeHealth"; -export * from "./transport"; diff --git a/packages/runtime-types/tsconfig.json b/packages/runtime-types/tsconfig.json index a0c1fcab3..748e37916 100644 --- a/packages/runtime-types/tsconfig.json +++ b/packages/runtime-types/tsconfig.json @@ -6,5 +6,5 @@ }, "include": ["src/**/*.ts"], "exclude": [], - "references": [] + "references": [{ "path": "../content" }] } diff --git a/packages/runtime/package.json b/packages/runtime/package.json index aa7fe93bf..f53bcf1b5 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -77,7 +77,7 @@ }, "dependencies": { "@js-soft/docdb-querytranslator": "^1.1.6", - "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/logging-abstractions": "^1.2.2", "@js-soft/ts-serval": "2.0.16", "@js-soft/ts-utils": "^2.3.5", "@nmshd/consumption": "*", @@ -101,16 +101,16 @@ "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", - "@js-soft/node-logger": "1.2.1", "@nmshd/connector-sdk": "^7.3.0", "@types/elliptic": "^6.4.18", - "@types/json-stringify-safe": "^5.0.3", - "@types/lodash": "^4.17.24", - "@types/luxon": "^3.7.1", "jwt-decode": "^4.0.0", "@eudiplo/sdk-core": "^1.16.0", "openid-client": "^6.8.1", - "ts-json-schema-generator": "2.5.0", + "@js-soft/node-logger": "1.2.2", + "@types/json-stringify-safe": "^5.0.3", + "@types/lodash": "^4.17.24", + "@types/luxon": "^3.7.1", + "ts-json-schema-generator": "2.9.0", "ts-mockito": "^2.6.1" }, "publishConfig": { diff --git a/packages/runtime/src/Runtime.ts b/packages/runtime/src/Runtime.ts index 33aa70f07..b8a2c1077 100644 --- a/packages/runtime/src/Runtime.ts +++ b/packages/runtime/src/Runtime.ts @@ -13,7 +13,7 @@ import { SettingsController } from "@nmshd/consumption"; import { ICoreAddress } from "@nmshd/core-types"; -import { RuntimeHealth } from "@nmshd/runtime-types"; +import { ModulesInitializedEvent, ModulesLoadedEvent, ModulesStartedEvent, RuntimeHealth, RuntimeInitializedEvent, RuntimeInitializingEvent } from "@nmshd/runtime-types"; import { AccountController, AnnouncementController, @@ -39,7 +39,6 @@ import { buildInformation } from "./buildInformation"; import { ConfigHolder } from "./ConfigHolder"; import { DatabaseSchemaUpgrader } from "./DatabaseSchemaUpgrader"; import { DataViewExpander } from "./dataViews"; -import { ModulesInitializedEvent, ModulesLoadedEvent, ModulesStartedEvent, RuntimeInitializedEvent, RuntimeInitializingEvent } from "./events"; import { EventProxy } from "./events/EventProxy"; import { AnonymousServices, ConsumptionServices, ModuleConfiguration, RuntimeModuleRegistry, TransportServices } from "./extensibility"; import { DeciderModule, MessageModule, NotificationModule, RequestModule } from "./modules"; diff --git a/packages/runtime/src/events/EventProxy.ts b/packages/runtime/src/events/EventProxy.ts index 3e07cedb9..075f3b310 100644 --- a/packages/runtime/src/events/EventProxy.ts +++ b/packages/runtime/src/events/EventProxy.ts @@ -1,43 +1,41 @@ import { EventBus, EventHandler, SubscriptionTarget } from "@js-soft/ts-utils"; import * as consumption from "@nmshd/consumption"; -import * as transport from "@nmshd/transport"; -import { AttributeMapper, FileMapper, IdentityDeletionProcessMapper, MessageMapper, RelationshipMapper, RelationshipTemplateMapper, RequestMapper } from "../useCases"; import { AttributeCreatedEvent, AttributeDeletedEvent, AttributeForwardingDetailsChangedEvent, AttributeSucceededEvent, AttributeWasViewedAtChangedEvent, - ForwardedAttributeDeletedByPeerEvent, - IncomingRequestReceivedEvent, - IncomingRequestStatusChangedEvent, - OutgoingRequestCreatedAndCompletedEvent, - OutgoingRequestCreatedEvent, - OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent, - OutgoingRequestStatusChangedEvent, - OwnAttributeDeletedByOwnerEvent, - PeerRelationshipAttributeDeletedByPeerEvent, - ShareCredentialOfferRequestItemProcessedByRecipientEvent -} from "./consumption"; -import { DatawalletSynchronizedEvent, FileOwnershipClaimedEvent, FileOwnershipLockedEvent, + ForwardedAttributeDeletedByPeerEvent, IdentityDeletionProcessStatusChangedEvent, + IncomingRequestReceivedEvent, + IncomingRequestStatusChangedEvent, MessageDeliveredEvent, MessageReceivedEvent, MessageSentEvent, MessageWasReadAtChangedEvent, + OutgoingRequestCreatedAndCompletedEvent, + OutgoingRequestCreatedEvent, + OutgoingRequestFromRelationshipCreationCreatedAndCompletedEvent, + OutgoingRequestStatusChangedEvent, + OwnAttributeDeletedByOwnerEvent, PeerDeletedEvent, PeerDeletionCancelledEvent, + PeerRelationshipAttributeDeletedByPeerEvent, PeerRelationshipTemplateLoadedEvent, PeerToBeDeletedEvent, RelationshipChangedEvent, RelationshipDecomposedBySelfEvent, RelationshipReactivationCompletedEvent, RelationshipReactivationRequestedEvent, - RelationshipTemplateAllocationsExhaustedEvent -} from "./transport"; + RelationshipTemplateAllocationsExhaustedEvent, + ShareCredentialOfferRequestItemProcessedByRecipientEvent +} from "@nmshd/runtime-types"; +import * as transport from "@nmshd/transport"; +import { AttributeMapper, FileMapper, IdentityDeletionProcessMapper, MessageMapper, RelationshipMapper, RelationshipTemplateMapper, RequestMapper } from "../useCases"; export class EventProxy { private readonly subscriptionIds: number[] = []; diff --git a/packages/runtime/src/index.ts b/packages/runtime/src/index.ts index bb607e1dd..09ed29b75 100644 --- a/packages/runtime/src/index.ts +++ b/packages/runtime/src/index.ts @@ -1,7 +1,6 @@ export * from "@nmshd/runtime-types"; export * from "./buildInformation"; export * from "./dataViews"; -export * from "./events"; export * from "./extensibility"; export * from "./modules"; export * from "./Runtime"; diff --git a/packages/runtime/src/modules/DeciderModule.ts b/packages/runtime/src/modules/DeciderModule.ts index b42cca3bf..99e34555e 100644 --- a/packages/runtime/src/modules/DeciderModule.ts +++ b/packages/runtime/src/modules/DeciderModule.ts @@ -2,14 +2,14 @@ import { ApplicationError } from "@js-soft/ts-utils"; import { DecideRequestItemGroupParametersJSON, DecideRequestItemParametersJSON, LocalRequestStatus } from "@nmshd/consumption"; import { isRequestItemDerivation, RequestItemGroupJSON, RequestItemJSONDerivations } from "@nmshd/content"; import { CoreDate } from "@nmshd/core-types"; -import { LocalRequestDTO } from "@nmshd/runtime-types"; import { IncomingRequestStatusChangedEvent, + LocalRequestDTO, MessageProcessedEvent, MessageProcessedResult, RelationshipTemplateProcessedEvent, RelationshipTemplateProcessedResult -} from "../events"; +} from "@nmshd/runtime-types"; import { ModuleConfiguration, RuntimeModule } from "../extensibility"; import { RuntimeServices } from "../Runtime"; import { RuntimeErrors } from "../useCases/common/RuntimeErrors"; diff --git a/packages/runtime/src/modules/MessageModule.ts b/packages/runtime/src/modules/MessageModule.ts index a06f68c81..2cbeac3db 100644 --- a/packages/runtime/src/modules/MessageModule.ts +++ b/packages/runtime/src/modules/MessageModule.ts @@ -1,6 +1,6 @@ import { Event } from "@js-soft/ts-utils"; import { Mail, MailJSON } from "@nmshd/content"; -import { MailReceivedEvent, MessageReceivedEvent, RelationshipEvent } from "../events"; +import { MailReceivedEvent, MessageReceivedEvent, RelationshipEvent } from "@nmshd/runtime-types"; import { ModuleConfiguration, RuntimeModule } from "../extensibility/modules/RuntimeModule"; export interface MessageModuleConfiguration extends ModuleConfiguration {} diff --git a/packages/runtime/src/modules/NotificationModule.ts b/packages/runtime/src/modules/NotificationModule.ts index 923a7380a..8af530500 100644 --- a/packages/runtime/src/modules/NotificationModule.ts +++ b/packages/runtime/src/modules/NotificationModule.ts @@ -1,4 +1,4 @@ -import { MessageReceivedEvent, MessageSentEvent } from "../events"; +import { MessageReceivedEvent, MessageSentEvent } from "@nmshd/runtime-types"; import { RuntimeModule } from "../extensibility/modules/RuntimeModule"; export class NotificationModule extends RuntimeModule { diff --git a/packages/runtime/src/modules/RequestModule.ts b/packages/runtime/src/modules/RequestModule.ts index 24e6ac912..0a3dadcc0 100644 --- a/packages/runtime/src/modules/RequestModule.ts +++ b/packages/runtime/src/modules/RequestModule.ts @@ -1,17 +1,19 @@ import { LocalRequestStatus } from "@nmshd/consumption"; import { RelationshipCreationContent, RequestJSON, ResponseJSON, ResponseResult, ResponseWrapper } from "@nmshd/content"; import { CoreDate } from "@nmshd/core-types"; -import { LocalRequestDTO, RelationshipStatus } from "@nmshd/runtime-types"; import { IncomingRequestStatusChangedEvent, + LocalRequestDTO, MessageProcessedEvent, MessageProcessedResult, MessageReceivedEvent, MessageSentEvent, PeerRelationshipTemplateLoadedEvent, - RelationshipChangedEvent -} from "../events"; -import { RelationshipTemplateProcessedEvent, RelationshipTemplateProcessedResult } from "../events/consumption/RelationshipTemplateProcessedEvent"; + RelationshipChangedEvent, + RelationshipStatus, + RelationshipTemplateProcessedEvent, + RelationshipTemplateProcessedResult +} from "@nmshd/runtime-types"; import { RuntimeModule } from "../extensibility/modules/RuntimeModule"; import { RuntimeServices } from "../Runtime"; diff --git a/packages/runtime/src/useCases/transport/devices/FillDeviceOnboardingTokenWithNewDevice.ts b/packages/runtime/src/useCases/transport/devices/FillDeviceOnboardingTokenWithNewDevice.ts index 4ef390dac..240a3ced6 100644 --- a/packages/runtime/src/useCases/transport/devices/FillDeviceOnboardingTokenWithNewDevice.ts +++ b/packages/runtime/src/useCases/transport/devices/FillDeviceOnboardingTokenWithNewDevice.ts @@ -30,9 +30,6 @@ export class FillDeviceOnboardingTokenWithNewDeviceUseCase extends UseCase> { const reference = TokenReference.from(request.reference); - const passwordProtection = reference.passwordProtection; - if (!passwordProtection?.password) throw RuntimeErrors.devices.referenceNotPointingToAnEmptyToken(); - const isEmptyToken = await this.tokenController.isEmptyToken(reference); if (!isEmptyToken) throw RuntimeErrors.devices.referenceNotPointingToAnEmptyToken(); @@ -45,8 +42,7 @@ export class FillDeviceOnboardingTokenWithNewDeviceUseCase extends UseCase { test("should create an empty token", async () => { const result = await noLoginRuntime.anonymousServices.tokens.createEmptyToken(); expect(result).toBeSuccessful(); - - const token = result.value; - expect(token.passwordProtection.password).toBeDefined(); - expect(token.passwordProtection.passwordIsPin).toBeUndefined(); - expect(token.passwordProtection.passwordLocationIndicator).toBeUndefined(); }); test("should get a proper error when trying to load an empty token", async () => { diff --git a/packages/runtime/test/consumption/iqlQuery.test.ts b/packages/runtime/test/consumption/iqlQuery.test.ts index 2e6e5a5c9..709f1e8ba 100644 --- a/packages/runtime/test/consumption/iqlQuery.test.ts +++ b/packages/runtime/test/consumption/iqlQuery.test.ts @@ -4,13 +4,14 @@ import { DateTime } from "luxon"; import { ConsumptionServices, CreateOutgoingRequestRequest, + IncomingRequestReceivedEvent, + IncomingRequestStatusChangedEvent, LocalAttributeDTO, LocalRequestStatus, OutgoingRequestCreatedEvent, OutgoingRequestStatusChangedEvent, TransportServices } from "../../src"; -import { IncomingRequestReceivedEvent, IncomingRequestStatusChangedEvent } from "../../src/events"; import { RuntimeServiceProvider, TestRuntimeServices, establishRelationship, exchangeMessageWithRequest, sendMessageWithRequest } from "../lib"; import { exchangeMessageWithRequestAndRequireManualDecision, exchangeMessageWithRequestAndSendResponse } from "../lib/testUtilsWithInactiveModules"; diff --git a/packages/runtime/test/consumption/requests.test.ts b/packages/runtime/test/consumption/requests.test.ts index 946438294..d19413f3b 100644 --- a/packages/runtime/test/consumption/requests.test.ts +++ b/packages/runtime/test/consumption/requests.test.ts @@ -5,12 +5,13 @@ import { DateTime } from "luxon"; import { ConsumptionServices, CreateOutgoingRequestRequest, + IncomingRequestReceivedEvent, + IncomingRequestStatusChangedEvent, LocalRequestStatus, OutgoingRequestCreatedEvent, OutgoingRequestStatusChangedEvent, TransportServices } from "../../src"; -import { IncomingRequestReceivedEvent, IncomingRequestStatusChangedEvent } from "../../src/events"; import { establishRelationship, exchangeMessageWithRequest, diff --git a/packages/runtime/tsconfig.json b/packages/runtime/tsconfig.json index cb7f37b00..8f55001d1 100644 --- a/packages/runtime/tsconfig.json +++ b/packages/runtime/tsconfig.json @@ -6,5 +6,5 @@ }, "include": ["src/**/*.ts"], "exclude": [], - "references": [{ "path": "../transport" }, { "path": "../content" }, { "path": "../consumption" }] + "references": [{ "path": "../transport" }, { "path": "../content" }, { "path": "../consumption" }, { "path": "../runtime-types" }] } diff --git a/packages/transport/package.json b/packages/transport/package.json index 985884f69..865413a2f 100644 --- a/packages/transport/package.json +++ b/packages/transport/package.json @@ -67,11 +67,11 @@ }, "dependencies": { "@js-soft/docdb-access-abstractions": "1.3.0", - "@js-soft/logging-abstractions": "^1.0.2", + "@js-soft/logging-abstractions": "^1.2.2", "@js-soft/ts-utils": "^2.3.5", "@nmshd/core-types": "*", "@nmshd/crypto": "2.1.3", - "axios": "^1.13.5", + "axios": "^1.13.6", "fast-json-patch": "^3.1.1", "form-data": "^4.0.5", "json-stringify-safe": "^5.0.1", @@ -84,15 +84,15 @@ "devDependencies": { "@js-soft/docdb-access-loki": "1.4.0", "@js-soft/docdb-access-mongo": "1.4.0", - "@js-soft/node-logger": "1.2.1", + "@js-soft/node-logger": "1.2.2", "@js-soft/ts-serval": "2.0.16", "@types/json-stringify-safe": "^5.0.3", "@types/lodash": "^4.17.24", "@types/luxon": "^3.7.1", - "@types/qs": "^6.14.0", + "@types/qs": "^6.15.0", "correlation-id": "^5.2.0", - "expect": "^30.2.0", - "testcontainers": "^11.12.0", + "expect": "^30.3.0", + "testcontainers": "^11.13.0", "ts-mockito": "^2.6.1" }, "publishConfig": { diff --git a/packages/transport/src/core/types/PasswordProtection.ts b/packages/transport/src/core/types/PasswordProtection.ts index d9c29224d..290409cbd 100644 --- a/packages/transport/src/core/types/PasswordProtection.ts +++ b/packages/transport/src/core/types/PasswordProtection.ts @@ -31,12 +31,11 @@ export class PasswordProtection extends Serializable implements IPasswordProtect return this.fromAny(value); } - public toSharedPasswordProtection(includeCleartextPassword?: boolean): SharedPasswordProtection { + public toSharedPasswordProtection(): SharedPasswordProtection { return SharedPasswordProtection.from({ passwordType: this.passwordType, salt: this.salt, - passwordLocationIndicator: this.passwordLocationIndicator, - password: includeCleartextPassword ? this.password : undefined + passwordLocationIndicator: this.passwordLocationIndicator }); } diff --git a/packages/transport/src/modules/tokens/AnonymousTokenController.ts b/packages/transport/src/modules/tokens/AnonymousTokenController.ts index fd439b6dd..c03bd8465 100644 --- a/packages/transport/src/modules/tokens/AnonymousTokenController.ts +++ b/packages/transport/src/modules/tokens/AnonymousTokenController.ts @@ -1,5 +1,5 @@ import { Serializable } from "@js-soft/ts-serval"; -import { CoreAddress, CoreDate, CoreId, Random, RandomCharacterRange } from "@nmshd/core-types"; +import { CoreAddress, CoreDate, CoreId } from "@nmshd/core-types"; import { CryptoCipher, CryptoSecretKey } from "@nmshd/crypto"; import { CoreCrypto, IConfig, ICorrelator, TransportCoreErrors } from "../../core"; import { PasswordProtection } from "../../core/types/PasswordProtection"; @@ -16,27 +16,21 @@ export class AnonymousTokenController { public async createEmptyToken(): Promise { const secretKey = await CoreCrypto.generateSecretKey(); - const password = await Random.string(16, RandomCharacterRange.Alphanumeric + RandomCharacterRange.SpecialCharacters); - - const salt = await CoreCrypto.random(16); - const passwordProtection = PasswordProtection.from({ password, passwordType: "pw", salt }); - const expiresAt = CoreDate.utc().add({ minutes: 2 }); - const hashedPassword = (await CoreCrypto.deriveHashOutOfPassword(password, salt)).toBase64(); - const response = (await this.client.createToken({ password: hashedPassword, expiresAt: expiresAt.toISOString() })).value; + const response = (await this.client.createToken({ expiresAt: expiresAt.toISOString() })).value; - return EmptyToken.from({ id: CoreId.from(response.id), secretKey: secretKey, expiresAt, passwordProtection }); + return EmptyToken.from({ id: CoreId.from(response.id), secretKey: secretKey, expiresAt }); } public async loadPeerTokenByReference(reference: TokenReference, password?: string): Promise { - if (reference.passwordProtection && !reference.passwordProtection.password && !password) throw TransportCoreErrors.general.noPasswordProvided(); + if (reference.passwordProtection && !password) throw TransportCoreErrors.general.noPasswordProvided(); const passwordProtection = reference.passwordProtection ? PasswordProtection.from({ salt: reference.passwordProtection.salt, passwordType: reference.passwordProtection.passwordType, - password: (password ?? reference.passwordProtection.password)!, + password: password!, passwordLocationIndicator: reference.passwordProtection.passwordLocationIndicator }) : undefined; diff --git a/packages/transport/src/modules/tokens/TokenController.ts b/packages/transport/src/modules/tokens/TokenController.ts index 29aa473de..fa273f2c4 100644 --- a/packages/transport/src/modules/tokens/TokenController.ts +++ b/packages/transport/src/modules/tokens/TokenController.ts @@ -1,6 +1,6 @@ import { ISerializable, Serializable } from "@js-soft/ts-serval"; import { log } from "@js-soft/ts-utils"; -import { CoreAddress, CoreDate, CoreId, Random, RandomCharacterRange } from "@nmshd/core-types"; +import { CoreAddress, CoreDate, CoreId } from "@nmshd/core-types"; import { CoreBuffer, CryptoCipher, CryptoSecretKey } from "@nmshd/crypto"; import { CoreCrypto, TransportCoreErrors } from "../../core"; import { DbCollectionName } from "../../core/DbCollectionName"; @@ -93,20 +93,18 @@ export class TokenController extends TransportController { const input = SendEmptyTokenParameters.from(parameters); const secretKey = await CoreCrypto.generateSecretKey(); - const password = await Random.string(16, RandomCharacterRange.Alphanumeric + RandomCharacterRange.SpecialCharacters); - const salt = await CoreCrypto.random(16); - const hashedPassword = (await CoreCrypto.deriveHashOutOfPassword(password, salt)).toBase64(); - const passwordProtection = PasswordProtection.from({ password, passwordType: "pw", salt }); - - const response = (await this.client.createEmptyToken({ password: hashedPassword, expiresAt: input.expiresAt.toISOString() })).value; + const response = (await this.client.createEmptyToken({ expiresAt: input.expiresAt.toISOString() })).value; const token = EmptyToken.from({ id: CoreId.from(response.id), secretKey: secretKey, - expiresAt: input.expiresAt, - passwordProtection + expiresAt: input.expiresAt }); + if (!input.ephemeral) { + await this.tokens.create(token); + } + return token; } @@ -131,12 +129,12 @@ export class TokenController extends TransportController { } public async loadPeerTokenByReference(reference: TokenReference, ephemeral: boolean, password?: string): Promise { - if (reference.passwordProtection && !reference.passwordProtection.password && !password) throw TransportCoreErrors.general.noPasswordProvided(); + if (reference.passwordProtection && !password) throw TransportCoreErrors.general.noPasswordProvided(); const passwordProtection = reference.passwordProtection ? PasswordProtection.from({ salt: reference.passwordProtection.salt, passwordType: reference.passwordProtection.passwordType, - password: (password ?? reference.passwordProtection.password)!, + password: password!, passwordLocationIndicator: reference.passwordProtection.passwordLocationIndicator }) : undefined; @@ -229,25 +227,12 @@ export class TokenController extends TransportController { const cipher = await CoreCrypto.encrypt(serializedTokenBuffer, input.secretKey); - const password = parameters.passwordProtection.password; - if (!password) throw TransportCoreErrors.general.noPasswordProvided(); - - const hashedPassword = (await CoreCrypto.deriveHashOutOfPassword(password, input.passwordProtection.salt)).toBase64(); - - const response = (await this.client.updateTokenContent({ id: parameters.id.toString(), newContent: cipher.toBase64(), password: hashedPassword })).value; - - const passwordProtection = PasswordProtection.from({ - password, - passwordType: parameters.passwordProtection.passwordType, - salt: parameters.passwordProtection.salt, - passwordLocationIndicator: parameters.passwordProtection.passwordLocationIndicator - }); + const response = (await this.client.updateTokenContent({ id: parameters.id.toString(), newContent: cipher.toBase64() })).value; const token = Token.from({ id: CoreId.from(response.id), secretKey: input.secretKey, isOwn: true, - passwordProtection, createdAt: CoreDate.from(response.createdAt), expiresAt: CoreDate.from(response.expiresAt), createdBy: this.parent.identity.address, @@ -259,10 +244,9 @@ export class TokenController extends TransportController { } public async isEmptyToken(reference: TokenReference): Promise { - if (!reference.passwordProtection?.password) throw TransportCoreErrors.general.noPasswordProvided(); + if (reference.passwordProtection) return false; - const hashedPassword = (await CoreCrypto.deriveHashOutOfPassword(reference.passwordProtection.password, reference.passwordProtection.salt)).toBase64(); - const response = (await this.client.getToken(reference.id.toString(), hashedPassword)).value; + const response = (await this.client.getToken(reference.id.toString())).value; return !response.content; } diff --git a/packages/transport/src/modules/tokens/local/EmptyToken.ts b/packages/transport/src/modules/tokens/local/EmptyToken.ts index db4ab3c22..2ce588f88 100644 --- a/packages/transport/src/modules/tokens/local/EmptyToken.ts +++ b/packages/transport/src/modules/tokens/local/EmptyToken.ts @@ -1,21 +1,18 @@ -import { ISerializable, Serializable, serialize, type, validate } from "@js-soft/ts-serval"; -import { CoreDate, CoreId, ICoreDate, ICoreId } from "@nmshd/core-types"; +import { serialize, type, validate } from "@js-soft/ts-serval"; +import { CoreDate, ICoreDate } from "@nmshd/core-types"; import { CryptoSecretKey, ICryptoSecretKey } from "@nmshd/crypto"; -import { IPasswordProtection, PasswordProtection } from "../../../core/types/PasswordProtection"; +import { nameof } from "ts-simple-nameof"; +import { CoreSynchronizable, ICoreSynchronizable } from "../../../core"; import { TokenReference } from "../transmission/TokenReference"; -export interface IEmptyToken extends ISerializable { - id: ICoreId; +export interface IEmptyToken extends ICoreSynchronizable { secretKey: ICryptoSecretKey; expiresAt: ICoreDate; - passwordProtection: IPasswordProtection; } @type("EmptyToken") -export class EmptyToken extends Serializable implements IEmptyToken { - @validate() - @serialize() - public id: CoreId; +export class EmptyToken extends CoreSynchronizable implements IEmptyToken { + public override readonly technicalProperties = ["@type", "@context", nameof((r) => r.secretKey), nameof((r) => r.expiresAt)]; @validate() @serialize() @@ -25,10 +22,6 @@ export class EmptyToken extends Serializable implements IEmptyToken { @serialize() public expiresAt: CoreDate; - @validate() - @serialize() - public passwordProtection: PasswordProtection; - public static from(value: IEmptyToken): EmptyToken { return this.fromAny(value); } @@ -37,8 +30,7 @@ export class EmptyToken extends Serializable implements IEmptyToken { return TokenReference.from({ id: this.id, backboneBaseUrl, - key: this.secretKey, - passwordProtection: this.passwordProtection.toSharedPasswordProtection(true) + key: this.secretKey }); } } diff --git a/packages/transport/src/modules/tokens/local/SendEmptyTokenParameters.ts b/packages/transport/src/modules/tokens/local/SendEmptyTokenParameters.ts index 282b6d1d2..f09cea641 100644 --- a/packages/transport/src/modules/tokens/local/SendEmptyTokenParameters.ts +++ b/packages/transport/src/modules/tokens/local/SendEmptyTokenParameters.ts @@ -3,6 +3,7 @@ import { CoreDate, ICoreDate } from "@nmshd/core-types"; export interface ISendEmptyTokenParameters extends ISerializable { expiresAt: ICoreDate; + ephemeral: boolean; } @type("SendEmptyTokenParameters") @@ -11,6 +12,10 @@ export class SendEmptyTokenParameters extends Serializable implements ISendEmpty @serialize() public expiresAt: CoreDate; + @validate() + @serialize() + public ephemeral: boolean; + public static from(value: ISendEmptyTokenParameters): SendEmptyTokenParameters { return this.fromAny(value); } diff --git a/packages/transport/src/modules/tokens/local/UpdateTokenContentParameters.ts b/packages/transport/src/modules/tokens/local/UpdateTokenContentParameters.ts index 8a4551501..62330ef03 100644 --- a/packages/transport/src/modules/tokens/local/UpdateTokenContentParameters.ts +++ b/packages/transport/src/modules/tokens/local/UpdateTokenContentParameters.ts @@ -1,12 +1,11 @@ import { ISerializable, Serializable, serialize, type, validate } from "@js-soft/ts-serval"; -import { CoreId, ICoreId, ISharedPasswordProtection, SharedPasswordProtection } from "@nmshd/core-types"; +import { CoreId, ICoreId } from "@nmshd/core-types"; import { CryptoSecretKey, ICryptoSecretKey } from "@nmshd/crypto"; export interface IUpdateTokenContentParameters extends ISerializable { id: ICoreId; secretKey: ICryptoSecretKey; content: ISerializable; - passwordProtection: ISharedPasswordProtection; } @type("UpdateTokenContentParameters") @@ -23,10 +22,6 @@ export class UpdateTokenContentParameters extends Serializable implements IUpdat @serialize() public content: Serializable; - @validate({ nullable: true }) - @serialize() - public passwordProtection: SharedPasswordProtection; - public static from(value: IUpdateTokenContentParameters): UpdateTokenContentParameters { return this.fromAny(value); } diff --git a/packages/transport/test/modules/tokens/AnonymousTokenController.test.ts b/packages/transport/test/modules/tokens/AnonymousTokenController.test.ts index c3712f04f..87a7be7d4 100644 --- a/packages/transport/test/modules/tokens/AnonymousTokenController.test.ts +++ b/packages/transport/test/modules/tokens/AnonymousTokenController.test.ts @@ -133,8 +133,7 @@ describe("AnonymousTokenController", function () { test("should create an empty token", async () => { const token = await anonymousTokenController.createEmptyToken(); - expect(token.passwordProtection.password).toBeDefined(); - expect(token.passwordProtection.passwordLocationIndicator).toBeUndefined(); + expect(token).toBeDefined(); }); test("should get a proper error when trying to load an empty token", async () => { diff --git a/packages/transport/test/modules/tokens/TokenController.test.ts b/packages/transport/test/modules/tokens/TokenController.test.ts index a635cfbbc..7b93f0b83 100644 --- a/packages/transport/test/modules/tokens/TokenController.test.ts +++ b/packages/transport/test/modules/tokens/TokenController.test.ts @@ -69,9 +69,7 @@ describe("TokenController", function () { test("should send an empty token", async function () { const expiresAt = CoreDate.utc().add({ hours: 1 }); - const sentToken = await sender.tokens.sendEmptyToken({ - expiresAt - }); + const sentToken = await sender.tokens.sendEmptyToken({ expiresAt, ephemeral: true }); expect(sentToken).toBeDefined(); }); @@ -391,7 +389,6 @@ describe("TokenController", function () { const updatedSentToken = await sender.tokens.updateTokenContent({ content: content, id: reference.id, - passwordProtection: reference.passwordProtection!, secretKey: reference.key }); From 7ca067637555fa5354f78afe2493776281d590bf Mon Sep 17 00:00:00 2001 From: Nicole E <139773901+nicole-eb@users.noreply.github.com> Date: Fri, 6 Mar 2026 14:30:29 +0100 Subject: [PATCH 03/13] Process token with VerifiablePresentation content over the app string processor (#984) * chore: process token with verifiable presentation content * chore: run prettier * chore: add isTechnicallyValid param * chore: run audit fix * chore: pr comments --- package-lock.json | 67 +++++++++++++++++-- .../app-runtime/src/AppStringProcessor.ts | 8 +++ .../src/extensibility/ui/IUIBridge.ts | 13 +++- packages/app-runtime/test/lib/FakeUIBridge.ts | 4 ++ .../test/lib/MockUIBridge.matchers.ts | 40 +++++++++++ packages/app-runtime/test/lib/MockUIBridge.ts | 19 +++++- .../test/runtime/AppStringProcessor.test.ts | 20 +++++- 7 files changed, 163 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20e842949..20e71086a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3301,6 +3301,11 @@ }, "node_modules/@npmcli/package-json/node_modules/minimatch": { "version": "10.2.4", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4114,6 +4119,11 @@ }, "node_modules/@tufjs/models/node_modules/minimatch": { "version": "10.2.4", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4587,6 +4597,7 @@ "typescript": ">=4.8.4 <6.0.0" } }, +<<<<<<< HEAD "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "4.0.4", "dev": true, @@ -4597,21 +4608,30 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "5.0.5", +======= + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { +<<<<<<< HEAD "version": "10.2.4", +======= + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": "18 || 20 || >=22" @@ -5917,6 +5937,11 @@ }, "node_modules/cacache/node_modules/minimatch": { "version": "10.2.4", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -7899,7 +7924,13 @@ } }, "node_modules/glob/node_modules/brace-expansion": { +<<<<<<< HEAD "version": "2.0.3", +======= + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "MIT", "dependencies": { @@ -7908,6 +7939,11 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "9.0.9", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "ISC", "dependencies": { @@ -8190,6 +8226,11 @@ }, "node_modules/ignore-walk/node_modules/minimatch": { "version": "10.2.4", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -9771,6 +9812,11 @@ }, "node_modules/minimatch": { "version": "3.1.5", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "ISC", "dependencies": { @@ -11384,6 +11430,11 @@ }, "node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.9", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "ISC", "dependencies": { @@ -12472,7 +12523,13 @@ } }, "node_modules/tar": { +<<<<<<< HEAD "version": "7.5.11", +======= + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", + "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", +>>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { diff --git a/packages/app-runtime/src/AppStringProcessor.ts b/packages/app-runtime/src/AppStringProcessor.ts index 9479a33fc..2447d5a8a 100644 --- a/packages/app-runtime/src/AppStringProcessor.ts +++ b/packages/app-runtime/src/AppStringProcessor.ts @@ -1,6 +1,7 @@ import { ILogger, ILoggerFactory } from "@js-soft/logging-abstractions"; import { Serializable } from "@js-soft/ts-serval"; import { EventBus, Result } from "@js-soft/ts-utils"; +import { VerifiablePresentation } from "@nmshd/content"; import { ICoreAddress, Reference, SharedPasswordProtection } from "@nmshd/core-types"; import { AnonymousServices, DeviceMapper, RuntimeServices } from "@nmshd/runtime"; import { BackboneIds, TokenContentDeviceSharedSecret } from "@nmshd/transport"; @@ -167,6 +168,13 @@ export class AppStringProcessor { // RelationshipTemplates are processed by the RequestModule break; case "Token": + const tokenContent = this.parseTokenContent(result.value.value.content); + + if (tokenContent instanceof VerifiablePresentation) { + // TODO: add technical validation + await uiBridge.showVerifiablePresentation(account, result.value.value, true); + break; + } return Result.fail(AppRuntimeErrors.appStringProcessor.notSupportedTokenContent()); case "DeviceOnboardingInfo": return Result.fail(AppRuntimeErrors.appStringProcessor.deviceOnboardingNotAllowed()); diff --git a/packages/app-runtime/src/extensibility/ui/IUIBridge.ts b/packages/app-runtime/src/extensibility/ui/IUIBridge.ts index ba69bd3dd..7be9d0de5 100644 --- a/packages/app-runtime/src/extensibility/ui/IUIBridge.ts +++ b/packages/app-runtime/src/extensibility/ui/IUIBridge.ts @@ -1,11 +1,22 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { DeviceOnboardingInfoDTO, FileDVO, IdentityDVO, LocalRequestDVO, MailDVO, MessageDVO, RequestMessageDVO, ResolveAuthorizationRequestResponse } from "@nmshd/runtime"; +import { + DeviceOnboardingInfoDTO, + FileDVO, + IdentityDVO, + LocalRequestDVO, + MailDVO, + MessageDVO, + RequestMessageDVO, + ResolveAuthorizationRequestResponse, + TokenDTO +} from "@nmshd/runtime"; import { LocalAccountDTO } from "../../multiAccount"; export interface IUIBridge { showMessage(account: LocalAccountDTO, relationship: IdentityDVO, message: MessageDVO | MailDVO | RequestMessageDVO): Promise>; showRelationship(account: LocalAccountDTO, relationship: IdentityDVO): Promise>; showFile(account: LocalAccountDTO, file: FileDVO): Promise>; + showVerifiablePresentation(account: LocalAccountDTO, token: TokenDTO, isTechnicallyValid: boolean): Promise>; showDeviceOnboarding(deviceOnboardingInfo: DeviceOnboardingInfoDTO): Promise>; showRequest(account: LocalAccountDTO, request: LocalRequestDVO): Promise>; showResolvedAuthorizationRequest(account: LocalAccountDTO, response: ResolveAuthorizationRequestResponse): Promise>; diff --git a/packages/app-runtime/test/lib/FakeUIBridge.ts b/packages/app-runtime/test/lib/FakeUIBridge.ts index 9f57572b0..a14b74a4a 100644 --- a/packages/app-runtime/test/lib/FakeUIBridge.ts +++ b/packages/app-runtime/test/lib/FakeUIBridge.ts @@ -14,6 +14,10 @@ export class FakeUIBridge implements IUIBridge { return Promise.resolve(Result.ok(undefined)); } + public showVerifiablePresentation(): Promise> { + return Promise.resolve(Result.ok(undefined)); + } + public showDeviceOnboarding(): Promise> { return Promise.resolve(Result.ok(undefined)); } diff --git a/packages/app-runtime/test/lib/MockUIBridge.matchers.ts b/packages/app-runtime/test/lib/MockUIBridge.matchers.ts index e6e526b37..61b5dc7ad 100644 --- a/packages/app-runtime/test/lib/MockUIBridge.matchers.ts +++ b/packages/app-runtime/test/lib/MockUIBridge.matchers.ts @@ -191,6 +191,44 @@ expect.extend({ return { pass: true, message: () => "" }; }, + showVerifiablePresentationCalled(mockUIBridge: unknown, id: string, isTechnicallyValid: boolean) { + if (!(mockUIBridge instanceof MockUIBridge)) { + throw new Error("This method can only be used with expect(MockUIBridge)."); + } + + const calls = mockUIBridge.calls.filter((x) => x.method === "showVerifiablePresentation"); + if (calls.length === 0) { + return { pass: false, message: () => "The method showVerifiablePresentation was not called." }; + } + + const matchingCalls = calls.filter((x) => x.token.id === id && x.isTechnicallyValid === isTechnicallyValid); + if (matchingCalls.length === 0) { + const callsWithData = calls.map((e) => `'${e.token.id}' (isTechnicallyValid: ${e.isTechnicallyValid})`).join(", "); + return { + pass: false, + message: () => + `The method showVerifiablePresentation was called, but not with token id '${id}' and isTechnicallyValid '${isTechnicallyValid}', instead with calls ${callsWithData}.` + }; + } + + return { pass: true, message: () => "" }; + }, + showVerifiablePresentationNotCalled(mockUIBridge: unknown) { + if (!(mockUIBridge instanceof MockUIBridge)) { + throw new Error("This method can only be used with expect(MockUIBridge)."); + } + + const calls = mockUIBridge.calls.filter((x) => x.method === "showVerifiablePresentation"); + if (calls.length > 0) { + return { + pass: false, + message: () => + `The method showVerifiablePresentation called: ${calls.map((c) => `'account id: ${c.account.id} - tokenId: ${c.token.id} - isTechnicallyValid: ${c.isTechnicallyValid}'`)}` + }; + } + + return { pass: true, message: () => "" }; + }, showErrorCalled(mockUIBridge: unknown, code: string) { if (!(mockUIBridge instanceof MockUIBridge)) { throw new Error("This method can only be used with expect(MockUIBridge)."); @@ -230,6 +268,8 @@ declare global { showResolvedCredentialOfferNotCalled(): R; showFileCalled(id: string): R; showFileNotCalled(): R; + showVerifiablePresentationCalled(id: string, isTechnicallyValid: boolean): R; + showVerifiablePresentationNotCalled(): R; showErrorCalled(code: string): R; } } diff --git a/packages/app-runtime/test/lib/MockUIBridge.ts b/packages/app-runtime/test/lib/MockUIBridge.ts index 7628f2fab..e640ba12b 100644 --- a/packages/app-runtime/test/lib/MockUIBridge.ts +++ b/packages/app-runtime/test/lib/MockUIBridge.ts @@ -1,11 +1,22 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { DeviceOnboardingInfoDTO, FileDVO, IdentityDVO, LocalRequestDVO, MailDVO, MessageDVO, RequestMessageDVO, ResolveAuthorizationRequestResponse } from "@nmshd/runtime"; +import { + DeviceOnboardingInfoDTO, + FileDVO, + IdentityDVO, + LocalRequestDVO, + MailDVO, + MessageDVO, + RequestMessageDVO, + ResolveAuthorizationRequestResponse, + TokenDTO +} from "@nmshd/runtime"; import { IUIBridge, LocalAccountDTO } from "../../src"; export type MockUIBridgeCall = | { method: "showMessage"; account: LocalAccountDTO; relationship: IdentityDVO; message: MessageDVO | MailDVO | RequestMessageDVO } | { method: "showRelationship"; account: LocalAccountDTO; relationship: IdentityDVO } | { method: "showFile"; account: LocalAccountDTO; file: FileDVO } + | { method: "showVerifiablePresentation"; account: LocalAccountDTO; token: TokenDTO; isTechnicallyValid: boolean } | { method: "showDeviceOnboarding"; deviceOnboardingInfo: DeviceOnboardingInfoDTO } | { method: "showRequest"; account: LocalAccountDTO; request: LocalRequestDVO } | { method: "showResolvedAuthorizationRequest"; account: LocalAccountDTO; response: ResolveAuthorizationRequestResponse } @@ -54,6 +65,12 @@ export class MockUIBridge implements IUIBridge { return Promise.resolve(Result.ok(undefined)); } + public showVerifiablePresentation(account: LocalAccountDTO, token: TokenDTO, isTechnicallyValid: boolean): Promise> { + this._calls.push({ method: "showVerifiablePresentation", account, token, isTechnicallyValid }); + + return Promise.resolve(Result.ok(undefined)); + } + public showDeviceOnboarding(deviceOnboardingInfo: DeviceOnboardingInfoDTO): Promise> { this._calls.push({ method: "showDeviceOnboarding", deviceOnboardingInfo }); diff --git a/packages/app-runtime/test/runtime/AppStringProcessor.test.ts b/packages/app-runtime/test/runtime/AppStringProcessor.test.ts index 66ba74f08..a9d005554 100644 --- a/packages/app-runtime/test/runtime/AppStringProcessor.test.ts +++ b/packages/app-runtime/test/runtime/AppStringProcessor.test.ts @@ -1,4 +1,4 @@ -import { ArbitraryRelationshipTemplateContentJSON, AuthenticationRequestItem, RelationshipTemplateContent } from "@nmshd/content"; +import { ArbitraryRelationshipTemplateContentJSON, AuthenticationRequestItem, RelationshipTemplateContent, VerifiablePresentation } from "@nmshd/content"; import { CoreDate, PasswordLocationIndicatorOptions } from "@nmshd/core-types"; import { DeviceOnboardingInfoDTO, PeerRelationshipTemplateLoadedEvent } from "@nmshd/runtime"; import assert from "assert"; @@ -377,6 +377,24 @@ describe("AppStringProcessor", function () { expect(runtime4MockUiBridge).showFileCalled(file.id); }); + test("get a token with verifiable presentation content using a url", async function () { + const tokenResult = await runtime1Session.transportServices.tokens.createOwnToken({ + content: VerifiablePresentation.from({ + value: { claim: "test" }, + type: "dc+sd-jwt" + }).toJSON(), + expiresAt: CoreDate.utc().add({ days: 1 }).toISOString(), + ephemeral: true + }); + const token = tokenResult.value; + + const result = await runtime4.stringProcessor.processURL(token.reference.url, runtime4Session.account); + expect(result).toBeSuccessful(); + expect(result.value).toBeUndefined(); + + expect(runtime4MockUiBridge).showVerifiablePresentationCalled(token.id, true); + }); + test("get a template using a url", async function () { const templateResult = await runtime1Session.transportServices.relationshipTemplates.createOwnRelationshipTemplate({ content: RelationshipTemplateContent.from({ From 77ab73586695d5c4539acc648f4b69f51db33860 Mon Sep 17 00:00:00 2001 From: Milena Czierlinski <146972016+Milena-Czierlinski@users.noreply.github.com> Date: Thu, 12 Mar 2026 11:14:39 +0100 Subject: [PATCH 04/13] The `type` and `displayInformation` is neglected creating a VerifiablePresentation (#992) * chore: npm audit fix * test: displayInformation is transferred in PresentationToken * fix: explicitly hand over type and displayInformation when creating VerifiablePresentation --- package-lock.json | 50 +++++++++++++++++++ .../src/modules/openid4vc/local/Holder.ts | 22 ++++++++ .../test/consumption/openid4vc.test.ts | 34 ++++++++++++- 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 20e71086a..6f0e93083 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2024,6 +2024,7 @@ "node": "18 || 20 || >=22" } }, +<<<<<<< HEAD "node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "5.0.5", "dev": true, @@ -2035,6 +2036,8 @@ "node": "18 || 20 || >=22" } }, +======= +>>>>>>> 8a884c27 (The `type` and `displayInformation` is neglected creating a VerifiablePresentation (#992)) "node_modules/@eslint/config-array/node_modules/minimatch": { "version": "10.2.4", "dev": true, @@ -2068,7 +2071,48 @@ "@types/json-schema": "^7.0.15" }, "engines": { +<<<<<<< HEAD "node": "^20.19.0 || ^22.13.0 || >=24" +======= + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" +>>>>>>> 8a884c27 (The `type` and `displayInformation` is neglected creating a VerifiablePresentation (#992)) } }, "node_modules/@eslint/js": { @@ -12523,6 +12567,7 @@ } }, "node_modules/tar": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.5.11", ======= @@ -12530,6 +12575,11 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", >>>>>>> 57b0ccfa (Process token with VerifiablePresentation content over the app string processor (#984)) +======= + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", +>>>>>>> 8a884c27 (The `type` and `displayInformation` is neglected creating a VerifiablePresentation (#992)) "dev": true, "license": "BlueOak-1.0.0", "dependencies": { diff --git a/packages/consumption/src/modules/openid4vc/local/Holder.ts b/packages/consumption/src/modules/openid4vc/local/Holder.ts index 022f37e1c..7467b1429 100644 --- a/packages/consumption/src/modules/openid4vc/local/Holder.ts +++ b/packages/consumption/src/modules/openid4vc/local/Holder.ts @@ -171,6 +171,28 @@ export class Holder extends BaseAgent> return submissionResult.serverResponse; } + // hacky solution because credo doesn't support credentials without key binding + // TODO: use credentials without key binding once supported + public async createPresentationTokenContent(credential: VerifiableCredential): Promise { + if (credential.type !== ClaimFormat.SdJwtDc) throw new Error("Only SD-JWT credentials have been tested so far with token presentation"); + + const sdJwtVcApi = this.agent.dependencyManager.resolve(SdJwtVcApi); + const presentation = await sdJwtVcApi.present({ + sdJwtVc: sdJwtVcApi.fromCompact(credential.value as string), + verifierMetadata: { + audience: "defaultPresentationAudience", + issuedAt: Date.now() / 1000, + nonce: "defaultPresentationNonce" + } + }); + + return VerifiablePresentation.from({ + value: presentation, + type: credential.type, + displayInformation: credential.displayInformation + }); + } + public async exit(): Promise { await this.shutdown(); } diff --git a/packages/runtime/test/consumption/openid4vc.test.ts b/packages/runtime/test/consumption/openid4vc.test.ts index efc94f675..a98624603 100644 --- a/packages/runtime/test/consumption/openid4vc.test.ts +++ b/packages/runtime/test/consumption/openid4vc.test.ts @@ -1,7 +1,7 @@ import { SdJwtVcRecord } from "@credo-ts/core"; import { EudiploClient } from "@eudiplo/sdk-core"; import { AcceptProposeAttributeRequestItemParametersWithNewAttributeJSON, AcceptShareAuthorizationRequestRequestItemParametersJSON, decodeRecord } from "@nmshd/consumption"; -import { RequestJSON, ShareAuthorizationRequestRequestItemJSON, VerifiableCredentialJSON } from "@nmshd/content"; +import { RequestJSON, ShareAuthorizationRequestRequestItemJSON, VerifiableCredentialJSON, VerifiablePresentation } from "@nmshd/content"; import axios, { AxiosInstance } from "axios"; import * as client from "openid-client"; import path from "path"; @@ -252,6 +252,38 @@ describe("EUDIPLO", () => { const sessionStatus = (await eudiploClient.getSession(sessionId)).status; expect(sessionStatus).toBe("completed"); // in case of failed presentation: Status remains "active" }); + + test("create presentation token", async () => { + const credentialOfferUrl = ( + await eudiploClient.createIssuanceOffer({ + responseType: "uri", + credentialConfigurationIds: [eudiploCredentialConfigurationId], + flow: "pre_authorized_code" + }) + ).uri; + + const resolveCredentialOfferResult = await runtimeServices1.consumption.openId4Vc.resolveCredentialOffer({ credentialOfferUrl }); + const credentialResponsesResult = await runtimeServices1.consumption.openId4Vc.requestCredentials({ + credentialOffer: resolveCredentialOfferResult.value.credentialOffer, + credentialConfigurationIds: [eudiploCredentialConfigurationId] + }); + const storedCredential = ( + await runtimeServices1.consumption.openId4Vc.storeCredentials({ + credentialResponses: credentialResponsesResult.value.credentialResponses + }) + ).value; + expect((storedCredential.content.value as VerifiableCredentialJSON).displayInformation?.[0].name).toBe("test"); + + const presentationTokenResult = await runtimeServices1.consumption.openId4Vc.createPresentationToken({ attributeId: storedCredential.id }); + expect(presentationTokenResult).toBeSuccessful(); + + const presentationTokenContent = presentationTokenResult.value.content; + expect(presentationTokenContent).toBeDefined(); + expect(presentationTokenContent["@type"]).toBe("VerifiablePresentation"); + expect((presentationTokenContent as VerifiablePresentation).value).toBeDefined(); + expect((presentationTokenContent as VerifiablePresentation).displayInformation).toBeDefined(); + expect((presentationTokenContent as VerifiablePresentation).displayInformation![0].name).toBe("test"); + }); }); async function startOid4VcComposeStack() { From bbdc007b516522070a001236b52d4e2adb3ef933 Mon Sep 17 00:00:00 2001 From: Milena Czierlinski <146972016+Milena-Czierlinski@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:40:25 +0100 Subject: [PATCH 05/13] Specify `expiresAt` and `ephemeral` when creating a PresentationToken (#994) * feat: expose expiresAt and ephemeral when creating a presentation token * refactor: specify type of input string * chore: rebuild schemas --- .../runtime/src/useCases/common/Schemas.ts | 15 +++++- .../openid4vc/CreatePresentationToken.ts | 47 +++++++++++++++++++ .../test/consumption/openid4vc.test.ts | 7 ++- 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index d7b435748..f94fbfe34 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -17337,12 +17337,25 @@ export const CreatePresentationTokenRequest: any = { "properties": { "attributeId": { "type": "string" + }, + "expiresAt": { + "$ref": "#/definitions/ISO8601DateTimeString" + }, + "ephemeral": { + "type": "boolean" } }, "required": [ - "attributeId" + "attributeId", + "expiresAt", + "ephemeral" ], "additionalProperties": false + }, + "ISO8601DateTimeString": { + "type": "string", + "errorMessage": "must match ISO8601 datetime format", + "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" } } } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts new file mode 100644 index 000000000..e86c66844 --- /dev/null +++ b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts @@ -0,0 +1,47 @@ +import { Result } from "@js-soft/ts-utils"; +import { AttributesController, OpenId4VcController } from "@nmshd/consumption"; +import { VerifiableCredential } from "@nmshd/content"; +import { CoreDate, CoreId } from "@nmshd/core-types"; +import { TokenDTO } from "@nmshd/runtime-types"; +import { TokenController } from "@nmshd/transport"; +import { Inject } from "@nmshd/typescript-ioc"; +import { ISO8601DateTimeString, RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; +import { TokenMapper } from "../../transport/tokens/TokenMapper"; + +export interface CreatePresentationTokenRequest { + attributeId: string; + expiresAt: ISO8601DateTimeString; + ephemeral: boolean; +} + +class Validator extends SchemaValidator { + public constructor(@Inject schemaRepository: SchemaRepository) { + super(schemaRepository.getSchema("CreatePresentationTokenRequest")); + } +} + +export class CreatePresentationTokenUseCase extends UseCase { + public constructor( + @Inject private readonly openId4VcController: OpenId4VcController, + @Inject private readonly attributesController: AttributesController, + @Inject private readonly tokenController: TokenController, + @Inject validator: Validator + ) { + super(validator); + } + + protected override async executeInternal(request: CreatePresentationTokenRequest): Promise> { + const attribute = await this.attributesController.getLocalAttribute(CoreId.from(request.attributeId)); + if (!(attribute?.content.value instanceof VerifiableCredential)) return Result.fail(RuntimeErrors.general.recordNotFound("Attribute with Verifiable Credential")); + + const presentationTokenContent = await this.openId4VcController.createPresentationTokenContent(attribute.content.value); + + const token = await this.tokenController.sendToken({ + content: presentationTokenContent.toJSON(), + expiresAt: CoreDate.from(request.expiresAt), + ephemeral: request.ephemeral + }); + + return Result.ok(TokenMapper.toTokenDTO(token, true)); + } +} diff --git a/packages/runtime/test/consumption/openid4vc.test.ts b/packages/runtime/test/consumption/openid4vc.test.ts index a98624603..9f0f67462 100644 --- a/packages/runtime/test/consumption/openid4vc.test.ts +++ b/packages/runtime/test/consumption/openid4vc.test.ts @@ -2,6 +2,7 @@ import { SdJwtVcRecord } from "@credo-ts/core"; import { EudiploClient } from "@eudiplo/sdk-core"; import { AcceptProposeAttributeRequestItemParametersWithNewAttributeJSON, AcceptShareAuthorizationRequestRequestItemParametersJSON, decodeRecord } from "@nmshd/consumption"; import { RequestJSON, ShareAuthorizationRequestRequestItemJSON, VerifiableCredentialJSON, VerifiablePresentation } from "@nmshd/content"; +import { CoreDate } from "@nmshd/core-types"; import axios, { AxiosInstance } from "axios"; import * as client from "openid-client"; import path from "path"; @@ -274,7 +275,11 @@ describe("EUDIPLO", () => { ).value; expect((storedCredential.content.value as VerifiableCredentialJSON).displayInformation?.[0].name).toBe("test"); - const presentationTokenResult = await runtimeServices1.consumption.openId4Vc.createPresentationToken({ attributeId: storedCredential.id }); + const presentationTokenResult = await runtimeServices1.consumption.openId4Vc.createPresentationToken({ + attributeId: storedCredential.id, + expiresAt: CoreDate.utc().add({ minutes: 1 }).toString(), + ephemeral: true + }); expect(presentationTokenResult).toBeSuccessful(); const presentationTokenContent = presentationTokenResult.value.content; From b6ac8a59209368191976d29526d97d5bd77fa73f Mon Sep 17 00:00:00 2001 From: Milena Czierlinski <146972016+Milena-Czierlinski@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:46:15 +0100 Subject: [PATCH 06/13] Change VerifiablePresentation to TokenContentVerifiablePresentation (#993) * refactor: make VerifiablePresentation to TokenContentVerifiablePresentation * test: adjust expected type of token content * test: app-runtime test * chore: re-add TokenContentVerifiablePresentation * chore: type * refactor: add ProprietaryAttributeValue to barrel file --- .../app-runtime/src/AppStringProcessor.ts | 4 +- .../test/runtime/AppStringProcessor.test.ts | 4 +- .../modules/openid4vc/OpenId4VcController.ts | 6 +- .../src/modules/openid4vc/local/Holder.ts | 6 +- .../attributes/RelationshipAttributeQuery.ts | 2 +- .../attributes/types/VerifiableCredential.ts | 2 +- .../src/attributes/types/proprietary/index.ts | 1 + packages/content/src/index.ts | 1 + .../TokenContentVerifiablePresentation.ts | 57 +++++++++++++++++++ packages/content/src/tokens/index.ts | 1 + .../test/consumption/openid4vc.test.ts | 10 ++-- 11 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 packages/content/src/tokens/TokenContentVerifiablePresentation.ts create mode 100644 packages/content/src/tokens/index.ts diff --git a/packages/app-runtime/src/AppStringProcessor.ts b/packages/app-runtime/src/AppStringProcessor.ts index 2447d5a8a..0e10af4f7 100644 --- a/packages/app-runtime/src/AppStringProcessor.ts +++ b/packages/app-runtime/src/AppStringProcessor.ts @@ -1,7 +1,7 @@ import { ILogger, ILoggerFactory } from "@js-soft/logging-abstractions"; import { Serializable } from "@js-soft/ts-serval"; import { EventBus, Result } from "@js-soft/ts-utils"; -import { VerifiablePresentation } from "@nmshd/content"; +import { TokenContentVerifiablePresentation } from "@nmshd/content"; import { ICoreAddress, Reference, SharedPasswordProtection } from "@nmshd/core-types"; import { AnonymousServices, DeviceMapper, RuntimeServices } from "@nmshd/runtime"; import { BackboneIds, TokenContentDeviceSharedSecret } from "@nmshd/transport"; @@ -170,7 +170,7 @@ export class AppStringProcessor { case "Token": const tokenContent = this.parseTokenContent(result.value.value.content); - if (tokenContent instanceof VerifiablePresentation) { + if (tokenContent instanceof TokenContentVerifiablePresentation) { // TODO: add technical validation await uiBridge.showVerifiablePresentation(account, result.value.value, true); break; diff --git a/packages/app-runtime/test/runtime/AppStringProcessor.test.ts b/packages/app-runtime/test/runtime/AppStringProcessor.test.ts index a9d005554..8396618dd 100644 --- a/packages/app-runtime/test/runtime/AppStringProcessor.test.ts +++ b/packages/app-runtime/test/runtime/AppStringProcessor.test.ts @@ -1,4 +1,4 @@ -import { ArbitraryRelationshipTemplateContentJSON, AuthenticationRequestItem, RelationshipTemplateContent, VerifiablePresentation } from "@nmshd/content"; +import { ArbitraryRelationshipTemplateContentJSON, AuthenticationRequestItem, RelationshipTemplateContent, TokenContentVerifiablePresentation } from "@nmshd/content"; import { CoreDate, PasswordLocationIndicatorOptions } from "@nmshd/core-types"; import { DeviceOnboardingInfoDTO, PeerRelationshipTemplateLoadedEvent } from "@nmshd/runtime"; import assert from "assert"; @@ -379,7 +379,7 @@ describe("AppStringProcessor", function () { test("get a token with verifiable presentation content using a url", async function () { const tokenResult = await runtime1Session.transportServices.tokens.createOwnToken({ - content: VerifiablePresentation.from({ + content: TokenContentVerifiablePresentation.from({ value: { claim: "test" }, type: "dc+sd-jwt" }).toJSON(), diff --git a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts index bbde2ee39..e1de7aa7c 100644 --- a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts +++ b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts @@ -1,6 +1,6 @@ import { DcqlValidCredential, W3cJsonCredential } from "@credo-ts/core"; import { OpenId4VciResolvedCredentialOffer, OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; -import { VerifiableCredential } from "@nmshd/content"; +import { TokenContentVerifiablePresentation, VerifiableCredential } from "@nmshd/content"; import { ConsumptionBaseController } from "../../consumption/ConsumptionBaseController"; import { ConsumptionController } from "../../consumption/ConsumptionController"; import { ConsumptionControllerName } from "../../consumption/ConsumptionControllerName"; @@ -129,4 +129,8 @@ export class OpenId4VcController extends ConsumptionBaseController { return { status: serverResponse.status, message: serverResponse.body }; } + + public async createPresentationTokenContent(credential: VerifiableCredential): Promise { + return await this.holder.createPresentationTokenContent(credential); + } } diff --git a/packages/consumption/src/modules/openid4vc/local/Holder.ts b/packages/consumption/src/modules/openid4vc/local/Holder.ts index 7467b1429..7ef89e0fc 100644 --- a/packages/consumption/src/modules/openid4vc/local/Holder.ts +++ b/packages/consumption/src/modules/openid4vc/local/Holder.ts @@ -1,6 +1,6 @@ import { BaseRecord, ClaimFormat, DidJwk, DidKey, InjectionSymbols, JwkDidCreateOptions, KeyDidCreateOptions, Kms, X509Module } from "@credo-ts/core"; import { OpenId4VciCredentialResponse, OpenId4VcModule, type OpenId4VciResolvedCredentialOffer, type OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; -import { VerifiableCredential } from "@nmshd/content"; +import { TokenContentVerifiablePresentation, VerifiableCredential } from "@nmshd/content"; import { AccountController } from "@nmshd/transport"; import { AttributesController, OwnIdentityAttribute } from "../../attributes"; import { BaseAgent } from "./BaseAgent"; @@ -173,7 +173,7 @@ export class Holder extends BaseAgent> // hacky solution because credo doesn't support credentials without key binding // TODO: use credentials without key binding once supported - public async createPresentationTokenContent(credential: VerifiableCredential): Promise { + public async createPresentationTokenContent(credential: VerifiableCredential): Promise { if (credential.type !== ClaimFormat.SdJwtDc) throw new Error("Only SD-JWT credentials have been tested so far with token presentation"); const sdJwtVcApi = this.agent.dependencyManager.resolve(SdJwtVcApi); @@ -186,7 +186,7 @@ export class Holder extends BaseAgent> } }); - return VerifiablePresentation.from({ + return TokenContentVerifiablePresentation.from({ value: presentation, type: credential.type, displayInformation: credential.displayInformation diff --git a/packages/content/src/attributes/RelationshipAttributeQuery.ts b/packages/content/src/attributes/RelationshipAttributeQuery.ts index 5d82566d0..18af396dc 100644 --- a/packages/content/src/attributes/RelationshipAttributeQuery.ts +++ b/packages/content/src/attributes/RelationshipAttributeQuery.ts @@ -4,7 +4,7 @@ import { AbstractAttributeQuery, AbstractAttributeQueryJSON, IAbstractAttributeQ import { AttributeValues } from "./AttributeValueTypes"; import { IValueHints, ValueHints, ValueHintsJSON } from "./hints"; import { RelationshipAttributeConfidentiality } from "./RelationshipAttributeConfidentiality"; -import { PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH, PROPRIETARY_ATTRIBUTE_MAX_TITLE_LENGTH } from "./types/proprietary/ProprietaryAttributeValue"; +import { PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH, PROPRIETARY_ATTRIBUTE_MAX_TITLE_LENGTH } from "./types/proprietary"; export interface RelationshipAttributeCreationHintsJSON { title: string; diff --git a/packages/content/src/attributes/types/VerifiableCredential.ts b/packages/content/src/attributes/types/VerifiableCredential.ts index dee12cb09..3f9421641 100644 --- a/packages/content/src/attributes/types/VerifiableCredential.ts +++ b/packages/content/src/attributes/types/VerifiableCredential.ts @@ -1,7 +1,7 @@ import { serialize, type, validate } from "@js-soft/ts-serval"; import { AbstractAttributeValue, AbstractAttributeValueJSON, IAbstractAttributeValue } from "../AbstractAttributeValue"; import { RenderHints, RenderHintsEditType, RenderHintsTechnicalType, ValueHints } from "../hints"; -import { PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH } from "./proprietary/ProprietaryAttributeValue"; +import { PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH } from "./proprietary"; export interface VerifiableCredentialJSON extends AbstractAttributeValueJSON { "@type": "VerifiableCredential"; diff --git a/packages/content/src/attributes/types/proprietary/index.ts b/packages/content/src/attributes/types/proprietary/index.ts index 1fda99123..7735ade31 100644 --- a/packages/content/src/attributes/types/proprietary/index.ts +++ b/packages/content/src/attributes/types/proprietary/index.ts @@ -1,3 +1,4 @@ +export * from "./ProprietaryAttributeValue"; export * from "./ProprietaryBoolean"; export * from "./ProprietaryCountry"; export * from "./ProprietaryEMailAddress"; diff --git a/packages/content/src/index.ts b/packages/content/src/index.ts index d77129ba9..2e7996f81 100644 --- a/packages/content/src/index.ts +++ b/packages/content/src/index.ts @@ -5,4 +5,5 @@ export * from "./messages"; export * from "./notifications"; export * from "./relationships"; export * from "./requests"; +export * from "./tokens"; export * from "./ValidationErrorWithoutProperty"; diff --git a/packages/content/src/tokens/TokenContentVerifiablePresentation.ts b/packages/content/src/tokens/TokenContentVerifiablePresentation.ts new file mode 100644 index 000000000..c16ab844c --- /dev/null +++ b/packages/content/src/tokens/TokenContentVerifiablePresentation.ts @@ -0,0 +1,57 @@ +import { ISerializable, Serializable, serialize, type, validate } from "@js-soft/ts-serval"; +import { ContentJSON } from "../ContentJSON"; +import { PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH } from "../attributes"; + +export interface TokenContentVerifiablePresentationJSON extends ContentJSON { + "@type": "TokenContentVerifiablePresentation"; + value: string | Record; + type: string; + displayInformation?: Record[]; +} + +export interface ITokenContentVerifiablePresentation extends ISerializable { + value: string | Record; + type: string; + displayInformation?: Record[]; +} + +@type("TokenContentVerifiablePresentation") +export class TokenContentVerifiablePresentation extends Serializable implements ITokenContentVerifiablePresentation { + @serialize({ any: true }) + @validate({ customValidator: validateValue }) + public value: string | Record; + + @serialize() + @validate({ nullable: true }) + public type: string; + + @serialize() + @validate({ nullable: true, max: PROPRIETARY_ATTRIBUTE_MAX_DESCRIPTION_LENGTH }) + public displayInformation?: Record[]; + + public static from(value: ITokenContentVerifiablePresentation | Omit): TokenContentVerifiablePresentation { + return this.fromAny(value); + } + + public override toJSON(verbose?: boolean | undefined, serializeAsString?: boolean | undefined): TokenContentVerifiablePresentationJSON { + return super.toJSON(verbose, serializeAsString) as TokenContentVerifiablePresentationJSON; + } +} + +function validateValue(value: any) { + try { + const string = JSON.stringify(value); + // the length corresponds to 50MB - maybe this needs to be restricted further in the future + if (string.length > 52428800) { + return "stringified value must not be longer than 52428800 characters"; + } + } catch (e) { + if (e instanceof SyntaxError) { + return "must be a valid JSON object"; + } + + return "could not validate value"; + } + + return undefined; +} diff --git a/packages/content/src/tokens/index.ts b/packages/content/src/tokens/index.ts new file mode 100644 index 000000000..8420ddbe0 --- /dev/null +++ b/packages/content/src/tokens/index.ts @@ -0,0 +1 @@ +export * from "./TokenContentVerifiablePresentation"; diff --git a/packages/runtime/test/consumption/openid4vc.test.ts b/packages/runtime/test/consumption/openid4vc.test.ts index 9f0f67462..2a9614fe8 100644 --- a/packages/runtime/test/consumption/openid4vc.test.ts +++ b/packages/runtime/test/consumption/openid4vc.test.ts @@ -1,7 +1,7 @@ import { SdJwtVcRecord } from "@credo-ts/core"; import { EudiploClient } from "@eudiplo/sdk-core"; import { AcceptProposeAttributeRequestItemParametersWithNewAttributeJSON, AcceptShareAuthorizationRequestRequestItemParametersJSON, decodeRecord } from "@nmshd/consumption"; -import { RequestJSON, ShareAuthorizationRequestRequestItemJSON, VerifiableCredentialJSON, VerifiablePresentation } from "@nmshd/content"; +import { RequestJSON, ShareAuthorizationRequestRequestItemJSON, TokenContentVerifiablePresentation, VerifiableCredentialJSON } from "@nmshd/content"; import { CoreDate } from "@nmshd/core-types"; import axios, { AxiosInstance } from "axios"; import * as client from "openid-client"; @@ -284,10 +284,10 @@ describe("EUDIPLO", () => { const presentationTokenContent = presentationTokenResult.value.content; expect(presentationTokenContent).toBeDefined(); - expect(presentationTokenContent["@type"]).toBe("VerifiablePresentation"); - expect((presentationTokenContent as VerifiablePresentation).value).toBeDefined(); - expect((presentationTokenContent as VerifiablePresentation).displayInformation).toBeDefined(); - expect((presentationTokenContent as VerifiablePresentation).displayInformation![0].name).toBe("test"); + expect(presentationTokenContent["@type"]).toBe("TokenContentVerifiablePresentation"); + expect((presentationTokenContent as TokenContentVerifiablePresentation).value).toBeDefined(); + expect((presentationTokenContent as TokenContentVerifiablePresentation).displayInformation).toBeDefined(); + expect((presentationTokenContent as TokenContentVerifiablePresentation).displayInformation![0].name).toBe("test"); }); }); From 4d9aa117661b58e9777f0388297092df2521bf31 Mon Sep 17 00:00:00 2001 From: Milena Czierlinski <146972016+Milena-Czierlinski@users.noreply.github.com> Date: Fri, 13 Mar 2026 16:06:24 +0100 Subject: [PATCH 07/13] Use `AttributeIdString` as type for `attributeId` in requests (#995) --- packages/runtime/src/useCases/common/Schemas.ts | 12 ++++++++++-- .../openid4vc/AcceptAuthorizationRequest.ts | 4 ++-- .../consumption/openid4vc/CreatePresentationToken.ts | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index f94fbfe34..1c8a4a434 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -17317,13 +17317,17 @@ export const AcceptAuthorizationRequestRequest: any = { "type": "object" }, "attributeId": { - "type": "string" + "$ref": "#/definitions/AttributeIdString" } }, "required": [ "attributeId", "authorizationRequest" ] + }, + "AttributeIdString": { + "type": "string", + "pattern": "ATT[A-Za-z0-9]{17}" } } } @@ -17336,7 +17340,7 @@ export const CreatePresentationTokenRequest: any = { "type": "object", "properties": { "attributeId": { - "type": "string" + "$ref": "#/definitions/AttributeIdString" }, "expiresAt": { "$ref": "#/definitions/ISO8601DateTimeString" @@ -17352,6 +17356,10 @@ export const CreatePresentationTokenRequest: any = { ], "additionalProperties": false }, + "AttributeIdString": { + "type": "string", + "pattern": "ATT[A-Za-z0-9]{17}" + }, "ISO8601DateTimeString": { "type": "string", "errorMessage": "must match ISO8601 datetime format", diff --git a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts index 0a6447906..e6ffba1bd 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts @@ -3,11 +3,11 @@ import { Result } from "@js-soft/ts-utils"; import { AttributesController, LocalAttribute, OpenId4VcController, OwnIdentityAttribute } from "@nmshd/consumption"; import { CoreId } from "@nmshd/core-types"; import { Inject } from "@nmshd/typescript-ioc"; -import { RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; +import { AttributeIdString, RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; export interface AbstractAcceptAuthorizationRequestRequest { authorizationRequest: T; - attributeId: string; + attributeId: AttributeIdString; } export interface AcceptAuthorizationRequestRequest extends AbstractAcceptAuthorizationRequestRequest {} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts index e86c66844..cd19e022e 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts @@ -5,11 +5,11 @@ import { CoreDate, CoreId } from "@nmshd/core-types"; import { TokenDTO } from "@nmshd/runtime-types"; import { TokenController } from "@nmshd/transport"; import { Inject } from "@nmshd/typescript-ioc"; -import { ISO8601DateTimeString, RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; +import { AttributeIdString, ISO8601DateTimeString, RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; import { TokenMapper } from "../../transport/tokens/TokenMapper"; export interface CreatePresentationTokenRequest { - attributeId: string; + attributeId: AttributeIdString; expiresAt: ISO8601DateTimeString; ephemeral: boolean; } From febb61d294819d09a82f777b5e6f81f084a6114c Mon Sep 17 00:00:00 2001 From: Milena Czierlinski <146972016+Milena-Czierlinski@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:03:49 +0100 Subject: [PATCH 08/13] Use Token ID as `nonce` for PresentationToken (#1003) * feat: use token id as nonce * feat: use ephemeral for empty token * fix: use string * chore: npm audit fix * chore: exclude vulnerabilities --------- Co-authored-by: Timo Notheisen --- package-lock.json | 5 +++++ .../src/modules/openid4vc/OpenId4VcController.ts | 4 ++-- .../src/modules/openid4vc/local/Holder.ts | 4 ++-- .../openid4vc/CreatePresentationToken.ts | 15 +++++++++------ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f0e93083..5d6f6e67f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11970,6 +11970,11 @@ }, "node_modules/sjcl": { "version": "1.0.9", +<<<<<<< HEAD +======= + "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.9.tgz", + "integrity": "sha512-dWM71tkSHxe7zEZj0/COjtJdmErIxp7UMp8a6D4xx8dTTtJLc4lFL+HAX8s6lvASyQQ2iYMHwa7rhhQq7MT5MA==", +>>>>>>> faef5501 (Use Token ID as `nonce` for PresentationToken (#1003)) "license": "(BSD-2-Clause OR GPL-2.0-only)", "engines": { "node": "*" diff --git a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts index e1de7aa7c..9d59f4e36 100644 --- a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts +++ b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts @@ -130,7 +130,7 @@ export class OpenId4VcController extends ConsumptionBaseController { return { status: serverResponse.status, message: serverResponse.body }; } - public async createPresentationTokenContent(credential: VerifiableCredential): Promise { - return await this.holder.createPresentationTokenContent(credential); + public async createPresentationTokenContent(credential: VerifiableCredential, nonce: string): Promise { + return await this.holder.createPresentationTokenContent(credential, nonce); } } diff --git a/packages/consumption/src/modules/openid4vc/local/Holder.ts b/packages/consumption/src/modules/openid4vc/local/Holder.ts index 7ef89e0fc..63fd54d0c 100644 --- a/packages/consumption/src/modules/openid4vc/local/Holder.ts +++ b/packages/consumption/src/modules/openid4vc/local/Holder.ts @@ -173,7 +173,7 @@ export class Holder extends BaseAgent> // hacky solution because credo doesn't support credentials without key binding // TODO: use credentials without key binding once supported - public async createPresentationTokenContent(credential: VerifiableCredential): Promise { + public async createPresentationTokenContent(credential: VerifiableCredential, nonce: string): Promise { if (credential.type !== ClaimFormat.SdJwtDc) throw new Error("Only SD-JWT credentials have been tested so far with token presentation"); const sdJwtVcApi = this.agent.dependencyManager.resolve(SdJwtVcApi); @@ -182,7 +182,7 @@ export class Holder extends BaseAgent> verifierMetadata: { audience: "defaultPresentationAudience", issuedAt: Date.now() / 1000, - nonce: "defaultPresentationNonce" + nonce } }); diff --git a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts index cd19e022e..b203b4a5b 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts @@ -34,14 +34,17 @@ export class CreatePresentationTokenUseCase extends UseCase Date: Fri, 20 Mar 2026 09:10:07 +0100 Subject: [PATCH 09/13] Set EUDIPLO up with config files (#1002) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .dev/compose.openid4vc.yml | 8 ++++--- .dev/eudiplo-assets/service.db | Bin 430080 -> 0 bytes .../test/certs/certificate.json | 8 +++++++ .../test/clients/test-admin.json | 5 ++++ .../images/logo.png} | Bin .dev/eudiplo-assets/test/info.json | 4 ++++ .../test/issuance/credentials/test.json | 22 ++++++++++++++++++ .../test/issuance/issuance.json | 13 +++++++++++ .dev/eudiplo-assets/test/keys/key.json | 11 +++++++++ .../test/presentation/test.json | 15 ++++++++++++ 10 files changed, 83 insertions(+), 3 deletions(-) delete mode 100644 .dev/eudiplo-assets/service.db create mode 100644 .dev/eudiplo-assets/test/certs/certificate.json create mode 100644 .dev/eudiplo-assets/test/clients/test-admin.json rename .dev/eudiplo-assets/{uploads/f5ccdd18-0f42-472d-a2c9-902d3b69ecae => test/images/logo.png} (100%) create mode 100644 .dev/eudiplo-assets/test/info.json create mode 100644 .dev/eudiplo-assets/test/issuance/credentials/test.json create mode 100644 .dev/eudiplo-assets/test/issuance/issuance.json create mode 100644 .dev/eudiplo-assets/test/keys/key.json create mode 100644 .dev/eudiplo-assets/test/presentation/test.json diff --git a/.dev/compose.openid4vc.yml b/.dev/compose.openid4vc.yml index cfa5b1378..d01184ea3 100644 --- a/.dev/compose.openid4vc.yml +++ b/.dev/compose.openid4vc.yml @@ -46,19 +46,21 @@ services: - default eudiplo: - image: ghcr.io/openwallet-foundation-labs/eudiplo:1.16.0 + image: ghcr.io/openwallet-foundation-labs/eudiplo:3.1.2@sha256:0ea3a73d42a1eb10a6edc45e3289478b08b09064bd75563c503ed12be2ed2dc6 environment: - PUBLIC_URL=http://localhost:3000 - - JWT_SECRET="OgwrDcgVQQ2yZwcFt7kPxQm3nUF+X3etF6MdLTstZAY=" + - MASTER_SECRET="OgwrDcgVQQ2yZwcFt7kPxQm3nUF+X3etF6MdLTstZAY=" - AUTH_CLIENT_ID="root" - AUTH_CLIENT_SECRET="test" + - CONFIG_IMPORT=true + - CONFIG_FOLDER=/app/assets/config - PORT=3000 extra_hosts: - "host.docker.internal:host-gateway" ports: - "3000:3000" volumes: - - ./eudiplo-assets:/app/config + - ./eudiplo-assets:/app/assets/config networks: default: diff --git a/.dev/eudiplo-assets/service.db b/.dev/eudiplo-assets/service.db deleted file mode 100644 index 9255f0bdb5c16d2486bd91c58d7d4efc3dd656e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430080 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

ku1hecCc!*fubWoSML)YR^;m;- zYv6SVG3_cn>QxtBWq=&UZY z?4%~;D$I02Q*i=e zd;5Bvk_q3z-}?Uvkz*i5h#*F|mK6BD0CbHk5HavWl3?y?(tGaz=V@Z$|F45D+g|(E zC979oa5}f4TB1_^S&1@$wt-|K(OCTpE?;&>RwKFhk`2zuRlT z|M!MQ2fiuu(pIm5xI{H;75;zW|9=erf2BDxveL+$bmvBv4n4$Lyisk8Sj))G8gp~x z4O(_{Y>teDVGqVn_Wuz}FnFxzzW<*Ywy}c$-$<&fQ!DF5O+8z9M11KVFT-*7Sd7J~ zHD8T0Hnj)!_QVvD5g`Xny%|i$hb$a6N2N}eRcdklct5GE;&N-bf7-0FirKE80MHM* zz(5gXF~km!_<^7+0Tq~<#CpKN`Py6Z|MTpFw*3EZe&hey`Bvrkzr;Vq|K8&s_?7<0 z+!5H>`Sy1?V&JcS+4=j)&Y#{jNcUqufm<)YyFft7SGl(Vmq3gnIQKMUa=gjrAarAz}Bg|?Z1Kmfx=|^~TYER#1REgRp7bZ90A% zt#Q++2T*|5bkkc;|K9@%r2cTShPUwL#NjG8P=g^7ozs}Fg3VuCAo$`>I1a(D`IBL~ zGWk0|WRQWMu3zJm`sU5js~3B8_r>INIv=cGtzsXL9h8KU&jECa zBA^}CPZAF2_|q4Dng5FiIK7kTpmlv^l%KzZt=H)Jc65(*h6aM_PwRyAq z;$nUt$Lq75>sPxkvf-?}hUUERy_=U<5TAek)6agTf9tijOHC9#U`ZsPRt`u8#6DrW zR9)~Buv973NAcYzh`|k&v`5uFPA+&I#MnA@XS)I)6_lY4gbs~D0X21jphZb61ag9i zeE@DlEqraLb2F2kmF>#YEDYvj3kE}YlU#VLX@%{I;v18)21LCM#*}9e3fuLe*sec% zt?lAWW+=l|1k~Zf5zvsb(INmfH9e92SdRjx1`iCCvIow@`?d?G=$-9~68;rQ62OZ` zaZO(mw1E0T2tGLAyrLkGgZI#OUC=z(<){CxF;KYtZ%zjF(=r!f)Z7fawzx;Vr;S;fd?KO z?s~id+f(vA%J!HFS9P=3d+gNRuJ1X4?enxWf3iIQMNJ6gkpPM+>}NqagkZT82rQHlD{dJYr-Gq?%nBP=nNq!PX8mE$FoABOmgG@hRD2$#g8S~ulj z+X2D5_{P7`CvP*<@z||Dkce%bf!ufwH^aFdQMnt|o3o7F4DRMz*F${$vBZnD-gqGx zzxI;?!JB#df(s*ITHXcT9~5zIl{;<(YDML3xWj5W>JU|1{)ZuC?E|*q&*X;Y=FBB%ya(xZLadP5F=C=pqoYf zHCB)28JdkLd2E1g9{EAaD4)rGlF|5`Yy`BA#E?XR0I3M9F>ERXjUfaGX&7j|h7i06 zm3%g$!2ds2zvjyye)f9&e}dv&Mq?zx!Wcgk39lg5)L4Kn7Y#yR36aIRHPzSk|1#a< zdO8nqy+q{J`xgH%#Tto;CV?^_!frF>SB3tWK>aY56CZjm?|uD$o+dugezOTDi>)S|Dyi?!>Rvgs7&n3Yi=YRYyEg8%A`5dg7`s_%((0K*12yBQzb@+ki~9c$ zy8hp_8#30K4331kSMQ3bjRB`Z8{8NtGPoD!M!kx4a{?xg+Qh7bm4nmlJf;4B)FlS$ zDjwkfVGr6%;Qy~Qa@DL457?nd&IVv1(T!GVOj=HPFw45e;nga38>utc^_K&&_0o2aTWkS^10@DUn?QkG#148o zCAA&~Gj&ayHbR2aYKgO|#<5L_5IGQ+4a13$O za2(<2;i%v!<0#?S$Km4mw>T^ue~qJsqm841BgEn3sN(n=90ME)4y0Fh4srYhhk@gN z!|@r8e}m&C4*snF8pls@{OIPuKgIuw9{4DG;ODD<^}4Jy3OgWwiWDM^Kn4k=U{FN{ zpdx|VyeP&JiJ@k*@%O|vdYbG(to1fj^w_EA=>q0yX?_<_(x@*60GzXsqTlocta)OL zw~`3#W&(B$@;JngtK;lJMd%h&q2DD0SF&Y|KE$h`z3o|IcoS zW;W*hf3|z5U83y2q4)K3Z75tI6zELC(NsOCCU);KIhKvgZ6B3}ra>p;#g%bo4kW)b zIy*hsAqh#Es#1o4uB@@wYH zZ^!@7vk%&;|Np(6Ki>JIw)4mTp#IGRyb$Wgw;AVS{=iFux(*);A=W}Ep%-+Hq79`bNgOU~Ec z$6alHL%|Kj`;~F&YdF8*9+6O#o4W;2}>-i@-w>cqjr7A7$X7Ht_0Ac=&CB2ViiKxP5qKD# z(AFb?2jB~2A?jQERU8mqnun^9hhCWH7iAz&C|-!_@sRTYV`yn&rnhiL->MFR0aYQL>>}_ ze;!g2vq*nC`TsoopnLxRzu);*d*|OjBjogN)Ia|h5^C_yMICrnB>^56#qYl02fWOJ z$zi0yOIHwZx!u98Nwui9_sA*v&c$EL;62ZTT8_pR``Th(TkLB;%6)ApA!!AiX(%1p z-o&%Hrmi=1p=<44*PE`)o;hxz4%HYzbN7wZwKky{+#I^ltwz#7f_5-;t)O2$!teR$ zWCg72z#K);OAfiF6)?3$LaorX{_u6J&1^9CDh6s>fi0hSsR>5=D;+p0P2{k68fQ?gP#^AgH7d{AAgSW&Hs^-{$-E63T zwfkpVAlgSbLXql1dI|h~ss!#Pi7_z!$w(0;GQ`3~Q16N0SbAmWdZz}k+03%-BpL%l zsJx~D<9Vk9jI&w**8}KThNN8_P%(MG^G;%p79#Jo;a)^~x8Ml9$w56U$Zej1++?W= zj?m~aj!?jsRfT|F6O2xvbW#HpcT$M3L4S<|3Ucy6#OZMF(AW=nM{hw5pMQ4E|M!nO zpZwD|{&DAje?}1iJj&ng{Mnz~>DleFEOf3Q?e!w?OeYx+W~%GE2W3B`hdh|GTYUlSe3A)ewBs5q?NCImGx! ziY5f8^#(XYqmY>-p{zfEWFQW*rRjJ3Ya*&!za~)toxl)v!Xn|nCJK!O2v$NJi$XzM z3KNtNllS}ABu@(q6vI0~G2|JV&F{nQO4}y+zWLF6<`k}>oP-J_Vg&-E5hz@t3#944HRejRwnBRVF>#o4RRf*rn0* ztJMFyBNTu1x=S-d{dr}dq96recx!^#-PmM}xz|HPZ)A{Gy^5HgyC~}azk2<@!Fe}E z`^*3i1{{AQj)U3;+(%J=cckhq!(7B8n+e@?f3RHIu`!&UMAWHUwsE!W zS*QBqVlf+9O8d}lk@IOq+xHh?1cqlF;YtQfIB=J!|MzJE@+g!WK+#B)!!UR|`Tsoo zpnLiM+xq|i_JOnc0RJD5Fw|MBp;SNMB26kvXMxTaP_9p)VHJm5oamLE^s2(5RpV6swhVZg&WJ>cV{z43kzrS-8h>$hUWcsHt$6Mi~9d4<}?{l zo4=|5M-{%Rb8$XNju0_pG3x)p%?hatq9sA3Mko);7e)Pz`kmLql@!=V1kXevlu%|Q z5#)O`Ric7Sa97dSd?>uVVmY@k_!}R5%b0Q-`Yho}c^X@|;e{JsxZxkA8}2Rud0)1A zjqIpr5Ce2yW~DSXK*MilZMfmxg)!+eg8^Cus{U5_jnMEhP=JA7pt|I6C3h6T)o3pP z%SZkH$pRsO40X;+6MO__-4$`ZaKp=m8}8MO51NJ_E;tW&$e=r%yI6bR#vlgxFHrw4 zng~&u_WsJV-ORNI15ou#Z^8{X%8$C?3%KFR>gD3Jo%Bn-Qa$V*bjNLTp_nf_)BWKo z8_wkR#OYMa(Kw-w76{&vaaqyEv%%;F{-X6&cd|A#D=r9gu|8)3-1NMHicWYknLpNI)j{6tZ-x8wik z*??{N|KI$^|F`o;|MB<#FZ}aoTL^%kcfa!}r})m|iyz?6^4uiPmUerW%g5;X$x7vE zY5x7}J0J32?fy4gVV=hjYI;Z!lZga5f`90&o4d<1BGHI7x5$ncCFhIt-h3Xm|o zhbe$kwL*X=5OfxDT|o$Z``~#HSdhd?90SA0-gjn%94&+aDiCTXm*>~{`eAg-lJKk$ zYI&yWCMZ-O)E-5sMKV)EpwxgjpdeR~Kjy`#a6!j{H&@U^>uzSx|{A={^**L(VXBLuPOrNMVnJTebnUei#BjrRuPOym$}A zW+3ko5gSse3N-}?W+=-04S~wjLX6O32%G#gNS}XxI*X^nNVtO{3a3dDpYMJ8=}+#? zyi?8}T4>MIs8hWOxl4DidIiL=iMk z6w8_EqO1kJtcDK|_C(xc4>3^Uo=Eu?^@h2M=s?#)R0SwphKnk|@V((|{qkPsO7=;pNTA=>0xm5;brq7% z;F=2~V7^0;S4&LIXF31mlYiRz2B80I^#8NN|NrF$A-66tg1w%kBSWW2R1!i8nt&vcsS@a4 zGyeatAN;U=v42mJL6^WZ2tYofN(%oC)gvK*KaI!MLTr9T2)xOg&F^iKp*DWIAHF>$ zZ~w3b3A7jz@PvV{5Xco|LlFS*MS%no^ehx5ROtII$&jOk#Shy%`C-d5`QG0jw$0`@ z)FkkmqIye7h$uis1?(_Bf#pfS8VfuEiZ*kWaP92;(T}gi2flj~y}cG6*tyXj$ioJ6 z-yS?5`&;vz-lqh-GnobdpW9nb8>7>qO2%^sG(Hl2bLO z?S9m3k89ITw~6<)qxK}4hP}bLKi1n_r&ewEW+j(U3sqf}u9H@sv}Rev5j$h2<5V5g zd)G3HRF_WIDFHxG^QuuVo>=&vQ;)KeY)@vTxJ#>ce_;BlBip@M+3k9wages+aZR?n zmRSG~3gE#<2|OtH{~Dv2+L(GH=;<+-E$a2J%~Vu(vZ&mQl0Jt8mpp1;9CRkhRxQIssKND$-5;KasviP~)#A$v{5kcexjtdQ~S7 z+8o!C8=vjII63#>gmSgI%k$~pFrFuSGymM5TJVWyV`2TW}fQjFSQizry)Tl^A&{0JtL@G)IB3))W)$c8o-%8=~ z>%Ftr*8ls7l!yui@GK6Hiq`_v|0}U7L`g&e!%4I#*n|kViIDbWc~9E#qCR@+dHVl( zTAClI6|b5k?(YvUzEP*2Xh$_c>L?F>BsC_HeNW{0K_K$M{e01>n< zGb`)x;n)>x7k#k?|GWvm8b15P1TVUk22*PWzdggb0Oo1tl^aT9YNesr=6?4i5Sw$i z55IHR9J{M|=9TGLbp6@fyY=A<|G(BIR^zDa*xY>kEFJTBMN$7h9`^fG$2>{{%(u8- zBA9bYIB~MDu3v`CNe~kn^+j(G95^X3!dcWWEimWscbIbscem~8s#T3Db_c~H<0``8 z-a(rXT$fxlrY1ogDP8w<&n4heKv9l6hxW#BEj(Cnq9|v~JUg6wb#H9+x}?=}!EM~2 zPb)lVtc=R5!h;6vz>V-=wKa2uGEL_5X7#1%R8QlVqfYBg8CXdpTXc`*k<~dhV#%B> z{M9+JY6m4-pNsQoc5-m)DS~wwndZf)F<2gT7t>B}XpyqDP=hEC88|tWNQ1DQ80pw| zQCWzS0F|dY5QLKQcEI3y_CZ_t|KIz@f8hTAe|Q!iZ}AW}J@DlZy=&M1J8Lz@pZ>dV zK1lsT_<(`GD-hHK2z^lhLDx%0b#bW4dI0d5q$&PwUXO3$#XSiU2%FUZ=9Ij~y|Non zn@R&JMWBui!w|5FD3YO6j-u#9O(+R`6$q2y37|H1&!>4e&VQaJKGFGSywdy~LSNa& zLw?_|uXzS%)41Ds&zqqCTX)&l2Y%J@KlnpbP}bxFGM2C(vj9q=ajYewMx-QX{{Po| z?rZ&jS&8(}2iv!*aG+GAf*TqzSb<<|$5Kp)1Sy&uJkYgK5Y;_)FKP(j>-|&D)Bn%Y z(!&2Q^8bbZ|1tXiSr`6y3T?kOIQT+np}_yIw?z+x0Pw$Yt_1A{CpGIJAgHuK3h*ZU zf9RyJ=CFmLYNJCZ&}kvpIw@oD|20P~5D!2zV(9hYuV+=!o2>Kah5tVt^B6|K|Hnhj z>-f)nc+{JTz-l=fRKZ9fu& zK#P#lNumfK{RA~aJ_AX+s3HXef_@Ydz9qSmJo})+|9|F@hA)4Zyx#v8eZtg81%g;b zHV+75NeEO_f`G1{LFF5Y-(*w3cAdl{$^-vj+QX^){(l@vk{pYHAO{rQLX5m&AVF0C zD&Y(g6S71#?LGJZ^E9#W|JTS1?rDqr*LAr-VBj^!VBnu?6b4?baTxgbg#Y~-iNQa8 z6^pTbrQiNBV|fPWL-7CAFo=nyqQHpz;*tn>4GMQqAn!*^=HxKY0k{_{drkg7ey#tn zLJk%6_Edn64`2`_p#Y&N=!Bpu9(6uJ9Qm7K_-p@PMw}4VKZKc{D@le zw6yU53;)0H|36CqKLp3Vml_%8`rn8CBKZF+)rGr)Rw>8E(dfvkh32z%w98vHpdf*2OFH^aAiIq9)$m&nRbJ~{~tsr z^RtT76thV>^o|ZrhkCiG(xa6vPQy3~O5?WjQj^-`uxbvPx^Z6hYN3DTA4=n_C(+~T zX>d9W99wrENEGb$sPY7qIz(!gqIw;9*0+=Y&$AEO z_WyTo`Tzgb1F-o67L^cEqAJBE6*cxCMG|G~UPC1k&`ObMp%$Zkx7$X#W?Et>x!>$0 z?@q})e{_>@7CAc;#QX$bC4fnUG4{YQ(S%q;eXOX8AruCl;BemCL%*ARbDkDH(cgT> z>E?|?_P%AC^9;?Vac?r)%rE-Zlg$N-%4=CvL=ow4P6|bQ1?DV{!KcDBB*sN>$SFRB zb1dF7AHUTF|Bd>W+;V>Z55N5vH&Mmw68tZIc2k3|OIjpyfdR1oBdP|~J=}^1?0~_i zejo;Z_<*AhmQ&ie<#(2I%b0Q-`YieX^E9?_!wWaOaKk@JH+&2UwRXli{;zq)ISe0g zV5H%VNrN2qntUj_*C z(#S&DWq4oj7X1GO|Nrnq=l=)%UGgdh=lGwuDj`zjgmC#wtjm=e0F`j-atZ&yBH@9d9IbS$oh4)v(<~I7)GNz#Kxdf2p#>913Q?j0y$=!k8qnB4 zdBCeOd<2c=-rQ-T9}d4?=`^KzUXy0akYJCjk+(zWO;Rzd6^k>x@VW#5rc z=E>1&c)+d>;#%4-Pj$0rFY1%ympwXLh?Ousr1|*&6`9@R{}&0$rXdy(&cVUQH(J;S zf{Zpl@$F}ye@0@>hpsbHE^!34JQ84gsdJjA2>O4zu7Rvhemnkuo(l(%27P(!Q{Gmr-??mG{&4vE z{67%?e&~buI`BnM{}Bzm*931BUsFKWPY_gjkpD*s0GfH*&~>RVKedj=+~WU1#qWm+ zn7TtP1TUE`V%91knGC2Fg-k?`g-_xBdk*;jJWYIJJf^_^KjdQI0gqcG!E5vXIp*J6 ziO77-_6`pt1l^s``6b=As6$sg4_zF#|ZyK@_b0IW2XzWWgP^c=4 z0+T5`DHg)(M5!fY)Kr-eNZyM&c{~1po_)|g|Nq6#C$(?9*ttz!-FeP`w{vjcuMW5U z>M-$rRIw@op@4}?k^}}erUUB$K)S@JsDbX_c4tY!G!I{s!rgr2)ZKnk(GeD*YA8@q zN7O`u0-a8wMW@Abf-i~^B)Y$nU%k;?dqHuP*X8vP=DB5{`~0V$efj}F`WYvWfVe|I z!N?bcF_M)OQdC;}exoAtwD5^uc!7!lN8;)EFuRE^<@Ley49#2d!TCksIx1pA!5=e5 zqYx26=(KX}46s~i1R_+BP@$5}qePnjIy-?7-a0h=`DedTYp>7$tAU6(A&rFyOPNbW z0XYRG4cLf8)k8^A60R_Eqfxik68Wz{T%SM7SRd6Eu8yu8Co%X{*;L^8bY!{t>w04dm{dDX8|~hJ%)Jo&RqD8#5St6Pz14 z6EjOkW~I%%QFZw=H~eIYavRZjkpFL?1jn?)CERdQ(+?WGUg=k% zN&Gl&2-AQyMmsW zoKnDfTAJVY6d81=R;MKw36dK$O{?@7IIrwUhmgXP)g8#oHw#7An zzSZqowTLzry>!qrsQ5>9{>^dREsfgB_|I zjjWMJ<}N6`c|e!&2~=*S+=>fsA+WxD3(nGh{YHOZr9^PsWv&+C2Vz#NR5 z*;VcAYAj{dNn{?{$F*_K&@{X5>C)9?pM}03={}Iu5`+IwWd()p*g-15R8#E7NT|Fe z{{KAtpe_IZ_x^Ba=UeSR-1+_g;yvNQtQwB9<*A zF~C^siZ)FNL&QWtW}uNkRPN#j8+?UqWw^0YL6{6P0nNTozfP~!ynKP86l zVuFG(ouTq0A;?&WZz=wtryV!H|GzXFJb1LT^X>0q9{u8zUw-$CpKL??R0>FpD5(Mz zVNp7#YB5A+!29D9$yeo21AWFll*$^(Cf>0C-J<@)HMs4XGV<%jt=-nxU8{tIrx7ag zko~#1xQx$VUd;VDuguHS&;pM3KoR!Up52C+ZTIladB*beGyh{&#((c${~|uWiqAJ! z8qDW2UQ)(t`2WG_#r#LnX*iD0e>9xV`-|!2Bt9SVin=tOp3Da?_N32uU)&$)>-m+t zPu{J<(`Joq4QhBgO@=3z=hudA7+u_~6}f~Lw`)MIT(7N@cSP`+CDm3#$7+7wmo znlA&39^qG+sD0-mifuaYB9w>UC=z*dKiXJF>py+|32Z|mjdf-Fu zfj>b2;P*EC|3BOcUH+o?%bz{q|5rfF58gW!gxNA+#8d;HHAoCls!tM)QdGNdB?GSc z{~;T_QJlYFu~zr4lL0rOOPMILBtuU?rE7SqE(uzKSO$^~a+3Iz#!~ooXAB^9w#S9e z_O4~l_SPb2d+UhVTHP!f5Nk3e$Af@)0N5J z?Y=k}Ud7Y(YkX4QyxDyb4A19-$~uwuw=W`pg(|Au7n9Q|kF(>|D)!G`fO?V;9&?W( zuwt&CBplB1r!V|6{}&H%dO4k+^D~ty-VRPLFJkkQ|G~k{%Uuv^hJb0sQ_jokTbnn# zFD~ZialAg;xqh|#A{)+L%m1%PaTq|;QeZJB+R(TdAE@vE@elM^R)a*QIisk*QGf9I z`hUp1h;a;4nXnL412F_)d?iQ(S&n2COro4_;1+|wF_T*yA&(hT9?*Z5_5XPqn?H?S z!0-zgzLPcVTo|%Y8N&gzQ8)a|1OI)9~e`sU|aWf}1 zR|K+S`>1gSB)>8S4WCO~4$Zd>z>UFAUKulEViYj^0*3#=!|+k}zX0b2=00fnM$HlE zD2Zo7qOw|*1TCdYT0IzHtf{B*|LNBzIb6p86u_5Ui6FZ{&Q`2V5l403rzNVxPL>ij-+l7|?;z;-eJa6o z@qHEZEAj!&i~%>5gM>j!ToDzKGbVzakqOr#-b~)RqZzw9b&vl)f@X!TB%z=(u#rmv zs)YjrPRB^rlmL7dAS|O#2**4J{{K8pg#Y=NyAQ837hta7|NpA||9J-ItwdzLX8wN- zQm~O05U34Ch^6Wbto(YwnFgRZi*=^ZK;|)#^Eg7ZWB3Z{6f=;Dbbs<>IJUKJ5!VCHCyz=Jh`(<7liI79tEf+X$&!H3MOH;3*U2|P41 zGvn7ZKyXNhExVcWz(dOh@u1z7T`qb!I)Uc72M&TU^Lj=7f5HF1`0xV{nJbwiLvrm9 zK?aw#c;JDPf7&M!NIFsfe?rYs3Bd;h?Iz8^(*h3-5D&H&4+9UzsJg(q=Ya>kx2hjz z7cbR*SB);un)Q}jzXbQ;(aUfeOZ!=JDUX*Y4QDKB$6;LA@1HHii$$O`yUbPWNiVRf z=kA=EPLQdAQD3}lUmf~wQN{L31k-b%Gvs_^?*B`Au-2FsxxBOz`)|kp&$AEO_W%Dt z*!k8!|AFwyR+Z8_c7BW77d=q)K+yxwuLpj<`pef9%jc0^y>+&468+kqq`mgk^K`cJ zv^2l79VSu&UL0s6ummK95lYO17-FU(v~xvBB*dWabyKS zB1kqO;tRfFL4=Ty0u~`C@I+6D$lePwy?mvF^iB&0_@8yjD8~@JS%6%g7UD5CHIqec z?=!9K%`=dj;B8Uc8{MN0xT)=>U?hjWlO%{faxaoZ!59)s5SI4A*c)q<=`6apW*^}H z?gGPKe*b^oGFKeW`yhiP!*r;k%mfy3qYIU61cf1mqv}Au=?q3|ORVeGHi?f|ux;fk zNmmq>1XPeC7(zThJRS-aG)j<gB z_1=ruX0a$}xWP3fa|&}6TPraFpS6memaMB9)b42%Z?fGt8*6D#+GMddr{oQbH6_n; zW1Xj^`8U=De71nk7VufQcHC)32=!t)Y(q#%+%K&mq|vmLM0Ne#>q#8?IeNbE*(&6* zTnSKB3i&K3MEF1DzqXF35xqMa^874wZ+Z=Otc@wgB zI47GKnB)OB_v+5%X<4jr)k1dcVHS(SXOThXS*#NwZUuD-sJ+U|0kq^h?Ijs^t*Bgc z4oeqe;05Dmcc@K;)yuQXqw4_~5YLaxf^h72sChLkFUi$-lr9HKKj}p$huJ=p zbRC{2K|LnnKB5i@6o`fh1n4C_1Y`+f#BV1smuDYz6PWu4_4^Mz-3OJca!4c+00Wf} z2B%b`kW-E$9fDl^1Ln&#g3j`d{_3@-i{0baR`Gk3?J=BMVl){Dyq^j=_Trb}{(!D$_EIi$JQn{LEXx?8>_a5+ZQUC=z*dK ziXJF>py+|32Z|mjdZ6fmq6dl|*d^=ye^LMcPN5Hv-~7uTTK_`*KTS|xq7oq%eMIJ| zlt5n+#EFWiBA5+!fS851G3}dT|81!8=9IifZ?T)8b|NZ?rh~OYO(evZw2(q%0{T@E z(M2DG7P=@u1#NmiEcI^Srg@t9#He;r|Nm9%|MLvaTZwCb&GrA0B&&cYC0MRNZ%GnR z;;0jo1r^*gG>}w;bJwJddFub$uSHJ9B4L3H

o2o}dO@aQtkhOdBqkm?$&#|F~5 zAq8O@Q2L{%o+olDPfH8rR8jw5)c=2s_5Z930>b9dw1J$mQTM;D|L@XPnGQg51~S4b zi==RL4cgv2P{f1A51JERm4`*>J6r*b!^g^ndxcJ>O}{UT%OeW zSEuKq^YUV{9BCarEHA6>fjuu*`}>J&%7@|0;N_KiG7^&UL3wGm)d1qing%}U1e8mt zYvlTTu`l>6z_yEmJzu782RW5zAGBTnzv2I{z8*!z2;g2JV*=$o27ow$(IE1Dfdxqr z$}v;GVs-0ra@l9PC+T|(HHtUDs?Diw>Cz|;#Du7d5Q3!&fQAGe24p|VpCUa3kRg)g z_niMfPYa*uZx;1JU#(s!&(ORTZ>RX5HjcmZz0dehd1{yx< z+6FWM+DjvAuMFl=uh)EH0n-U+_^Ql+hQPKP-om;B1>g#9xMGD_TI&r$^V~XM4Ylnn zMs>L82j}Acu`?f;M*>qXl6tU^6P8&q8|!DLPAXUGOG+0drw4lD;h3E*m(^kKv~gSw zj@rga4*q|Qf=@@@;{VsEMEQv)@&BvPmx@JH8i}Cj;qp>Y%afE?pvc!k0KiX}roJ8j zKhFm2#{cKrRcTjblDMlAQQ6f+Cht-WjR!G^x~of~zAI9BSECx)1uY2MrHqKXk|@b| ztEsyZXgzjST_n32qq|h0bXUfvc9$_-!*%f%!2)#`oF?KfxTbfRq)EHFDr>tEWdC+m znNWPFEBIT5?n5SJCh|BK|-GgTOAXh-X*PVntT)aD?sR0dZ3WcLwhhIzd5yK}7IfO_>QKVi zgsvqK^rubuVF}Z z^s9u{P?VTM=ySv1~F7%FtV!bgbk zLDn(0Sctfvj_HpFbS_CS1 zyuzHN4E><Qv6ej z@x@bMrhpx3SA^6HW(5Y5k2|^@r?@qQZNT{I=ufI*)nUD15p!F?_>T=pTQOx|G5Kxr zWE7(cQ-@YDJ_Y$|6!C(>^r2_D^}DtKu(CLZe#21WQPKA@z6lrsIu9!WpQ6VVFfidi zyxC|dzKcf(#(-NVm?O+bJRNxUxc$PDaC@n!u!B_L&&fv>%MHs~#hk~(VwHn@4o`;_ zgJHmoLhyv!6I>pXlYfAV65MTVvA}w}E5cggw)|!i#!QycP8Gp%*hp?Fa8Quh@f%{G zFu;6x&{-->x{g0a@1iLTO~ahUT302U(?H#~i%2^D!+)YMKhd)gaKx=~br^uPDZ?KV zOmI!bQlSLXOjHR*i$4G?FeWkvA78*M;46T_tS~-AijD`y5aZ71aFtJ2%B?dWR$aqm zL0$#-)c6ACzfB_l@jxr_0v27T_)v!_;1d|XUg#j)6807^Fdg}y@iE4n#(c%!OMrs# zL4rY2@J!f$U`E2M;HQKy72a$WGYCC~%Su?>m_WP(`K;tC3g6-j6desi%sT~*g3&;K zfK3c^ufbGeIpQ7|Pd<3)bX*EeK{un( z+%j-uirI+yfJup7!f5ctsS;chc9;Jq<09Dp@C^(83@Z-PRK#x*mLirEuB)MQpf`ny z&zBm^IjpOMahC}m9Sz1R;a!Kp!#v}I2SdxPEnn;yRD6L?XxQ~p(4UY}^6K-~Kf9!0yi6WnYsAUk;L$2Ld>t+pV4!QQAC5L6`4Ngts_AQjaE@#mD z11sgV-d|jCMvc)dXpCvI({0ZDF^In%tKyNGi1#Irq>zuaN*&UidSdO=XS3sOt!7!( z+F842n%%xBwrS0?@c-RzREx;0)=jONJ*K6QL?y#)hVv4=4)$2O7s@0D=Ms4QWqmpS&<|5vEo$CCmH%=9QR6_e|UZ=ZxU&Z^8 zRjW!;HK@6YYtexB&~GF z#Uji+&!Wv^YwF4Fn4SjHbYxGws<+ZF51BLVii4)tqe`o5c8#&_dR=*9j^#6Z-EV{I z=O2|i?Qs*M<6U(eXJBQi;#Cdmv&PDvHvL{TrLGfF-oDP%@f@h4SqBmCf3(>ub-O25 zko9yTjGxtQT%o^?uls9YwW=7;(V&LU%{HkmyZxxqbd0>!5DNZgX3OT zzUtN;=`gdF{$z39p4Q~3Z`Rzjc^q|}W)B*bewEImu?#obJh!u&5|MP;o6HX5>FFw% zID%d#|`h%I7Iu~JDI*x0#vOl5yuxlPUT}$+BuVvX}*zXfgScExl@O5yC z(OR^I+Ld3|v#2bO17@Ck{l=x=lZn@FUb?-7Vr2V^>)4G+-Qn-3%_%~wQ*1*+(;7qv z4q|b15KL-Qj5D-Ex6iNF-4$Rmh}G3bMx~25nmI6rh^BZ26hH1FM-*lk&d0_JN{t$C<;ioC2VZAE@^T!{jhF>+YCb|UUT3*8mdeJnTAOPF9 zX3!H&qJDG6zv~}ZB&?iX9kIb$OVq3DBWR+ojwb14RCh3rwTspW@P*3$72abUFc$S1 ziTcJo=+!U=Q5y7|%X{bRDgF-d9~MEUG#W(p^ePxOb;LZf*|2loRlHVNEng-3+2AZ) zL@k$GjHjnkrMwfQ?^@%d}_5iiG4WkpGza{I8w^)@o8I5EU)J|QhdVHitbn9 zRlK-OB@yv^RN52uJ)->x>f76=*`7%EsB(?}|HqwA{^=Y4h)}>0jv9_CjtY)4juMW2 z9Djr3Cpi9B96!eK*EsfYK%H*KEov#=N)LSbeeD4x;{k;$_9ZmXkyDHU6*6M@*#}#! zCL+ZcD4~y^RJfSi!>;U6f(h};DQTO+H31X@(H~vV5-9&ku>yLD1Qf1Bim}1K?if_v z?>Dhco)#96jOqM>;}pdGAE+g~0O>bg594`)e`fxlXaIVRux3(43}xH1-~h-RU1M-C7jh6cCbYoP+z6JwFCDN&T<1Rwl*Pkk-^KhY9D z;eD5Q1%Gfy907Pdg^)N|MRr803H;;g93Q) zF#->mD|wUJ2v~o4&74|qgE`e2n`P+oft~Tl1|EOZ90Qj>LQ-^Tz8U;~W{kj$3NbNr zNQXvd4cE-6Jus*C3}SYOY>c`L+Giu^osCczP%x(!%&8wdb1DKi6U={L{l{zORInEl zv)(3LgVXD|a|6I1W6}mV$e>_4CQrlvS2O7Rty&N9{{R`8m4?Le|Hf5Cb%@)(>iYU5 z(L007{rXY+bS~_t{qf78p!J zpy+|32Z|mjdZ6fmq6dl|D0-mifuaYB9w>UC=z-_b1K0Y0f6Vp&{`fcQ|M2=MR$%h| zME4<^lEmPKlL?Z1MDwBaDKlSE0vREV+f356;2zcX#@njMz^cwS4r8dDi1iI5<%XS9d$OZ9KyGSM#$)pcHnPiOiWw+dO z%JSUn=%`i&>U`oz9CdEkz~NT73|}{UM1~JYR)fp%d19#ay=t|zf3XP0jD>AYJmhpA z$4BbaT&BQsPDEkU9vr8G;CRxlRS$>D@l{-vSEcg!M2o!Yp{ibmC3}3POuGL5Sx2qx z=cr;;QA`F1{)>1yd$EVg0VqVHU=t^vRK=PoViby^D8vw)g5Goh`p#Hx@(6oOFI1d8HKiqc;n3^MOGOfpXk3z+0P zfl1~Wn)eqbS?K?jPowz7-V5Iw&ektK=l{F?74Q|joLfH(+qa_KveBgZ7 zAp!`1HrC~x^yqJ8uHydxH^2GMJKy@}KM=n8&)@ie@wWKi2h;;UUpaq%%}n;)n^tjV zG8AoG^ODISidqw3RAfK$p&>v5AwcD!p!h08aZ%M5fstX0mrUA|4+JrP<}c@SUA+ z^RfTMC%^pe7eCqg)4R#dq(s!g=P8Im0vtMn0r6v56;wY`P!=jini{_{_;G;{(s+6@AH3L;KHq(D zf1oeo^Q-tAwqP)y&-On3bZ~kx|50=rj^pzm4X5+?eCnrrB5EW*U5_^QTBoykI*f$7 zJ(O??9_Mp>_a}GfUarsm__{u7>-6>V*encwQ&dIa_XYp|*sbv)zd1hTx8JOhtt*D7 z(`0yZd46r^hS6D^hOrf}gDj6BLD(i7E!D=%fL* z778!dQaOvb?t{n#v>$31z3!U0#Pt;Z?91R5-Cx9@~XMI6N|YsSKGy-B0@w`q(}k?F0iH4p&jK@u5+VHU{6Xw{}Pd} zdzXO9#XVlPxOZK(xVNrZ+*_}bb;aV|BlU`WAMxnv7kOHU5qfM+76$0;7LVo`nvE%W zY=GXG(YQ194}A4|TaX(Y0X8Rvg|aT_YDD-x1L4e=Q21^Pd{UAgOOl+=MqKCr|I^O5 zDm(w_ZXfeLzWVjzzkC(F@E89_>x&_L-Tw+L3N>HRQ7n&mNr0dUO+o>N3VjH>2f`{f z47S`ImHReC-n*-wr?;oj^|v0e$}R2h&cVGX*A5otGnXyoPIA$_JUmDbw6n&!(+Ott z%cGfcTppd(${@h3{_s3LyTnaiUY-wseD8-WJq`Vo?2#Nb(y!XJsCm_>7f&pF&$(vXnXK7%x~@1d1C&X4fu>;Lf>W1F~unZ7h1}pk-8P-50?QMAJrx z>3*j_J2R?ipOZH4-h;iSXI8tts06m4nQxn(RlzU1ZBDI8O*GQx%}JPb#irzt zs1D|ymc?eo%q-FA$(0V+U^-bTGt=~-JJ##bG#%Q#!DZYtTi)239x>@0Y$A4CP1B%% zDz|BSWz#`wPh4iFU?WOX5$rxUY&y+yo3|&knw?4Wpw*j!ZD()=))wBLQmeXVHyVRo zsMa3pVz=v=ZLk!zdoF&it?8PLXjE$B85>8W31%J(Y)bQUyW3c-$D?OeJzDF7?Z(uUf-5_n6L49`C?#|0#Ls|Ou`I${iU|ZtXlMmZnt89_l z%<5J}%QlB#UNOB|jRg~H+Gg`XJRQ(ZHWulT zHc*_3c?L$9)IM+yP=E<`CT|v$=cS+vcInJvu~RZ}&5|R|#)l&2Q{QWLC!v1aX-3H7 zVftg5n+uS`WS*mADU?z^&7)~4iRwDKUgA@I6x7lEQ!DX%ZN5|_)83c+Y%mDf2?&79 zdglPtO3ru{WsdDl&BLfWZv@p7DeR^z2g%Ctz@qlSKI>M^v#{$`Oj;XQ9Zq)D1Q}21 zDwvvSUvyS}=N_5Q1;~FukhLbMxgq`0M@Ve)nM#Sc>2{$(cNPZeJ|WeoAP^kb#oci^kvj@ zRx$2_z8>K|V-G||APBnPgg!m-0z|>lo_?fEVF7f5%A zdwnhDidGVVs0Y{2)`VcwHL(#0m8cFt~ewH=pfq7%vS+51@0n6cZx10AGn{uxt; z`4fGgXHJTXq)>XKqzGk%ClU(DMUgZ&ccXppdy6);+h*5>fzSGHFMK-Xf1{K}(_zr& z%h;5EFYxzS8Z>kKeFWTuY}gQ54ZF}nOW0@4&>l@mt8NQ^qc&|Go)2}>B~2_xC*xt> z9T;8Qa*L+Wlwi=ruN#S9OE8hTHU*p1Sy^_P=A{WbiQceldb2E?2&PzX8zWP&M6ceh z`h@|tX}M+%jkdkub6_ldZtyfrPq~Jezpu?w+%WPdSyE_3kDH#`{QZtfXmK}(Xk){8 zJq^?45-2MJ!REPSIlotFHT(9+S{g8L;+af(w!Au5V|(7F_RJe$`9Cy5w8!VTP8Kjf zLJOUrC$e-2&LfPHRzDXecz<$hv18meK(1Q9fxM>yH?_ihH~UA-7*tx(^~C4@(&~{5 z*nfq53~gq2-NWWEx(?p;JTQE^ng2G$YoZg4za@4wXOrEJqk^4-fm}T=m4-wM@prh+ z`ra5$OBh3&?c8Uyd1Y;$=gwGRESHBlRrjza2z(AR{Jg_F%;3+9pCcov)qMkF`?@9R zt&#+a&e9t3b6pr&3uMg|YdAK*JyXLn)L|AaG5ihANr9~9sVn%0nI$*+!o4`b{J;Rr zfB|>y%561fe!s+Dd&e*6Vn)Ea01llJuu&JHiE|MQQ3JOTS)2WR()6oNCM zr6f5(nN5g{pk@Gg@Q?Pq(1pjUye+eDcA58VJgLODn~pc_%>p2;KEi8)6f8hd0jOYP zz)h8=XduJYlqnv{fCsDWTf>bYgWZnd$BAZ+Gprvit?wJ!a{_vs*W2#I`RUx$ncLFt z?nzzOn=cB*i!%wE!No74A2>~qg4?#I_uZBA?vff($GX5`2tANb(u)!Wj zq05^`On@9Yqo@&Ia7Ml1!r(u>dELP+IF7zYi@vz|;mvEecRB6mqPElTU;EAiOsqGr zM`vS>O5?jl-~fcCfO@$`}($>s55_v~sC7-#$e zhwE?OyuJ*)-gz$=Px)bU^TV6hlj&s;L`P3n-@SRgT$2d!$bCM++Z+D>SA|#q?O&DS zTX^9u78S_(4F>$}v0H@Scet()2y-9dIh*#Xw3+lM59-ydrh z6%+(umH{f1#gKCu9F*lMs&rKi92yW9!mISbmFzw|edn`dck1unf7|{JCY3vwMbq)L zcww9o{^+9iBcpuI_3gfw{zR6#I8*Zzmb!RnELrtF(yDjUX;D2tL=r@b$(;NG!b1vf z;IO$wPXyhM&{LSq7vsyo$1>Yx- zf`1B<2u&$Ls51D4`@z*1DukVR$_{syW0MP-18Vf7As8J46sa_!*v|$GT`5Ba=7;#P*Vgg0=inkYio!R(9FnX<*C(7b_3NwYv?5Q%FWu=mI z74}C~P4RN%^k|XsYUizfyIS;?vq^4hPtwwe465RJZ6=*`OOQhrEHhsIANYCV7Ntbs z5pr^H;N2+YeLJ9?qVrn-mZC3(fq?QDjd~9I@g}{dDo`J}lHxjmGBtk-SiZ-;YzO!n4^JE- z`btXk6@2O=_7|FCB0(tRGs$%W-wTD!01w_{cu)EH|3|~P>0RRTxvLQZmsj->i<;h_XxVs2nrA?{H3U z&|#+WJ8IoT!+og|59|UY^@1Fs1VYMjz?E=CClEZ`td90GZ=%H+A@0wO_5v9HMoa>r zKG6vAtA*cKA6p|7XCgNXK%x=y_m-D+=Sraf5qyWG6ahjZ#4z*Qox-C9n+obnvgXTb zyv|ir|9|oN)mH_4`TILN$p8IH|GTw>n8*CRg5Gh5*z{yeStNH{?FZvr9=`|qVRC*p zo&=|B>IT^H7;iW{o8w-GYUlK32@m|0W^iX^ct2GZR8*Cn1^pfs6=P6+i>jB>TrS4o zUsPWOD}o_}50XtVzwS~X*d~l|)9z!t-ZGFVc&ZOMzNP>{5;e@VhS+HEyF5rd08T-; z^`ZAsPs@skGs0xUb!)?gDL^Uo+!1_nre?E5-`r^{Vd_d}%YVt`u5?eaavxxMmq+sK ztcZ<^ic94H;oc;r5}B`}3{82*g^LRHA;#5Qri3w9(I1qfhx`8^Yf?vpu?DtdAUVOi z1#3j0q?p1)Mi4VEAq;y{9Y>o!asXY|?L#}3RD^$^zsUZ7oWUmj|D^w)^#4D{{{Ira z#D2L8w?yuoI@F6?8sRMvnl7T>kG{Ol^kr=csR(354as;C=hTvDEeD9&tBH^&AzM5@ zNB@5T$pkXW(*(|`3v1~^!c-zwy>VS_HMqng>Hm)hT+){H+J!@N+&uQi=jYAhv;e2g zYjc>sZj8-}dDt~PY9E^Y?sYXU36MaItzo9e)t-?giIpkmAvChWjXD&vHIF}Up(dE6 zN~2llk8>bJnn5`P#Bj%qg z0J%(PS7Nr3gh3_+$x=bX82o*S**l(x%Ys(?kN1!^L8itfK9JZgAUnhu%y3tp$K^{K ziPY_}LUmiK=NC|P=IUHlG=K!CZby=(NP0Ck1n@{A>7Gu_5qL3>q;cm|$n&^!>arY3 z_w2ei)t4T4I6C_FHOR#VD~Z`pc24E}e{Zheis7r~@>GW$4gLQMwK8_bM}tLK@mix< ztJpdmO#9Yx%PpLoduJyVH*FMHFl|V5Uh)e|d8iG{sgDO|vzbnFSZqtv>11~8<+B}c zc$FWWoDge%01N^a7m&Q4ms;|$K_pkKbSTLt;Etp9CTP?&w# zf^;i9tzp?g{of(gtRNaAqmKx1q?mX@HJ9n>OM75FP5qCAhyr;1_JAj+AYy!p`k$iC zoK{?Bj7AWomezKwMPwxdl2_sL#)(0)S}SF z^kEgW1ZGw&En!5{i}0LB)&G`c+*kj@hKASwM=39VbnU0+w#?ehD_mdg-&Hc}nmMNtR)2a@}@_dC8Wu6G7LSgN`JsHTAe@cLT3qDt2lgt^OB6 z8is=AL&>iAYa>s%=cGcH`XQ5~kSOx=)c7=})`nbJ4PetsoDte}{@8tHJ=-+yCV_AZ>*ORcfpDvEcG1FN0 zNa_tHlYVvD84Jd^s|bDJ^5Xb7Uv)Ewb*gs`^{nkH&Fmyc53?z~B_DNkN1QIS+VYCl zOBG`*EW>W^Ts+CUarX8Km8r7Z+e0d%$`3rMw-ye`eX|H|GD+Q?`VqX;0lc4T=lE3{^Qjb zum0~V{{JWT-=Bhm8)+lAWkvkSzAdZhh$4`fFojMcIJqu2l%-H=YKn`7TnOExzo%m) z2UI@T7hG1@~tj2^(jG$>R4>7QZ-C z^YdN&_Lj4aK`X!YA}iO=*TVJHtN;3&yAhxN{;QjePsV%~ic_vIMZ%+~!Mari{+tS_ z>N&3G2tL9-cZ3GyfFR>jdhpP8#d}Hm{Wv2{z{v!hOu)&{5u99tPEag~01J_SQDR1} z#`72{>7zTbzBBm=A89Yi9Jz9*nT0Fj3WL(uL>UpA(IBSnki zo}u}Q%cYM$T%%62)CL4@NIFkwK%O5g!XCq$D1=@G^QbPtyLNce4xAwCkqpszn} zAOqdh`CAO|?#bp4f=vHKh0mZp^P|__W^hmGJrJF;4`)6=1i-dD3QD4IAmCZch>CYq zn211-23*o1VN3}3&j)#qbN>44zxf~QCGWrg&36bNxT*h9{Uc*a_EW@nLjE~~J6aOF zl;;V7FEZ#4wq&H$qCn&Wx`71lJ@hi`|2QK}>i?wvPwM~AvHquKuUaf2AJraI>M+x9 zS-k!yoSbBU1W^G&Nk<+e1kb<*I?L+GQ;?HN^J>u&YzPbRI@DTPAYdR5vR>oH1IXSK zK$x-?R=+t!7=ehIB&q)s;lU>_Jm5H-)rS~hRGaE8q=uCDi|&lA^ZtM*FyttMyJRm)EY8HZldHb}rS- z<*YU9FOSQWL3x^;l`Ge?f?PW7%rDJRKYh{ZHt}bsc(T+ECq0s%^@oMoxzNdqb3qM7 zKNL`(c~O1lfCwX?H4M5qb)_JHE5I}P|Hjz|?bZMP$^HNS^NauaGcTE+@$LVioVqbW zj9%przuh%L41LEB9W?tzDuR!JoL6Mix-jp9r8(?)!X$ERfBi$kA}6P=5qw@RJ~ed(ID%K6{hNRd9I<+5D7; zdb%+N`bZ?;BLe}OQu*m{fV*dQjUy--e6xFo*T*T1bDlTvbpQE3n4#eQ%f8}hzGehx@d{Y@5N!&CtQ@|B+)L{4ap$AkwkTx|qzoT$SI{>72)2V;C z8lgCYP0H}33{T4N&$0|}%#Bt_(y2ACv}!1Sk^h(L%(+g-81eGBwAA|+bV3bgweq6< zBxQIRf58kW7=Ben-^q~K0lKyPXDypX#2Kb7_o-kn5DZ$##Syp^>R@~c=Lj#)Xe;%GnUUX z$CxuLlm36|rk-9WaO`3P2 z)sYYqf*=qS@{jHRFH6_eTgHRv|1XVxUIg%PM2eQv^BgkIcG3-ZaCN2@j}Oy_M)_i% zTWaNWC3l$_p5_f-^GUZl=%-WVtTnaF)a2wa=cWcjZEp4llWw3loodIL&ehIknlX=t zfd(IaW}Q3uF8;r!D6rPi za6z#Up5lU!Xl91SB7`N31_X91WaD4J>wk8@|KDVaZ4d3$|AHojk}4vmLX|wQh5Z2a zKa$a0AqY@KD6%U*#=hkx)c2&REdhBx?vUYMIpio$%cDy z@1d7j|Hm0=QvWCQe^UQ{j`jbtgZ(}lnlKwj^M7PV#)!=k2mw6=0^rzy>A6f72IzQ9 zO?;Z*!7|7M-M#_x0Vg=i;jl{0sd5|4Zu2zkKokK2&v^yv~O?1K%xj52eyUf*`>(lBAgGz{eI5(lz`q#r6C?$pI7UK5B$j9)bCeB%WINLv z0BL(DilTqPGLJX|eI($M$UFeb#5vE;g5B^ZjcMI*LraN-QLx1DA7okZpx_nH;_bJ; zd;6z1nH@vze`eqR?H{~Xe<0hHoHDp6QpQq(>p?i>$-qrT;Idd)T^OgpZNa&FN0ANs zvbm#($`{eKBMZ@pjA$9SHmcB-iC}T091%G}PN4B{OxXPr=MjvoJ&@_HN67XBym{S; zFhOp&d38BH=mpd8;M}=%Mw5dxep(Nr->0Uq;yk#A;=}*$-ovlsj1X^gdcB%2uHzb? zUrkR(eD)4rkFQ3-WzWMShQYWq?Y=$`zkTz1f1+11B0RV|ot_{3(?9))$@s^0Z`s@< zPbb>Kgu&{CPZ|DMO&Y$5rVamg_{2sN$A9}yc2*?tdiSsK0TSa<-3)F$o&0B*(5%E` zn`vDirF1>Ho4;C3@#@zizv*cfKioIjo2TGY&R>ES@c(@ik6$uD5b#@m+ws4PxtQQw zoZh_jn&-BAoxUcNiF^0gEfUw>@`9_{#|0`7+4TZXOX0&A#4v$rpmqA_A`;)1HBIw; zNqy)!x5TjTf1Tc0uDAjAEe9#|AVECywG?cf@KPaYp049KDM#@sa%mkA?yz@uf7_BDt=JAb_9uausKUn4y~sWA#asEI=P( z0g5v<{QiDXqE-l93VjzfK%J)(4vH<^t?jx4(m(c%@GsH)(-wFT! z9R&X$-9pBhoM&0VKQRB_g%PLfctBfJ5e1?PVi-0~Bqasl=2N(afNT?Q3IFrK;KBaC zEFo(aeSRQ39OFYNi47UbNks@XSyG7*x*P9-)uI6Ze`(hz6iWv`w5d~t9bb=^#Q%>o z()bu(uqX>bJIxaYXD}ZUoGj`3ZSySX5hNAnQ8M{LL`-a5kCAxRGn;5G)-6up6^)kO zs}3iW%;|C9dzXW9R^hyl-i-rolYA6kG0j0X@>3jRO( z^Y9+`=5~JoF*5wZ;l=+n#sdf*U79_k4kH8ZahB`gbzpjs^U&ig&7ldnuI9>JyIueX zp(LOunehLU{{JW6|A!wRF8gg z%GJ_ot~RI;Eq^`jH_p;!S+a%N;xstYk1w*#(?fQ4JgUpRzE)EX(?HN%iKviVsw#po znU82W3X^uCVjo7_z(p(Id3uC#_CY)S|6hFl>eVl6U%&e6zj_&!Z}KjZGmxBt%WeU!ldWh^QUob}~&Ojdt3MU*P0Jm|@^RwW) z{7GZB_4hls@5>ST%}&$(9*$5L2w@_|LV6rfAN@)T5<8W9OWa5U1ir#3i)@vuM zU~kce7#JaB z#}tny{r?ZM$A14;`Tm=;hx`8$QoIA1FY*GYA0k7Rn4^ZEi4rZ8G#Rp9vf=Kp`g)Rd zKsO&Gn?o$xnr-_3V19vl#<*(*HhfIxyH-I-g$!8+qN6BM_;dIFV=;#K$gN(||NqJT z{}_|A`FPmhs68$!-~;#n6<3i}DuwXbpj`jYePTlbpUqHpp%-(hLxjC;*DYGumgf2A zgYkp?f9flO>tb7|1q#4uQII(20Ae(XTbu=Oq7iPb6W|H4P5r*%3GE(wne}^|k;bpz zlm35()tGOa1>0;i%z{r!^VYCi)$^q2Fdsh;OD9xwPTJ=edfv!@uTb9pY-SoQBj0HG z8M9@cJ9Wc0b3SqF#@HMcm_96DRfIy`7ocs!7iUG)!5uCFM>UM&)Fg zSsKIPVPl{b{qe9@Z*{MNmQl3_=D0$|OS|RQgZyylw$G#*sV(ZHJFJf^3LbkkWi>0z5kep$oM3K^YJx>;N&i3T z|9|rRe|=PAda>NoDYX8r2IJfqBbO$X7Wgtncw^*B@X7>Frp0|RGo#1(|Dpe1*CqYr zPXC`6%fU7J|K+Q;P4U^5n{);zaQkbvv|+w9n^i|f^%N$_N4ZHclf5{-C`_-|xuckB z_qd{`=V!}cc~Wx Date: Thu, 26 Mar 2026 11:22:45 +0100 Subject: [PATCH 10/13] fix: remove passwordProtection when updating token content for presentation token --- .../useCases/consumption/openid4vc/CreatePresentationToken.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts index b203b4a5b..40bb9702b 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/CreatePresentationToken.ts @@ -41,8 +41,7 @@ export class CreatePresentationTokenUseCase extends UseCase Date: Fri, 27 Mar 2026 17:24:39 +0100 Subject: [PATCH 11/13] fix: add token presentation to facade --- .../facades/consumption/OpenId4VcFacade.ts | 10 +++++++++- .../src/useCases/consumption/openid4vc/index.ts | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts index cbf960bb2..102831844 100644 --- a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts +++ b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts @@ -1,9 +1,12 @@ import { Result } from "@js-soft/ts-utils"; +import { TokenDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { AcceptAuthorizationRequestRequest, AcceptAuthorizationRequestResponse, AcceptAuthorizationRequestUseCase, + CreatePresentationTokenRequest, + CreatePresentationTokenUseCase, ResolveAuthorizationRequestRequest, ResolveAuthorizationRequestResponse, ResolveAuthorizationRequestUseCase @@ -12,7 +15,8 @@ import { export class OpenId4VcFacade { public constructor( @Inject private readonly resolveAuthorizationRequestUseCase: ResolveAuthorizationRequestUseCase, - @Inject private readonly acceptAuthorizationRequestUseCase: AcceptAuthorizationRequestUseCase + @Inject private readonly acceptAuthorizationRequestUseCase: AcceptAuthorizationRequestUseCase, + @Inject private readonly createPresentationTokenUseCase: CreatePresentationTokenUseCase ) {} public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise> { @@ -22,4 +26,8 @@ export class OpenId4VcFacade { public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise> { return await this.acceptAuthorizationRequestUseCase.execute(request); } + + public async createPresentationToken(request: CreatePresentationTokenRequest): Promise> { + return await this.createPresentationTokenUseCase.execute(request); + } } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/index.ts b/packages/runtime/src/useCases/consumption/openid4vc/index.ts index 74cbb49d3..6fb13b7f3 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/index.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/index.ts @@ -1,2 +1,3 @@ export * from "./AcceptAuthorizationRequest"; +export * from "./CreatePresentationToken"; export * from "./ResolveAuthorizationRequest"; From c29c07cc4f9a23a2764aab647062ada9e8b70f42 Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 27 Mar 2026 17:24:58 +0100 Subject: [PATCH 12/13] feat: re-add pex --- .../src/modules/openid4vc/local/Holder.ts | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/packages/consumption/src/modules/openid4vc/local/Holder.ts b/packages/consumption/src/modules/openid4vc/local/Holder.ts index 63fd54d0c..f3b4ea48d 100644 --- a/packages/consumption/src/modules/openid4vc/local/Holder.ts +++ b/packages/consumption/src/modules/openid4vc/local/Holder.ts @@ -1,4 +1,17 @@ -import { BaseRecord, ClaimFormat, DidJwk, DidKey, InjectionSymbols, JwkDidCreateOptions, KeyDidCreateOptions, Kms, X509Module } from "@credo-ts/core"; +import { + BaseRecord, + ClaimFormat, + DcqlCredentialsForRequest, + DidJwk, + DidKey, + DifPexInputDescriptorToCredentials, + InjectionSymbols, + JwkDidCreateOptions, + KeyDidCreateOptions, + Kms, + SdJwtVcApi, + X509Module +} from "@credo-ts/core"; import { OpenId4VciCredentialResponse, OpenId4VcModule, type OpenId4VciResolvedCredentialOffer, type OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; import { TokenContentVerifiablePresentation, VerifiableCredential } from "@nmshd/content"; import { AccountController } from "@nmshd/transport"; @@ -146,27 +159,45 @@ export class Holder extends BaseAgent> } | undefined > { - if (!resolvedAuthorizationRequest.dcql) { - throw new Error("Missing dcql on resolved authorization request"); + if (!resolvedAuthorizationRequest.presentationExchange && !resolvedAuthorizationRequest.dcql) { + throw new Error("Missing presentation exchange or dcql on resolved authorization request"); } const credentialContent = credential.content.value as VerifiableCredential; const credentialRecord = decodeRecord(credentialContent.type, credentialContent.value); - const queryId = resolvedAuthorizationRequest.dcql.queryResult.credentials[0].id; - const credentialForDcql = { - [queryId]: [ - { - credentialRecord, - claimFormat: credentialContent.type as any, - disclosedPayload: {} // TODO: implement SD properly - } - ] - } as any; + let credentialForPex: DifPexInputDescriptorToCredentials | undefined; + if (resolvedAuthorizationRequest.presentationExchange) { + const inputDescriptor = resolvedAuthorizationRequest.presentationExchange.credentialsForRequest.requirements[0].submissionEntry[0].inputDescriptorId; + credentialForPex = { + [inputDescriptor]: [ + { + credentialRecord, + claimFormat: credentialContent.type as any, + disclosedPayload: {} // TODO: implement SD properly + } + ] + } as any; + } + + let credentialForDcql: DcqlCredentialsForRequest | undefined; + if (resolvedAuthorizationRequest.dcql) { + const queryId = resolvedAuthorizationRequest.dcql.queryResult.credentials[0].id; + credentialForDcql = { + [queryId]: [ + { + credentialRecord, + claimFormat: credentialContent.type as any, + disclosedPayload: {} // TODO: implement SD properly + } + ] + } as any; + } const submissionResult = await this.agent.openid4vc.holder.acceptOpenId4VpAuthorizationRequest({ authorizationRequestPayload: resolvedAuthorizationRequest.authorizationRequestPayload, - dcql: { credentials: credentialForDcql } + presentationExchange: credentialForPex ? { credentials: credentialForPex } : undefined, + dcql: credentialForDcql ? { credentials: credentialForDcql } : undefined }); return submissionResult.serverResponse; } From d6c4b235be2b9a0ba9b75a8d20a1376ab7f4283e Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 27 Mar 2026 17:28:45 +0100 Subject: [PATCH 13/13] chore: build schemas --- .../runtime/src/useCases/common/Schemas.ts | 237 ------------------ 1 file changed, 237 deletions(-) diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index 1c8a4a434..8c6f238e4 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -317,9 +317,6 @@ export const CanCreateOutgoingRequestRequest: any = { }, { "$ref": "#/definitions/ShareCredentialOfferRequestItemJSON" - }, - { - "$ref": "#/definitions/ShareAuthorizationRequestRequestItemJSON" } ] }, @@ -2785,42 +2782,6 @@ export const CanCreateOutgoingRequestRequest: any = { ], "additionalProperties": false }, - "ShareAuthorizationRequestRequestItemJSON": { - "type": "object", - "properties": { - "@type": { - "type": "string", - "const": "ShareAuthorizationRequestRequestItem" - }, - "@context": { - "type": "string" - }, - "@version": { - "type": "string" - }, - "description": { - "type": "string", - "description": "The human-readable description of this item." - }, - "metadata": { - "type": "object", - "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." - }, - "mustBeAccepted": { - "type": "boolean", - "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." - }, - "authorizationRequestUrl": { - "type": "string" - } - }, - "required": [ - "@type", - "authorizationRequestUrl", - "mustBeAccepted" - ], - "additionalProperties": false - }, "AddressString": { "type": "string", "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" @@ -7229,9 +7190,6 @@ export const CreateOutgoingRequestRequest: any = { }, { "$ref": "#/definitions/ShareCredentialOfferRequestItemJSON" - }, - { - "$ref": "#/definitions/ShareAuthorizationRequestRequestItemJSON" } ] }, @@ -9697,42 +9655,6 @@ export const CreateOutgoingRequestRequest: any = { ], "additionalProperties": false }, - "ShareAuthorizationRequestRequestItemJSON": { - "type": "object", - "properties": { - "@type": { - "type": "string", - "const": "ShareAuthorizationRequestRequestItem" - }, - "@context": { - "type": "string" - }, - "@version": { - "type": "string" - }, - "description": { - "type": "string", - "description": "The human-readable description of this item." - }, - "metadata": { - "type": "object", - "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." - }, - "mustBeAccepted": { - "type": "boolean", - "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." - }, - "authorizationRequestUrl": { - "type": "string" - } - }, - "required": [ - "@type", - "authorizationRequestUrl", - "mustBeAccepted" - ], - "additionalProperties": false - }, "AddressString": { "type": "string", "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" @@ -10394,9 +10316,6 @@ export const ReceivedIncomingRequestRequest: any = { }, { "$ref": "#/definitions/ShareCredentialOfferRequestItemJSON" - }, - { - "$ref": "#/definitions/ShareAuthorizationRequestRequestItemJSON" } ] }, @@ -12862,42 +12781,6 @@ export const ReceivedIncomingRequestRequest: any = { ], "additionalProperties": false }, - "ShareAuthorizationRequestRequestItemJSON": { - "type": "object", - "properties": { - "@type": { - "type": "string", - "const": "ShareAuthorizationRequestRequestItem" - }, - "@context": { - "type": "string" - }, - "@version": { - "type": "string" - }, - "description": { - "type": "string", - "description": "The human-readable description of this item." - }, - "metadata": { - "type": "object", - "description": "This property can be used to add some arbitrary metadata to this item. The content of this property will be copied into the response on the side of the recipient, so the sender can use it to identify the item as they receive the response." - }, - "mustBeAccepted": { - "type": "boolean", - "description": "If set to `true`, the recipient has to accept this item if they want to accept the Request. If set to `false`, the recipient can decide whether they want to accept it or not." - }, - "authorizationRequestUrl": { - "type": "string" - } - }, - "required": [ - "@type", - "authorizationRequestUrl", - "mustBeAccepted" - ], - "additionalProperties": false - }, "MessageIdString": { "type": "string", "pattern": "MSG[A-Za-z0-9]{17}" @@ -17368,85 +17251,6 @@ export const CreatePresentationTokenRequest: any = { } } -export const RequestCredentialsRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/RequestCredentialsRequest", - "definitions": { - "RequestCredentialsRequest": { - "$ref": "#/definitions/AbstractRequestCredentialsRequest%3Calias-2033348025-74138-74264-2033348025-0-218439%3Cstring%2Cany%3E%3E" - }, - "AbstractRequestCredentialsRequest>": { - "anyOf": [ - { - "type": "object", - "additionalProperties": false, - "properties": { - "credentialOffer": { - "type": "object" - }, - "credentialConfigurationIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "credentialConfigurationIds", - "credentialOffer" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "pinCode": { - "type": "string" - }, - "credentialOffer": { - "type": "object" - }, - "credentialConfigurationIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "credentialConfigurationIds", - "credentialOffer", - "pinCode" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "accessToken": { - "type": "string" - }, - "credentialOffer": { - "type": "object" - }, - "credentialConfigurationIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "accessToken", - "credentialConfigurationIds", - "credentialOffer" - ] - } - ] - } - } -} - export const ResolveAuthorizationRequestRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/ResolveAuthorizationRequestRequest", @@ -17466,47 +17270,6 @@ export const ResolveAuthorizationRequestRequest: any = { } } -export const ResolveCredentialOfferRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/ResolveCredentialOfferRequest", - "definitions": { - "ResolveCredentialOfferRequest": { - "type": "object", - "properties": { - "credentialOfferUrl": { - "type": "string" - } - }, - "required": [ - "credentialOfferUrl" - ], - "additionalProperties": false - } - } -} - -export const StoreCredentialsRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/StoreCredentialsRequest", - "definitions": { - "StoreCredentialsRequest": { - "type": "object", - "additionalProperties": false, - "properties": { - "credentialResponses": { - "type": "array", - "items": { - "type": "object" - } - } - }, - "required": [ - "credentialResponses" - ] - } - } -} - export const CreateSettingRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/CreateSettingRequest",