From 9e3a70721f929b636735affb89828b15ea805fd3 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:40:27 -0500 Subject: [PATCH 01/53] feat: setup basic test env --- pnpm-lock.yaml | 85 +++++++++++++++---- pnpm-workspace.yaml | 2 +- test/integration/dbinit.sql | 15 ++++ .../docker-compose.cloud-nine-wallet-test.yml | 59 +++++++++++++ .../docker-compose.happy_life_bank_test.yml | 50 +++++++++++ test/integration/docker-compose.yml | 29 +++++++ test/integration/package.json | 17 ++++ 7 files changed, 238 insertions(+), 19 deletions(-) create mode 100644 test/integration/dbinit.sql create mode 100644 test/integration/docker-compose.cloud-nine-wallet-test.yml create mode 100644 test/integration/docker-compose.happy_life_bank_test.yml create mode 100644 test/integration/docker-compose.yml create mode 100644 test/integration/package.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f59c65a6d2..cfecea6536 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -575,6 +575,15 @@ importers: specifier: ^6.7.4 version: 6.7.4 + test/integration: + devDependencies: + jest: + specifier: ^29.7.0 + version: 29.7.0 + testcontainers: + specifier: ^10.6.0 + version: 10.6.0 + packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -1184,7 +1193,7 @@ packages: dependencies: '@babel/compat-data': 7.23.2 '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -4474,7 +4483,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.18.5 + '@types/node': 20.10.6 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4495,14 +4504,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.5 + '@types/node': 20.10.6 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.18.5) + jest-config: 29.7.0(@types/node@20.10.6) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4597,7 +4606,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 18.18.5 + '@types/node': 20.10.6 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4696,7 +4705,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.9 + '@types/node': 20.10.6 '@types/yargs': 17.0.11 chalk: 4.1.2 dev: true @@ -5565,7 +5574,7 @@ packages: /@types/docker-modem@3.0.6: resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} dependencies: - '@types/node': 18.18.5 + '@types/node': 20.10.6 '@types/ssh2': 0.5.52 dev: true @@ -5573,7 +5582,7 @@ packages: resolution: {integrity: sha512-Lz5J+NFgZS4cEVhquwjIGH4oQwlVn2h7LXD3boitujBnzOE5o7s9H8hchEjoDK2SlRsJTogdKnQeiJgPPKLIEw==} dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 18.18.5 + '@types/node': 20.10.6 dev: true /@types/estree-jsx@0.0.1: @@ -5945,13 +5954,13 @@ packages: /@types/ssh2-streams@0.1.9: resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} dependencies: - '@types/node': 18.18.5 + '@types/node': 20.10.6 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 18.18.5 + '@types/node': 20.10.6 '@types/ssh2-streams': 0.1.9 dev: true @@ -7310,6 +7319,7 @@ packages: electron-to-chromium: 1.4.553 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true /browserslist@4.22.2: resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} @@ -7320,7 +7330,6 @@ packages: electron-to-chromium: 1.4.635 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -7482,10 +7491,10 @@ packages: /caniuse-lite@1.0.30001547: resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} + dev: true /caniuse-lite@1.0.30001578: resolution: {integrity: sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==} - dev: true /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -8783,10 +8792,10 @@ packages: /electron-to-chromium@1.4.553: resolution: {integrity: sha512-HiRdtyKS2+VhiXvjhMvvxiMC33FJJqTA5EB2YHgFZW6v7HkK4Q9Ahv2V7O2ZPgAjw+MyCJVMQvigj13H8t+wvA==} + dev: true /electron-to-chromium@1.4.635: resolution: {integrity: sha512-iu/2D0zolKU3iDGXXxdOzNf72Jnokn+K1IN6Kk4iV6l1Tr2g/qy+mvmtfAiBwZe5S3aB5r92vp+zSZ69scYRrg==} - dev: true /elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} @@ -11548,6 +11557,46 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@20.10.6): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.10.6 + babel-jest: 29.7.0(@babel/core@7.23.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-diff@26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} @@ -11614,7 +11663,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.5 - '@types/node': 18.18.5 + '@types/node': 20.10.6 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -11822,7 +11871,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.18.5 + '@types/node': 20.10.6 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.10 @@ -11847,7 +11896,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.5 + '@types/node': 20.10.6 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13793,10 +13842,10 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true /non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} @@ -17240,6 +17289,7 @@ packages: browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 + dev: true /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} @@ -17250,7 +17300,6 @@ packages: browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 89fb550e8b..03b3e60a56 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,4 +2,4 @@ packages: - 'packages/*' - 'localenv/mock-account-servicing-entity' # exclude packages that are inside test directories - - '!**/test/**' + - 'test/integration' diff --git a/test/integration/dbinit.sql b/test/integration/dbinit.sql new file mode 100644 index 0000000000..c01bef2187 --- /dev/null +++ b/test/integration/dbinit.sql @@ -0,0 +1,15 @@ +CREATE USER cloud_nine_wallet_test_backend WITH PASSWORD 'cloud_nine_wallet_test_backend'; +CREATE DATABASE cloud_nine_wallet_test_backend; +ALTER DATABASE cloud_nine_wallet_test_backend OWNER TO cloud_nine_wallet_test_backend; + +CREATE USER cloud_nine_wallet_test_auth WITH PASSWORD 'cloud_nine_wallet_test_auth'; +CREATE DATABASE cloud_nine_wallet_test_auth; +ALTER DATABASE cloud_nine_wallet_test_auth OWNER TO cloud_nine_wallet_test_auth; + +CREATE USER happy_life_bank_test_backend WITH PASSWORD 'happy_life_bank_test_backend'; +CREATE DATABASE happy_life_bank_test_backend; +ALTER DATABASE happy_life_bank_test_backend OWNER TO happy_life_bank_test_backend; + +CREATE USER happy_life_bank_test_auth WITH PASSWORD 'happy_life_bank_test_auth'; +CREATE DATABASE happy_life_bank_test_auth; +ALTER DATABASE happy_life_bank_test_auth OWNER TO happy_life_bank_test_auth; \ No newline at end of file diff --git a/test/integration/docker-compose.cloud-nine-wallet-test.yml b/test/integration/docker-compose.cloud-nine-wallet-test.yml new file mode 100644 index 0000000000..f443a7dfba --- /dev/null +++ b/test/integration/docker-compose.cloud-nine-wallet-test.yml @@ -0,0 +1,59 @@ +name: cloud-nine-wallet-test +services: + cloud-nine-wallet-test-backend: + hostname: cloud-nine-wallet-test-backend + image: rafiki-backend + build: + context: ../.. + dockerfile: ./packages/backend/Dockerfile + restart: always + privileged: true + ports: + - '3000:80' + - '3001:3001' + - '3002:3002' + networks: + - rafiki-test + environment: + NODE_ENV: ${NODE_ENV:-development} + TRUST_PROXY: ${TRUST_PROXY} + LOG_LEVEL: debug + ADMIN_PORT: 3001 + CONNECTOR_PORT: 3002 + OPEN_PAYMENTS_PORT: 80 + DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend + USE_TIGERBEETLE: ${USE_TIGERBEETLE-false} + TIGERBEETLE_CLUSTER_ID: ${TIGERBEETLE_CLUSTER_ID-0} + TIGERBEETLE_REPLICA_ADDRESSES: ${TIGERBEETLE_REPLICA_ADDRESSES-''} + AUTH_SERVER_GRANT_URL: ${CLOUD_NINE_WALLET_TEST_AUTH_SERVER_DOMAIN:-http://cloud-nine-wallet-test-auth:3006} + AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 + ILP_ADDRESS: ${ILP_ADDRESS:-test.cloud-nine-wallet-test} + STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= + OPEN_PAYMENTS_URL: ${CLOUD_NINE_WALLET_TEST_OPEN_PAYMENTS_URL:-http://cloud-nine-wallet-test-backend} + WEBHOOK_URL: http://cloud-nine-wallet-test/webhooks + EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates + REDIS_URL: redis://shared-redis:6379/0 + WALLET_ADDRESS_URL: ${CLOUD_NINE_WALLET_TEST_WALLET_ADDRESS_URL:-https://cloud-nine-wallet-test/.well-known/pay} + ILP_CONNECTOR_ADDRESS: ${CLOUD_NINE_WALLET_TEST_CONNECTOR_URL} + depends_on: + - shared-database + - shared-redis + cloud-nine-wallet-test-auth: + hostname: cloud-nine-wallet-test-auth + image: rafiki-auth + build: + context: ../.. + dockerfile: ./packages/auth/Dockerfile + restart: always + networks: + - rafiki-test + ports: + - '3003:3003' + - '3006:3006' + environment: + NODE_ENV: ${NODE_ENV:-development} + TRUST_PROXY: ${TRUST_PROXY} + AUTH_DATABASE_URL: postgresql://cloud_nine_wallet_test_auth:cloud_nine_wallet_test_auth@shared-database/cloud_nine_wallet_test_auth + AUTH_SERVER_DOMAIN: ${CLOUD_NINE_WALLET_TEST_AUTH_SERVER_DOMAIN:-http://localhost:3006} + depends_on: + - shared-database \ No newline at end of file diff --git a/test/integration/docker-compose.happy_life_bank_test.yml b/test/integration/docker-compose.happy_life_bank_test.yml new file mode 100644 index 0000000000..ff153b7e2a --- /dev/null +++ b/test/integration/docker-compose.happy_life_bank_test.yml @@ -0,0 +1,50 @@ +name: happy-life-bank-test +services: + happy-life-bank-test: + hostname: happy-life-bank-test + image: rafiki-backend + pull_policy: never + restart: always + privileged: true + ports: + - "4000:80" + - "4001:3001" + networks: + - rafiki-test + environment: + NODE_ENV: development + LOG_LEVEL: debug + ADMIN_PORT: 3001 + CONNECTOR_PORT: 3002 + OPEN_PAYMENTS_PORT: 80 + DATABASE_URL: postgresql://happy_life_bank_test_backend:happy_life_bank_test_backend@shared-database/happy_life_bank_test_backend + USE_TIGERBEETLE: ${USE_TIGERBEETLE-false} + TIGERBEETLE_CLUSTER_ID: ${TIGERBEETLE_CLUSTER_ID-0} + TIGERBEETLE_REPLICA_ADDRESSES: ${TIGERBEETLE_REPLICA_ADDRESSES-''} + AUTH_SERVER_GRANT_URL: ${HAPPY_LIFE_BANK_TEST_AUTH_SERVER_DOMAIN:-http://happy-life-bank-test-auth:3006} + AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 + ILP_ADDRESS: test.happy-life-bank-test + STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= + WEBHOOK_URL: http://happy-life-bank-test/webhooks + OPEN_PAYMENTS_URL: ${HAPPY_LIFE_BANK_TEST_OPEN_PAYMENTS_URL:-http://happy-life-bank-test} + EXCHANGE_RATES_URL: http://happy-life-bank-test/rates + REDIS_URL: redis://shared-redis:6379/1 + WALLET_ADDRESS_URL: ${HAPPY_LIFE_BANK_TEST_WALLET_ADDRESS_URL:-https://happy-life-bank-test/.well-known/pay} + depends_on: + - cloud-nine-wallet-test-backend + happy-life-auth: + hostname: happy-life-bank-test-auth + image: rafiki-auth + pull_policy: never + restart: always + networks: + - rafiki-test + ports: + - '4003:3003' + - '4006:3006' + environment: + NODE_ENV: development + AUTH_DATABASE_URL: postgresql://happy_life_bank_test_auth:happy_life_bank_test_auth@shared-database/happy_life_bank_test_auth + AUTH_SERVER_DOMAIN: ${HAPPY_LIFE_BANK_TEST_AUTH_SERVER_DOMAIN:-http://localhost:4006} + depends_on: + - cloud-nine-wallet-test-auth \ No newline at end of file diff --git a/test/integration/docker-compose.yml b/test/integration/docker-compose.yml new file mode 100644 index 0000000000..3d876fe205 --- /dev/null +++ b/test/integration/docker-compose.yml @@ -0,0 +1,29 @@ +# To be merged with the two rafiki instances' docker-compose.*-test.yml +name: 'rafiki-test' + +networks: + rafiki-test: + driver: bridge + ipam: + config: + - subnet: 10.7.0.0/24 + gateway: 10.7.0.1 + +services: + shared-database: + image: 'postgres:16' + restart: unless-stopped + networks: + - rafiki-test + volumes: + - ./dbinit.sql:/docker-entrypoint-initdb.d/init.sql + ports: + - '5432:5432' + environment: + POSTGRES_PASSWORD: password + POSTGRES_USER: postgres + shared-redis: + image: 'redis:7' + restart: unless-stopped + networks: + - rafiki-test \ No newline at end of file diff --git a/test/integration/package.json b/test/integration/package.json new file mode 100644 index 0000000000..29d06bf2ca --- /dev/null +++ b/test/integration/package.json @@ -0,0 +1,17 @@ +{ + "name": "integration", + "private": true, + "version": "1.0.0", + "description": "", + "scripts": { + "testenv:compose": "docker-compose -f docker-compose.cloud-nine-wallet-test.yml -f docker-compose.happy_life_bank_test.yml -f docker-compose.yml", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "jest": "^29.7.0", + "testcontainers": "^10.6.0" + } +} From 5c6acb5fdc688a8f1896d88e0bce5bae55cc17ed Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 2 Feb 2024 14:53:27 -0500 Subject: [PATCH 02/53] feat: seed integration environment - cmd to start integration environment and run tests - seeds environment on test run - extracts common MASE functionality into new mock-account-servicing-lib --- .../mock-account-servicing-entity/Dockerfile | 5 + .../app/entry.server.tsx | 10 +- .../app/lib/accounts.server.ts | 272 +- .../app/lib/parse_config.server.ts | 59 +- .../app/lib/requesters.ts | 244 +- .../package.json | 4 +- packages/backend/codegen.yml | 12 +- .../mock-account-servicing-lib/jest.config.js | 17 + .../mock-account-servicing-lib/package.json | 24 + .../src/AccountProvider.ts | 271 ++ .../src/generated/graphql.ts | 2227 +++++++++++++++++ .../mock-account-servicing-lib/src/index.ts | 4 + .../src/requesters.ts | 476 ++++ .../src/setupFromSeed.ts | 95 +- .../mock-account-servicing-lib/src/types.ts | 58 + .../mock-account-servicing-lib/tsconfig.json | 11 + pnpm-lock.yaml | 183 +- scripts/run-integration-tests.sh | 35 + test/integration/integration.test.ts | 40 + test/integration/jest.config.js | 15 + test/integration/lib/MockASE.ts | 36 + test/integration/lib/apolloClient.ts | 22 + test/integration/lib/config.ts | 40 + test/integration/package.json | 9 +- .../private-key.cloud-nine-wallet-test.pem | 3 + .../private-key.happy-life-bank-test.pem | 3 + .../seed.cloud-nine-wallet-test.yml | 80 + .../integration/seed.happy-life-bank-test.yml | 91 + test/integration/tsconfig.json | 6 + 29 files changed, 3604 insertions(+), 748 deletions(-) create mode 100644 packages/mock-account-servicing-lib/jest.config.js create mode 100644 packages/mock-account-servicing-lib/package.json create mode 100644 packages/mock-account-servicing-lib/src/AccountProvider.ts create mode 100644 packages/mock-account-servicing-lib/src/generated/graphql.ts create mode 100644 packages/mock-account-servicing-lib/src/index.ts create mode 100644 packages/mock-account-servicing-lib/src/requesters.ts rename localenv/mock-account-servicing-entity/app/lib/run_seed.server.ts => packages/mock-account-servicing-lib/src/setupFromSeed.ts (62%) create mode 100644 packages/mock-account-servicing-lib/src/types.ts create mode 100644 packages/mock-account-servicing-lib/tsconfig.json create mode 100755 scripts/run-integration-tests.sh create mode 100644 test/integration/integration.test.ts create mode 100644 test/integration/jest.config.js create mode 100644 test/integration/lib/MockASE.ts create mode 100644 test/integration/lib/apolloClient.ts create mode 100644 test/integration/lib/config.ts create mode 100644 test/integration/private-key.cloud-nine-wallet-test.pem create mode 100644 test/integration/private-key.happy-life-bank-test.pem create mode 100644 test/integration/seed.cloud-nine-wallet-test.yml create mode 100644 test/integration/seed.happy-life-bank-test.yml create mode 100644 test/integration/tsconfig.json diff --git a/localenv/mock-account-servicing-entity/Dockerfile b/localenv/mock-account-servicing-entity/Dockerfile index 6c4f480c34..8ae5319d25 100644 --- a/localenv/mock-account-servicing-entity/Dockerfile +++ b/localenv/mock-account-servicing-entity/Dockerfile @@ -22,6 +22,7 @@ FROM base AS prod-deps COPY package.json pnpm-workspace.yaml .npmrc ./ COPY localenv/mock-account-servicing-entity/package.json ./localenv/mock-account-servicing-entity/package.json +COPY packages/mock-account-servicing-lib/package.json ./packages/mock-account-servicing-lib/package.json RUN pnpm clean RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ @@ -36,6 +37,7 @@ FROM base AS builder COPY package.json pnpm-workspace.yaml .npmrc tsconfig.json tsconfig.build.json ./ COPY localenv/mock-account-servicing-entity ./localenv/mock-account-servicing-entity +COPY packages/mock-account-servicing-lib ./packages/mock-account-servicing-lib RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install \ @@ -54,9 +56,12 @@ COPY localenv/happy-life-bank/seed.yml ./localenv/happy-life-bank/seed.yml COPY --from=prod-deps /home/rafiki/node_modules ./node_modules COPY --from=prod-deps /home/rafiki/localenv/mock-account-servicing-entity/node_modules ./localenv/mock-account-servicing-entity/node_modules COPY --from=prod-deps /home/rafiki/localenv/mock-account-servicing-entity/package.json ./localenv/mock-account-servicing-entity/package.json +COPY --from=prod-deps /home/rafiki/packages/mock-account-servicing-lib/node_modules ./packages/mock-account-servicing-lib/node_modules +COPY --from=prod-deps /home/rafiki/packages/mock-account-servicing-lib/package.json ./packages/mock-account-servicing-lib/package.json COPY --from=builder /home/rafiki/localenv/mock-account-servicing-entity/build ./localenv/mock-account-servicing-entity/build COPY --from=builder /home/rafiki/localenv/mock-account-servicing-entity/public ./localenv/mock-account-servicing-entity/public +COPY --from=builder /home/rafiki/packages/mock-account-servicing-lib/dist ./packages/mock-account-servicing-lib/dist WORKDIR /home/rafiki/localenv/mock-account-servicing-entity CMD ["sh", "./node_modules/.bin/remix-serve", "./build/index.js"] \ No newline at end of file diff --git a/localenv/mock-account-servicing-entity/app/entry.server.tsx b/localenv/mock-account-servicing-entity/app/entry.server.tsx index 22d046f025..c16240a22b 100644 --- a/localenv/mock-account-servicing-entity/app/entry.server.tsx +++ b/localenv/mock-account-servicing-entity/app/entry.server.tsx @@ -3,7 +3,10 @@ import type { EntryContext } from '@remix-run/node' import { createReadableStreamFromReadable } from '@remix-run/node' import { RemixServer } from '@remix-run/react' import { renderToPipeableStream } from 'react-dom/server' -import { runSeed } from './lib/run_seed.server' +import { setupFromSeed } from 'mock-account-servicing-lib' +import { CONFIG } from './lib/parse_config.server' +import { apolloClient } from './lib/apolloClient' +import { mockAccounts } from './lib/accounts.server' declare global { // eslint-disable-next-line no-var @@ -27,7 +30,10 @@ async function callWithRetry(fn: () => any, depth = 0): Promise { } if (!global.__seeded) { - callWithRetry(runSeed) + callWithRetry(async () => { + console.log('setting up from seed...') + return setupFromSeed(CONFIG, apolloClient, mockAccounts, { debug: true }) + }) .then(() => { global.__seeded = true }) diff --git a/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts b/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts index 31a0bb1311..20f69075a6 100644 --- a/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts @@ -1,273 +1,3 @@ -export interface Account { - id: string - name: string - path: string - walletAddressID: string - walletAddress: string - debitsPending: bigint - debitsPosted: bigint - creditsPending: bigint - creditsPosted: bigint - assetCode: string - assetScale: number - assetId: string -} - -export interface AccountsServer { - clearAccounts(): Promise - setWalletAddress( - id: string, - walletID: string, - walletAddress: string - ): Promise - create( - id: string, - path: string, - name: string, - assetCode: string, - assetScale: number, - assetId: string - ): Promise - listAll(): Promise - get(id: string): Promise - getByWalletAddressId(walletAddressId: string): Promise - getByPath(path: string): Promise - getByWalletAddressUrl(walletAddressUrl: string): Promise - voidPendingDebit(id: string, amount: bigint): Promise - voidPendingCredit(id: string, amount: bigint): Promise - pendingDebit(id: string, amount: bigint): Promise - pendingCredit(id: string, amount: bigint): Promise - debit(id: string, amount: bigint, clearPending: boolean): Promise - credit(id: string, amount: bigint, clearPending: boolean): Promise -} - -export class AccountProvider implements AccountsServer { - accounts = new Map() - - async clearAccounts(): Promise { - this.accounts.clear() - } - - async setWalletAddress( - id: string, - walletID: string, - walletAddress: string - ): Promise { - if (!this.accounts.has(id)) { - throw new Error('account already exists') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - acc.walletAddress = walletAddress - acc.walletAddressID = walletID - } - - async create( - id: string, - path: string, - name: string, - assetCode: string, - assetScale: number, - assetId: string - ): Promise { - if (this.accounts.has(id)) { - throw new Error('account already exists') - } - this.accounts.set(id, { - id, - name, - path, - walletAddress: '', - walletAddressID: '', - creditsPending: BigInt(0), - creditsPosted: BigInt(0), - debitsPending: BigInt(0), - debitsPosted: BigInt(0), - assetCode, - assetScale, - assetId - }) - } - - async listAll(): Promise { - return [...this.accounts.values()] - } - - async get(id: string): Promise { - return this.accounts.get(id) - } - - async getByWalletAddressId( - walletAddressId: string - ): Promise { - for (const acc of this.accounts.values()) { - if (acc.walletAddressID == walletAddressId) { - return acc - } - } - } - - async getByWalletAddressUrl( - walletAddressUrl: string - ): Promise { - return (await this.listAll()).find( - (acc) => acc.walletAddress === walletAddressUrl - ) - } - - async getByPath(path: string): Promise { - return (await this.listAll()).find((acc) => acc.path === path) - } - - async credit( - id: string, - amount: bigint, - clearPending: boolean - ): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid credit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (clearPending && acc.creditsPending - amount < 0) { - throw new Error('invalid amount, credits pending cannot be less than 0') - } - - acc.creditsPosted += amount - if (clearPending) { - acc.creditsPending -= amount - } - } - - async debit( - id: string, - amount: bigint, - clearPending: boolean - ): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid debit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if ( - (clearPending && acc.debitsPending - amount < 0) || - acc.debitsPosted + amount < 0 - ) { - throw new Error('invalid amount, debits pending cannot be less than 0') - } - - if ( - !clearPending && - acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount - ) { - throw new Error('invalid debit, insufficient funds') - } - acc.debitsPosted += amount - if (clearPending) { - acc.debitsPending -= amount - } - } - - async pendingCredit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid pending credit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - acc.creditsPending += amount - } - - async pendingDebit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid pending debit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount) { - throw new Error('invalid pending debit amount, insufficient funds') - } - - acc.debitsPending += amount - } - - async voidPendingDebit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid void pending debit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (acc.debitsPending - amount < 0) { - throw new Error('invalid amount, debits pending cannot be less than 0') - } - - acc.debitsPending -= amount - } - - async voidPendingCredit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid void pending credit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (acc.debitsPending - amount < 0) { - throw new Error('invalid amount, credits pending cannot be less than 0') - } - - acc.creditsPending -= amount - } -} +import { AccountProvider } from 'mock-account-servicing-lib' export const mockAccounts = new AccountProvider() diff --git a/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts b/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts index ab1fdab20a..33b2ac1e21 100644 --- a/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts @@ -1,64 +1,7 @@ -import type * as crypto from 'crypto' import { parse } from 'yaml' import { readFileSync } from 'fs' import { loadOrGenerateKey } from '@interledger/http-signature-utils' - -export interface Self { - graphqlUrl: string - hostname: string - mapHostname: string - openPaymentPublishedPort: number -} - -export interface Asset { - code: string - scale: number - liquidity: number - liquidityThreshold: number -} - -export interface Peering { - liquidityThreshold: number - peerUrl: string - peerIlpAddress: string - initialLiquidity: string - name: string -} - -export interface Account { - name: string - id: string - initialBalance: bigint - path: string - postmanEnvVar: string - assetCode: string - skipWalletAddressCreation?: boolean -} - -export interface Fee { - fixed: number - basisPoints: number - asset: string - scale: number -} - -export interface SeedInstance { - self: Self - assets: Array - peeringAsset: string - peers: Array - accounts: Array - fees: Array - rates: Record> -} - -export interface Config { - seed: SeedInstance - key: crypto.KeyObject - publicHost: string - testnetAutoPeerUrl: string - authServerDomain: string -} +import type { Config } from 'mock-account-servicing-lib' export const CONFIG: Config = { seed: parse( diff --git a/localenv/mock-account-servicing-entity/app/lib/requesters.ts b/localenv/mock-account-servicing-entity/app/lib/requesters.ts index 3ebde490af..9b0ce397a6 100644 --- a/localenv/mock-account-servicing-entity/app/lib/requesters.ts +++ b/localenv/mock-account-servicing-entity/app/lib/requesters.ts @@ -1,169 +1,12 @@ import { gql } from '@apollo/client' import type { - AssetMutationResponse, - CreatePeerMutationResponse, LiquidityMutationResponse, WalletAddress, - CreateWalletAddressKeyMutationResponse, - CreateWalletAddressKeyInput, - CreateWalletAddressInput, - JwkInput, - SetFeeResponse, - FeeType, - CreateOrUpdatePeerByUrlMutationResponse, - CreateOrUpdatePeerByUrlInput + CreateWalletAddressInput } from 'generated/graphql' import { apolloClient } from './apolloClient' import { v4 as uuid } from 'uuid' -export interface GraphqlQueryConfig { - resource: string - method: string - query: string - variables: object -} - -export interface GraphqlResponseElement { - data: { - [key: string]: { code: string } - } -} - -export async function createAsset( - code: string, - scale: number, - liquidityThreshold: number -): Promise { - const createAssetMutation = gql` - mutation CreateAsset($input: CreateAssetInput!) { - createAsset(input: $input) { - code - success - message - asset { - id - code - scale - liquidityThreshold - } - } - } - ` - const createAssetInput = { - input: { - code, - scale, - liquidityThreshold - } - } - return apolloClient - .mutate({ - mutation: createAssetMutation, - variables: createAssetInput - }) - .then(({ data }): AssetMutationResponse => { - if (!data.createAsset.success) { - throw new Error('Data was empty') - } - return data.createAsset - }) -} - -export async function createPeer( - staticIlpAddress: string, - outgoingEndpoint: string, - assetId: string, - assetCode: string, - name: string, - liquidityThreshold: number -): Promise { - const createPeerMutation = gql` - mutation CreatePeer($input: CreatePeerInput!) { - createPeer(input: $input) { - code - success - message - peer { - id - staticIlpAddress - name - liquidityThreshold - } - } - } - ` - const createPeerInput = { - input: { - staticIlpAddress, - http: { - incoming: { authTokens: [`test-${assetCode}`] }, - outgoing: { endpoint: outgoingEndpoint, authToken: `test-${assetCode}` } - }, - assetId, - name, - liquidityThreshold - } - } - return apolloClient - .mutate({ - mutation: createPeerMutation, - variables: createPeerInput - }) - .then(({ data }): CreatePeerMutationResponse => { - console.log(data) - if (!data.createPeer.success) { - throw new Error('Data was empty') - } - return data.createPeer - }) -} - -export async function createAutoPeer( - peerUrl: string, - assetId: string -): Promise { - const createAutoPeerMutation = gql` - mutation CreateOrUpdatePeerByUrl($input: CreateOrUpdatePeerByUrlInput!) { - createOrUpdatePeerByUrl(input: $input) { - code - success - message - peer { - id - name - asset { - id - scale - code - withdrawalThreshold - } - } - } - } - ` - - const liquidityToDeposit = '10000' as unknown as bigint - const createPeerInput: { input: CreateOrUpdatePeerByUrlInput } = { - input: { - peerUrl, - assetId, - liquidityToDeposit - } - } - return apolloClient - .mutate({ - mutation: createAutoPeerMutation, - variables: createPeerInput - }) - .then(({ data }): CreateOrUpdatePeerByUrlMutationResponse => { - if (!data.createOrUpdatePeerByUrl.success) { - console.log(data.createOrUpdatePeerByUrl) - throw new Error(`Data was empty for assetId: ${assetId}`) - } - return data.createOrUpdatePeerByUrl - }) -} - export async function depositPeerLiquidity( peerId: string, amount: string, @@ -284,43 +127,6 @@ export async function createWalletAddress( }) } -export async function createWalletAddressKey({ - walletAddressId, - jwk -}: { - walletAddressId: string - jwk: string -}): Promise { - const createWalletAddressKeyMutation = gql` - mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { - createWalletAddressKey(input: $input) { - code - success - message - } - } - ` - const createWalletAddressKeyInput: CreateWalletAddressKeyInput = { - walletAddressId, - jwk: jwk as unknown as JwkInput - } - - return apolloClient - .mutate({ - mutation: createWalletAddressKeyMutation, - variables: { - input: createWalletAddressKeyInput - } - }) - .then(({ data }): CreateWalletAddressKeyMutationResponse => { - console.log(data) - if (!data.createWalletAddressKey.success) { - throw new Error('Data was empty') - } - return data.createWalletAddressKey - }) -} - export async function getWalletAddressPayments( walletAddressId: string ): Promise { @@ -404,51 +210,3 @@ export async function getWalletAddressPayments( return data.walletAddress }) } - -export async function setFee( - assetId: string, - type: FeeType, - fixed: number, - basisPoints: number -): Promise { - const setFeeMutation = gql` - mutation SetFee($input: SetFeeInput!) { - setFee(input: $input) { - code - success - message - fee { - id - assetId - type - fixed - basisPoints - } - } - } - ` - - const setFeeInput = { - assetId, - type, - fee: { - fixed: String(fixed), - basisPoints - } - } - - return apolloClient - .mutate({ - mutation: setFeeMutation, - variables: { - input: setFeeInput - } - }) - .then(({ data }): SetFeeResponse => { - console.log(data) - if (!data.setFee) { - throw new Error('Data was empty') - } - return data.setFee - }) -} diff --git a/localenv/mock-account-servicing-entity/package.json b/localenv/mock-account-servicing-entity/package.json index e19ff1e05c..61faf0e390 100644 --- a/localenv/mock-account-servicing-entity/package.json +++ b/localenv/mock-account-servicing-entity/package.json @@ -2,7 +2,8 @@ "name": "mock-account-servicing-entity", "sideEffects": false, "scripts": { - "build": "remix build", + "build:deps": "pnpm --filter mock-account-servicing-lib build", + "build": "pnpm build:deps && remix build", "dev": "PORT=3300 remix dev", "start": "remix-serve ./build/index.js", "typecheck": "tsc" @@ -17,6 +18,7 @@ "@types/uuid": "^9.0.8", "axios": "^1.6.7", "graphql": "^16.8.1", + "mock-account-servicing-lib": "workspace:*", "react": "^18.2.0", "react-dom": "^18.2.0", "uuid": "^9.0.1", diff --git a/packages/backend/codegen.yml b/packages/backend/codegen.yml index e966fa0ada..213acf88b8 100644 --- a/packages/backend/codegen.yml +++ b/packages/backend/codegen.yml @@ -40,4 +40,14 @@ generates: scalars: UInt8: number UInt64: bigint - + ../mock-account-servicing-lib/src/generated/graphql.ts: + plugins: + - 'typescript' + - 'typescript-resolvers' + config: + defaultMapper: Partial<{T}> + # By default it is T | null. But the service code uses typescript's optional types (`foo?: T`) which are `T | undefined`. This saves the trouble of converting them explicitly. + inputMaybeValue: T | undefined + scalars: + UInt8: number + UInt64: bigint \ No newline at end of file diff --git a/packages/mock-account-servicing-lib/jest.config.js b/packages/mock-account-servicing-lib/jest.config.js new file mode 100644 index 0000000000..a2667d704f --- /dev/null +++ b/packages/mock-account-servicing-lib/jest.config.js @@ -0,0 +1,17 @@ +'use strict' +// eslint-disable-next-line @typescript-eslint/no-var-requires +const baseConfig = require('../../jest.config.base.js') +// eslint-disable-next-line @typescript-eslint/no-var-requires +const packageName = require('./package.json').name + +module.exports = { + ...baseConfig, + clearMocks: true, + roots: [`/packages/${packageName}`], + testRegex: `(packages/${packageName}/.*/__tests__/.*|\\.(test|spec))\\.tsx?$`, + moduleDirectories: [`node_modules`, `packages/${packageName}/node_modules`], + modulePaths: [`/packages/${packageName}/src/`], + id: packageName, + displayName: packageName, + rootDir: '../..' +} diff --git a/packages/mock-account-servicing-lib/package.json b/packages/mock-account-servicing-lib/package.json new file mode 100644 index 0000000000..a8a0431b2a --- /dev/null +++ b/packages/mock-account-servicing-lib/package.json @@ -0,0 +1,24 @@ +{ + "name": "mock-account-servicing-lib", + "description": "Common library for mock account servicing", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*" + ], + "scripts": { + "build": "pnpm clean && tsc --build tsconfig.json", + "clean": "rm -fr dist/", + "test": "jest" + }, + "devDependencies": { + "@apollo/client": "^3.8.10", + "@types/node": "^18.7.12", + "@types/uuid": "^9.0.8" + }, + "dependencies": { + "@interledger/http-signature-utils": "2.0.0", + "graphql": "^16.8.1", + "uuid": "^9.0.1" + } +} diff --git a/packages/mock-account-servicing-lib/src/AccountProvider.ts b/packages/mock-account-servicing-lib/src/AccountProvider.ts new file mode 100644 index 0000000000..5be375a920 --- /dev/null +++ b/packages/mock-account-servicing-lib/src/AccountProvider.ts @@ -0,0 +1,271 @@ +interface Account { + id: string + name: string + path: string + walletAddressID: string + walletAddress: string + debitsPending: bigint + debitsPosted: bigint + creditsPending: bigint + creditsPosted: bigint + assetCode: string + assetScale: number + assetId: string +} + +interface AccountsServer { + clearAccounts(): Promise + setWalletAddress( + id: string, + walletID: string, + walletAddress: string + ): Promise + create( + id: string, + path: string, + name: string, + assetCode: string, + assetScale: number, + assetId: string + ): Promise + listAll(): Promise + get(id: string): Promise + getByWalletAddressId(walletAddressId: string): Promise + getByPath(path: string): Promise + getByWalletAddressUrl(walletAddressUrl: string): Promise + voidPendingDebit(id: string, amount: bigint): Promise + voidPendingCredit(id: string, amount: bigint): Promise + pendingDebit(id: string, amount: bigint): Promise + pendingCredit(id: string, amount: bigint): Promise + debit(id: string, amount: bigint, clearPending: boolean): Promise + credit(id: string, amount: bigint, clearPending: boolean): Promise +} + +export class AccountProvider implements AccountsServer { + accounts = new Map() + + async clearAccounts(): Promise { + this.accounts.clear() + } + + async setWalletAddress( + id: string, + walletID: string, + walletAddress: string + ): Promise { + if (!this.accounts.has(id)) { + throw new Error('account already exists') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + acc.walletAddress = walletAddress + acc.walletAddressID = walletID + } + + async create( + id: string, + path: string, + name: string, + assetCode: string, + assetScale: number, + assetId: string + ): Promise { + if (this.accounts.has(id)) { + throw new Error('account already exists') + } + this.accounts.set(id, { + id, + name, + path, + walletAddress: '', + walletAddressID: '', + creditsPending: BigInt(0), + creditsPosted: BigInt(0), + debitsPending: BigInt(0), + debitsPosted: BigInt(0), + assetCode, + assetScale, + assetId + }) + } + + async listAll(): Promise { + return [...this.accounts.values()] + } + + async get(id: string): Promise { + return this.accounts.get(id) + } + + async getByWalletAddressId( + walletAddressId: string + ): Promise { + for (const acc of this.accounts.values()) { + if (acc.walletAddressID == walletAddressId) { + return acc + } + } + } + + async getByWalletAddressUrl( + walletAddressUrl: string + ): Promise { + return (await this.listAll()).find( + (acc) => acc.walletAddress === walletAddressUrl + ) + } + + async getByPath(path: string): Promise { + return (await this.listAll()).find((acc) => acc.path === path) + } + + async credit( + id: string, + amount: bigint, + clearPending: boolean + ): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid credit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (clearPending && acc.creditsPending - amount < 0) { + throw new Error('invalid amount, credits pending cannot be less than 0') + } + + acc.creditsPosted += amount + if (clearPending) { + acc.creditsPending -= amount + } + } + + async debit( + id: string, + amount: bigint, + clearPending: boolean + ): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid debit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if ( + (clearPending && acc.debitsPending - amount < 0) || + acc.debitsPosted + amount < 0 + ) { + throw new Error('invalid amount, debits pending cannot be less than 0') + } + + if ( + !clearPending && + acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount + ) { + throw new Error('invalid debit, insufficient funds') + } + acc.debitsPosted += amount + if (clearPending) { + acc.debitsPending -= amount + } + } + + async pendingCredit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid pending credit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + acc.creditsPending += amount + } + + async pendingDebit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid pending debit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount) { + throw new Error('invalid pending debit amount, insufficient funds') + } + + acc.debitsPending += amount + } + + async voidPendingDebit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid void pending debit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (acc.debitsPending - amount < 0) { + throw new Error('invalid amount, debits pending cannot be less than 0') + } + + acc.debitsPending -= amount + } + + async voidPendingCredit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid void pending credit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (acc.debitsPending - amount < 0) { + throw new Error('invalid amount, credits pending cannot be less than 0') + } + + acc.creditsPending -= amount + } +} diff --git a/packages/mock-account-servicing-lib/src/generated/graphql.ts b/packages/mock-account-servicing-lib/src/generated/graphql.ts new file mode 100644 index 0000000000..f5f4003911 --- /dev/null +++ b/packages/mock-account-servicing-lib/src/generated/graphql.ts @@ -0,0 +1,2227 @@ +import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +export type Maybe = T | null; +export type InputMaybe = T | undefined; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + JSONObject: { input: any; output: any; } + UInt8: { input: number; output: number; } + UInt64: { input: bigint; output: bigint; } +}; + +export enum Alg { + EdDsa = 'EdDSA' +} + +export type Amount = { + __typename?: 'Amount'; + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + assetCode: Scalars['String']['output']; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + assetScale: Scalars['UInt8']['output']; + value: Scalars['UInt64']['output']; +}; + +export type AmountInput = { + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + assetCode: Scalars['String']['input']; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + assetScale: Scalars['UInt8']['input']; + value: Scalars['UInt64']['input']; +}; + +export type Asset = Model & { + __typename?: 'Asset'; + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + code: Scalars['String']['output']; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Fetch a page of asset fees */ + fees?: Maybe; + /** Asset id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Account Servicing Entity will be notified via a webhook event if liquidity falls below this value */ + liquidityThreshold?: Maybe; + /** The receiving fee structure for the asset */ + receivingFee?: Maybe; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + scale: Scalars['UInt8']['output']; + /** The sending fee structure for the asset */ + sendingFee?: Maybe; + /** Minimum amount of liquidity that can be withdrawn from the asset */ + withdrawalThreshold?: Maybe; +}; + + +export type AssetFeesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + +export type AssetEdge = { + __typename?: 'AssetEdge'; + cursor: Scalars['String']['output']; + node: Asset; +}; + +export type AssetMutationResponse = MutationResponse & { + __typename?: 'AssetMutationResponse'; + asset?: Maybe; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type AssetsConnection = { + __typename?: 'AssetsConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type BasePayment = { + createdAt: Scalars['String']['output']; + id: Scalars['ID']['output']; + metadata?: Maybe; + walletAddressId: Scalars['ID']['output']; +}; + +export type CreateAssetInput = { + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + code: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if liquidity falls below this value */ + liquidityThreshold?: InputMaybe; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + scale: Scalars['UInt8']['input']; + /** Minimum amount of liquidity that can be withdrawn from the asset */ + withdrawalThreshold?: InputMaybe; +}; + +export type CreateAssetLiquidityWithdrawalInput = { + /** Amount of withdrawal. */ + amount: Scalars['UInt64']['input']; + /** The id of the asset to create the withdrawal for. */ + assetId: Scalars['String']['input']; + /** The id of the withdrawal. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type CreateIncomingPaymentInput = { + /** Expiration date-time */ + expiresAt?: InputMaybe; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Maximum amount to be received */ + incomingAmount?: InputMaybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: InputMaybe; + /** Id of the wallet address under which the incoming payment will be created */ + walletAddressId: Scalars['String']['input']; +}; + +export type CreateOrUpdatePeerByUrlInput = { + /** Asset id of peering relationship */ + assetId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value */ + liquidityThreshold?: InputMaybe; + /** Amount of liquidity to deposit for peer */ + liquidityToDeposit?: InputMaybe; + /** Maximum packet amount that the peer accepts */ + maxPacketAmount?: InputMaybe; + /** Peer's internal name for overriding auto-peer's default naming */ + name?: InputMaybe; + /** Peer's URL address at which the peer accepts auto-peering requests */ + peerUrl: Scalars['String']['input']; +}; + +export type CreateOrUpdatePeerByUrlMutationResponse = MutationResponse & { + __typename?: 'CreateOrUpdatePeerByUrlMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + peer?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type CreateOutgoingPaymentInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Additional metadata associated with the outgoing payment. */ + metadata?: InputMaybe; + /** Id of the corresponding quote for that outgoing payment */ + quoteId: Scalars['String']['input']; + /** Id of the wallet address under which the outgoing payment will be created */ + walletAddressId: Scalars['String']['input']; +}; + +export type CreatePeerInput = { + /** Asset id of peering relationship */ + assetId: Scalars['String']['input']; + /** Peering connection details */ + http: HttpInput; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Initial amount of liquidity to deposit for peer */ + initialLiquidity?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value */ + liquidityThreshold?: InputMaybe; + /** Maximum packet amount that the peer accepts */ + maxPacketAmount?: InputMaybe; + /** Peer's internal name */ + name?: InputMaybe; + /** Peer's ILP address */ + staticIlpAddress: Scalars['String']['input']; +}; + +export type CreatePeerLiquidityWithdrawalInput = { + /** Amount of withdrawal. */ + amount: Scalars['UInt64']['input']; + /** The id of the withdrawal. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the peer to create the withdrawal for. */ + peerId: Scalars['String']['input']; +}; + +export type CreatePeerMutationResponse = MutationResponse & { + __typename?: 'CreatePeerMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + peer?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type CreateQuoteInput = { + /** Amount to send (fixed send) */ + debitAmount?: InputMaybe; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Amount to receive (fixed receive) */ + receiveAmount?: InputMaybe; + /** Wallet address URL of the receiver */ + receiver: Scalars['String']['input']; + /** Id of the wallet address under which the quote will be created */ + walletAddressId: Scalars['String']['input']; +}; + +export type CreateReceiverInput = { + /** Expiration date-time */ + expiresAt?: InputMaybe; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Maximum amount to be received */ + incomingAmount?: InputMaybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: InputMaybe; + /** Receiving wallet address URL */ + walletAddressUrl: Scalars['String']['input']; +}; + +export type CreateReceiverResponse = { + __typename?: 'CreateReceiverResponse'; + code: Scalars['String']['output']; + message?: Maybe; + receiver?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type CreateWalletAddressInput = { + /** Asset of the wallet address */ + assetId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Public name associated with the wallet address */ + publicName?: InputMaybe; + /** Wallet Address URL */ + url: Scalars['String']['input']; +}; + +export type CreateWalletAddressKeyInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Public key */ + jwk: JwkInput; + walletAddressId: Scalars['String']['input']; +}; + +export type CreateWalletAddressKeyMutationResponse = MutationResponse & { + __typename?: 'CreateWalletAddressKeyMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddressKey?: Maybe; +}; + +export type CreateWalletAddressMutationResponse = MutationResponse & { + __typename?: 'CreateWalletAddressMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddress?: Maybe; +}; + +export type CreateWalletAddressWithdrawalInput = { + /** The id of the withdrawal. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the Open Payments wallet address to create the withdrawal for. */ + walletAddressId: Scalars['String']['input']; +}; + +export enum Crv { + Ed25519 = 'Ed25519' +} + +export type DeletePeerInput = { + id: Scalars['ID']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; +}; + +export type DeletePeerMutationResponse = MutationResponse & { + __typename?: 'DeletePeerMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type DepositAssetLiquidityInput = { + /** Amount of liquidity to deposit. */ + amount: Scalars['UInt64']['input']; + /** The id of the asset to deposit liquidity. */ + assetId: Scalars['String']['input']; + /** The id of the transfer. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type DepositEventLiquidityInput = { + /** The id of the event to deposit into. */ + eventId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type DepositOutgoingPaymentLiquidityInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the outgoing payment to deposit into. */ + outgoingPaymentId: Scalars['String']['input']; +}; + +export type DepositPeerLiquidityInput = { + /** Amount of liquidity to deposit. */ + amount: Scalars['UInt64']['input']; + /** The id of the transfer. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the peer to deposit liquidity. */ + peerId: Scalars['String']['input']; +}; + +export type Fee = Model & { + __typename?: 'Fee'; + /** Asset id associated with the fee */ + assetId: Scalars['ID']['output']; + /** Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100% */ + basisPoints: Scalars['Int']['output']; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Fixed fee */ + fixed: Scalars['UInt64']['output']; + /** Fee id */ + id: Scalars['ID']['output']; + /** Type of fee (sending or receiving) */ + type: FeeType; +}; + +export type FeeDetails = { + /** Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100% */ + basisPoints: Scalars['Int']['input']; + /** A flat fee */ + fixed: Scalars['UInt64']['input']; +}; + +export type FeeEdge = { + __typename?: 'FeeEdge'; + cursor: Scalars['String']['output']; + node: Fee; +}; + +export enum FeeType { + /** Receiver pays the fees */ + Receiving = 'RECEIVING', + /** Sender pays the fees */ + Sending = 'SENDING' +} + +export type FeesConnection = { + __typename?: 'FeesConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type FilterString = { + in: Array; +}; + +export type Http = { + __typename?: 'Http'; + /** Outgoing connection details */ + outgoing: HttpOutgoing; +}; + +export type HttpIncomingInput = { + /** Array of auth tokens accepted by this Rafiki instance */ + authTokens: Array; +}; + +export type HttpInput = { + /** Incoming connection details */ + incoming?: InputMaybe; + /** Outgoing connection details */ + outgoing: HttpOutgoingInput; +}; + +export type HttpOutgoing = { + __typename?: 'HttpOutgoing'; + /** Auth token to present at the peering Rafiki instance */ + authToken: Scalars['String']['output']; + /** Peer's connection endpoint */ + endpoint: Scalars['String']['output']; +}; + +export type HttpOutgoingInput = { + /** Auth token to present at the peering Rafiki instance */ + authToken: Scalars['String']['input']; + /** Peer's connection endpoint */ + endpoint: Scalars['String']['input']; +}; + +export type IncomingPayment = BasePayment & Model & { + __typename?: 'IncomingPayment'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Date-time of expiry. After this time, the incoming payment will not accept further payments made to it. */ + expiresAt: Scalars['String']['output']; + /** Incoming Payment id */ + id: Scalars['ID']['output']; + /** The maximum amount that should be paid into the wallet address under this incoming payment. */ + incomingAmount?: Maybe; + /** Available liquidity */ + liquidity?: Maybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: Maybe; + /** The total amount that has been paid into the wallet address under this incoming payment. */ + receivedAmount: Amount; + /** Incoming payment state */ + state: IncomingPaymentState; + /** Id of the wallet address under which this incoming payment was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type IncomingPaymentConnection = { + __typename?: 'IncomingPaymentConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type IncomingPaymentEdge = { + __typename?: 'IncomingPaymentEdge'; + cursor: Scalars['String']['output']; + node: IncomingPayment; +}; + +export type IncomingPaymentResponse = { + __typename?: 'IncomingPaymentResponse'; + code: Scalars['String']['output']; + message?: Maybe; + payment?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export enum IncomingPaymentState { + /** The payment is either auto-completed once the received amount equals the expected `incomingAmount`, or it is completed manually via an API call. */ + Completed = 'COMPLETED', + /** If the payment expires before it is completed then the state will move to EXPIRED and no further payments will be accepted. */ + Expired = 'EXPIRED', + /** The payment has a state of PENDING when it is initially created. */ + Pending = 'PENDING', + /** As soon as payment has started (funds have cleared into the account) the state moves to PROCESSING */ + Processing = 'PROCESSING' +} + +export type Jwk = { + __typename?: 'Jwk'; + /** Cryptographic algorithm family used with the key. The only allowed value is `EdDSA`. */ + alg: Alg; + /** Curve that the key pair is derived from. The only allowed value is `Ed25519`. */ + crv: Crv; + /** Key id */ + kid: Scalars['String']['output']; + /** Key type. The only allowed value is `OKP`. */ + kty: Kty; + /** Base64 url-encoded public key. */ + x: Scalars['String']['output']; +}; + +export type JwkInput = { + /** Cryptographic algorithm family used with the key. The only allowed value is `EdDSA`. */ + alg: Alg; + /** Curve that the key pair is derived from. The only allowed value is `Ed25519`. */ + crv: Crv; + /** Key id */ + kid: Scalars['String']['input']; + /** Key type. The only allowed value is `OKP`. */ + kty: Kty; + /** Base64 url-encoded public key. */ + x: Scalars['String']['input']; +}; + +export enum Kty { + Okp = 'OKP' +} + +export enum LiquidityError { + AlreadyPosted = 'AlreadyPosted', + AlreadyVoided = 'AlreadyVoided', + AmountZero = 'AmountZero', + InsufficientBalance = 'InsufficientBalance', + InvalidId = 'InvalidId', + TransferExists = 'TransferExists', + UnknownAsset = 'UnknownAsset', + UnknownIncomingPayment = 'UnknownIncomingPayment', + UnknownPayment = 'UnknownPayment', + UnknownPeer = 'UnknownPeer', + UnknownTransfer = 'UnknownTransfer', + UnknownWalletAddress = 'UnknownWalletAddress' +} + +export type LiquidityMutationResponse = MutationResponse & { + __typename?: 'LiquidityMutationResponse'; + code: Scalars['String']['output']; + error?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type Model = { + createdAt: Scalars['String']['output']; + id: Scalars['ID']['output']; +}; + +export type Mutation = { + __typename?: 'Mutation'; + /** Create an asset */ + createAsset: AssetMutationResponse; + /** Withdraw asset liquidity */ + createAssetLiquidityWithdrawal?: Maybe; + /** Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. */ + createIncomingPayment: IncomingPaymentResponse; + /** Create a peer using a URL */ + createOrUpdatePeerByUrl: CreateOrUpdatePeerByUrlMutationResponse; + /** Create an Open Payments Outgoing Payment */ + createOutgoingPayment: OutgoingPaymentResponse; + /** Create a peer */ + createPeer: CreatePeerMutationResponse; + /** Withdraw peer liquidity */ + createPeerLiquidityWithdrawal?: Maybe; + /** Create an Open Payments Quote */ + createQuote: QuoteResponse; + /** Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. */ + createReceiver: CreateReceiverResponse; + /** Create a wallet address */ + createWalletAddress: CreateWalletAddressMutationResponse; + /** Add a public key to a wallet address that is used to verify Open Payments requests. */ + createWalletAddressKey?: Maybe; + /** Withdraw liquidity from a wallet address received via Web Monetization. */ + createWalletAddressWithdrawal?: Maybe; + /** Delete a peer */ + deletePeer: DeletePeerMutationResponse; + /** Deposit asset liquidity */ + depositAssetLiquidity?: Maybe; + /** + * Deposit webhook event liquidity + * @deprecated Use `depositOutgoingPaymentLiquidity` + */ + depositEventLiquidity?: Maybe; + /** Deposit outgoing payment liquidity */ + depositOutgoingPaymentLiquidity?: Maybe; + /** Deposit peer liquidity */ + depositPeerLiquidity?: Maybe; + /** Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. */ + postLiquidityWithdrawal?: Maybe; + /** Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. */ + revokeWalletAddressKey?: Maybe; + /** Set the fee on an asset */ + setFee: SetFeeResponse; + /** If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. */ + triggerWalletAddressEvents: TriggerWalletAddressEventsMutationResponse; + /** Update an asset */ + updateAsset: AssetMutationResponse; + /** Update a peer */ + updatePeer: UpdatePeerMutationResponse; + /** Update a wallet address */ + updateWalletAddress: UpdateWalletAddressMutationResponse; + /** Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. */ + voidLiquidityWithdrawal?: Maybe; + /** + * Withdraw webhook event liquidity + * @deprecated Use `withdrawOutgoingPaymentLiquidity, withdrawIncomingPaymentLiquidity, or createWalletAddressWithdrawal` + */ + withdrawEventLiquidity?: Maybe; + /** Withdraw incoming payment liquidity */ + withdrawIncomingPaymentLiquidity?: Maybe; + /** Withdraw outgoing payment liquidity */ + withdrawOutgoingPaymentLiquidity?: Maybe; +}; + + +export type MutationCreateAssetArgs = { + input: CreateAssetInput; +}; + + +export type MutationCreateAssetLiquidityWithdrawalArgs = { + input: CreateAssetLiquidityWithdrawalInput; +}; + + +export type MutationCreateIncomingPaymentArgs = { + input: CreateIncomingPaymentInput; +}; + + +export type MutationCreateOrUpdatePeerByUrlArgs = { + input: CreateOrUpdatePeerByUrlInput; +}; + + +export type MutationCreateOutgoingPaymentArgs = { + input: CreateOutgoingPaymentInput; +}; + + +export type MutationCreatePeerArgs = { + input: CreatePeerInput; +}; + + +export type MutationCreatePeerLiquidityWithdrawalArgs = { + input: CreatePeerLiquidityWithdrawalInput; +}; + + +export type MutationCreateQuoteArgs = { + input: CreateQuoteInput; +}; + + +export type MutationCreateReceiverArgs = { + input: CreateReceiverInput; +}; + + +export type MutationCreateWalletAddressArgs = { + input: CreateWalletAddressInput; +}; + + +export type MutationCreateWalletAddressKeyArgs = { + input: CreateWalletAddressKeyInput; +}; + + +export type MutationCreateWalletAddressWithdrawalArgs = { + input: CreateWalletAddressWithdrawalInput; +}; + + +export type MutationDeletePeerArgs = { + input: DeletePeerInput; +}; + + +export type MutationDepositAssetLiquidityArgs = { + input: DepositAssetLiquidityInput; +}; + + +export type MutationDepositEventLiquidityArgs = { + input: DepositEventLiquidityInput; +}; + + +export type MutationDepositOutgoingPaymentLiquidityArgs = { + input: DepositOutgoingPaymentLiquidityInput; +}; + + +export type MutationDepositPeerLiquidityArgs = { + input: DepositPeerLiquidityInput; +}; + + +export type MutationPostLiquidityWithdrawalArgs = { + input: PostLiquidityWithdrawalInput; +}; + + +export type MutationRevokeWalletAddressKeyArgs = { + input: RevokeWalletAddressKeyInput; +}; + + +export type MutationSetFeeArgs = { + input: SetFeeInput; +}; + + +export type MutationTriggerWalletAddressEventsArgs = { + input: TriggerWalletAddressEventsInput; +}; + + +export type MutationUpdateAssetArgs = { + input: UpdateAssetInput; +}; + + +export type MutationUpdatePeerArgs = { + input: UpdatePeerInput; +}; + + +export type MutationUpdateWalletAddressArgs = { + input: UpdateWalletAddressInput; +}; + + +export type MutationVoidLiquidityWithdrawalArgs = { + input: VoidLiquidityWithdrawalInput; +}; + + +export type MutationWithdrawEventLiquidityArgs = { + input: WithdrawEventLiquidityInput; +}; + + +export type MutationWithdrawIncomingPaymentLiquidityArgs = { + input: WithdrawIncomingPaymentLiquidityInput; +}; + + +export type MutationWithdrawOutgoingPaymentLiquidityArgs = { + input: WithdrawOutgoingPaymentLiquidityInput; +}; + +export type MutationResponse = { + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type OutgoingPayment = BasePayment & Model & { + __typename?: 'OutgoingPayment'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Amount to send (fixed send) */ + debitAmount: Amount; + error?: Maybe; + /** Outgoing payment id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Additional metadata associated with the outgoing payment. */ + metadata?: Maybe; + /** Quote for this outgoing payment */ + quote?: Maybe; + /** Amount to receive (fixed receive) */ + receiveAmount: Amount; + /** Wallet address URL of the receiver */ + receiver: Scalars['String']['output']; + /** Amount already sent */ + sentAmount: Amount; + /** Outgoing payment state */ + state: OutgoingPaymentState; + stateAttempts: Scalars['Int']['output']; + /** Id of the wallet address under which this outgoing payment was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type OutgoingPaymentConnection = { + __typename?: 'OutgoingPaymentConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type OutgoingPaymentEdge = { + __typename?: 'OutgoingPaymentEdge'; + cursor: Scalars['String']['output']; + node: OutgoingPayment; +}; + +export type OutgoingPaymentResponse = { + __typename?: 'OutgoingPaymentResponse'; + code: Scalars['String']['output']; + message?: Maybe; + payment?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export enum OutgoingPaymentState { + /** Successful completion */ + Completed = 'COMPLETED', + /** Payment failed */ + Failed = 'FAILED', + /** Will transition to SENDING once payment funds are reserved */ + Funding = 'FUNDING', + /** Paying, will transition to COMPLETED on success */ + Sending = 'SENDING' +} + +export type PageInfo = { + __typename?: 'PageInfo'; + /** Paginating forwards: the cursor to continue. */ + endCursor?: Maybe; + /** Paginating forwards: Are there more pages? */ + hasNextPage: Scalars['Boolean']['output']; + /** Paginating backwards: Are there more pages? */ + hasPreviousPage: Scalars['Boolean']['output']; + /** Paginating backwards: the cursor to continue. */ + startCursor?: Maybe; +}; + +export type Payment = BasePayment & Model & { + __typename?: 'Payment'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Payment id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Additional metadata associated with the payment. */ + metadata?: Maybe; + /** Either the IncomingPaymentState or OutgoingPaymentState according to type */ + state: Scalars['String']['output']; + /** Type of payment */ + type: PaymentType; + /** Id of the wallet address under which this payment was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type PaymentConnection = { + __typename?: 'PaymentConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type PaymentEdge = { + __typename?: 'PaymentEdge'; + cursor: Scalars['String']['output']; + node: Payment; +}; + +export type PaymentFilter = { + type?: InputMaybe; + walletAddressId?: InputMaybe; +}; + +export enum PaymentType { + Incoming = 'INCOMING', + Outgoing = 'OUTGOING' +} + +export type Peer = Model & { + __typename?: 'Peer'; + /** Asset of peering relationship */ + asset: Asset; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Peering connection details */ + http: Http; + /** Peer id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value */ + liquidityThreshold?: Maybe; + /** Maximum packet amount that the peer accepts */ + maxPacketAmount?: Maybe; + /** Peer's public name */ + name?: Maybe; + /** Peer's ILP address */ + staticIlpAddress: Scalars['String']['output']; +}; + +export type PeerEdge = { + __typename?: 'PeerEdge'; + cursor: Scalars['String']['output']; + node: Peer; +}; + +export type PeersConnection = { + __typename?: 'PeersConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type PostLiquidityWithdrawalInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the liquidity withdrawal to post. */ + withdrawalId: Scalars['String']['input']; +}; + +export type Query = { + __typename?: 'Query'; + /** Fetch an asset */ + asset?: Maybe; + /** Fetch a page of assets. */ + assets: AssetsConnection; + /** Fetch an Open Payments incoming payment */ + incomingPayment?: Maybe; + /** Fetch an Open Payments outgoing payment */ + outgoingPayment?: Maybe; + /** Fetch a page of combined payments */ + payments: PaymentConnection; + /** Fetch a peer */ + peer?: Maybe; + /** Fetch a page of peers. */ + peers: PeersConnection; + /** Fetch an Open Payments quote */ + quote?: Maybe; + /** Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. */ + receiver?: Maybe; + /** Fetch a wallet address */ + walletAddress?: Maybe; + /** Fetch a page of wallet addresses. */ + walletAddresses: WalletAddressesConnection; + /** Fetch a page of webhook events */ + webhookEvents: WebhookEventsConnection; +}; + + +export type QueryAssetArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryAssetsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryIncomingPaymentArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryOutgoingPaymentArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryPaymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + filter?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryPeerArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryPeersArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryQuoteArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryReceiverArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryWalletAddressArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryWalletAddressesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryWebhookEventsArgs = { + after?: InputMaybe; + before?: InputMaybe; + filter?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + +export type Quote = { + __typename?: 'Quote'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Amount to send (fixed send) */ + debitAmount: Amount; + /** Date-time of expiration */ + expiresAt: Scalars['String']['output']; + /** Upper bound of probed exchange rate */ + highEstimatedExchangeRate: Scalars['Float']['output']; + /** Quote id */ + id: Scalars['ID']['output']; + /** Lower bound of probed exchange rate */ + lowEstimatedExchangeRate: Scalars['Float']['output']; + /** Maximum value per packet allowed on the possible routes */ + maxPacketAmount: Scalars['UInt64']['output']; + /** Aggregate exchange rate the payment is guaranteed to meet */ + minExchangeRate: Scalars['Float']['output']; + /** Amount to receive (fixed receive) */ + receiveAmount: Amount; + /** Wallet address URL of the receiver */ + receiver: Scalars['String']['output']; + /** Id of the wallet address under which this quote was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type QuoteConnection = { + __typename?: 'QuoteConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type QuoteEdge = { + __typename?: 'QuoteEdge'; + cursor: Scalars['String']['output']; + node: Quote; +}; + +export type QuoteResponse = { + __typename?: 'QuoteResponse'; + code: Scalars['String']['output']; + message?: Maybe; + quote?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type Receiver = { + __typename?: 'Receiver'; + /** Describes whether the incoming payment has completed receiving funds. */ + completed: Scalars['Boolean']['output']; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Date-time of expiry. After this time, the incoming payment will accept further payments made to it. */ + expiresAt?: Maybe; + /** Incoming payment URL */ + id: Scalars['String']['output']; + /** The maximum amount that should be paid into the wallet address under this incoming payment. */ + incomingAmount?: Maybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: Maybe; + /** The total amount that has been paid into the wallet address under this incoming payment. */ + receivedAmount: Amount; + /** Date-time of last update */ + updatedAt: Scalars['String']['output']; + /** Wallet address URL under which the incoming payment was created */ + walletAddressUrl: Scalars['String']['output']; +}; + +export type RevokeWalletAddressKeyInput = { + /** Internal id of key */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; +}; + +export type RevokeWalletAddressKeyMutationResponse = MutationResponse & { + __typename?: 'RevokeWalletAddressKeyMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddressKey?: Maybe; +}; + +export type SetFeeInput = { + /** Asset id to add the fee to */ + assetId: Scalars['ID']['input']; + /** Fee values */ + fee: FeeDetails; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Type of fee (sending or receiving) */ + type: FeeType; +}; + +export type SetFeeResponse = MutationResponse & { + __typename?: 'SetFeeResponse'; + code: Scalars['String']['output']; + fee?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export enum SortOrder { + /** Choose ascending order for results. */ + Asc = 'ASC', + /** Choose descending order for results. */ + Desc = 'DESC' +} + +export type TransferMutationResponse = MutationResponse & { + __typename?: 'TransferMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type TriggerWalletAddressEventsInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Maximum number of events being triggered (n). */ + limit: Scalars['Int']['input']; +}; + +export type TriggerWalletAddressEventsMutationResponse = MutationResponse & { + __typename?: 'TriggerWalletAddressEventsMutationResponse'; + code: Scalars['String']['output']; + /** Number of events triggered */ + count?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type UpdateAssetInput = { + /** Asset id */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value */ + liquidityThreshold?: InputMaybe; + /** New minimum amount of liquidity that can be withdrawn from the asset */ + withdrawalThreshold?: InputMaybe; +}; + +export type UpdatePeerInput = { + /** New peering connection details */ + http?: InputMaybe; + /** Peer id */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value */ + liquidityThreshold?: InputMaybe; + /** New maximum packet amount that the peer accepts */ + maxPacketAmount?: InputMaybe; + /** Peer's new public name */ + name?: InputMaybe; + /** Peer's new ILP address */ + staticIlpAddress?: InputMaybe; +}; + +export type UpdatePeerMutationResponse = MutationResponse & { + __typename?: 'UpdatePeerMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + peer?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type UpdateWalletAddressInput = { + /** ID of wallet address to update */ + id: Scalars['ID']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** New public name for wallet address */ + publicName?: InputMaybe; + /** New status to set the wallet address to */ + status?: InputMaybe; +}; + +export type UpdateWalletAddressMutationResponse = MutationResponse & { + __typename?: 'UpdateWalletAddressMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddress?: Maybe; +}; + +export type VoidLiquidityWithdrawalInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the liquidity withdrawal to void. */ + withdrawalId: Scalars['String']['input']; +}; + +export type WalletAddress = Model & { + __typename?: 'WalletAddress'; + /** Asset of the wallet address */ + asset: Asset; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Wallet address id */ + id: Scalars['ID']['output']; + /** List of incoming payments received by this wallet address */ + incomingPayments?: Maybe; + /** Available liquidity */ + liquidity?: Maybe; + /** List of outgoing payments sent from this wallet address */ + outgoingPayments?: Maybe; + /** Public name associated with the wallet address */ + publicName?: Maybe; + /** List of quotes created at this wallet address */ + quotes?: Maybe; + /** Status of the wallet address */ + status: WalletAddressStatus; + /** Wallet Address URL */ + url: Scalars['String']['output']; +}; + + +export type WalletAddressIncomingPaymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type WalletAddressOutgoingPaymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type WalletAddressQuotesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + +export type WalletAddressEdge = { + __typename?: 'WalletAddressEdge'; + cursor: Scalars['String']['output']; + node: WalletAddress; +}; + +export type WalletAddressKey = Model & { + __typename?: 'WalletAddressKey'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Internal id of key */ + id: Scalars['ID']['output']; + /** Public key */ + jwk: Jwk; + /** Indicator whether the key has been revoked */ + revoked: Scalars['Boolean']['output']; + /** Id of the wallet address to which this key belongs to */ + walletAddressId: Scalars['ID']['output']; +}; + +export enum WalletAddressStatus { + /** Default status */ + Active = 'ACTIVE', + /** Status after deactivating */ + Inactive = 'INACTIVE' +} + +export type WalletAddressWithdrawal = { + __typename?: 'WalletAddressWithdrawal'; + /** Amount to withdraw */ + amount: Scalars['UInt64']['output']; + /** Withdrawal Id */ + id: Scalars['ID']['output']; + /** Wallet address details */ + walletAddress: WalletAddress; +}; + +export type WalletAddressWithdrawalMutationResponse = MutationResponse & { + __typename?: 'WalletAddressWithdrawalMutationResponse'; + code: Scalars['String']['output']; + error?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + withdrawal?: Maybe; +}; + +export type WalletAddressesConnection = { + __typename?: 'WalletAddressesConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type WebhookEvent = Model & { + __typename?: 'WebhookEvent'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Stringified JSON data */ + data: Scalars['JSONObject']['output']; + /** Event id */ + id: Scalars['ID']['output']; + /** Type of event */ + type: Scalars['String']['output']; +}; + +export type WebhookEventFilter = { + type?: InputMaybe; +}; + +export type WebhookEventsConnection = { + __typename?: 'WebhookEventsConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type WebhookEventsEdge = { + __typename?: 'WebhookEventsEdge'; + cursor: Scalars['String']['output']; + node: WebhookEvent; +}; + +export type WithdrawEventLiquidityInput = { + /** The id of the event to withdraw from. */ + eventId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type WithdrawIncomingPaymentLiquidityInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the incoming payment to withdraw from. */ + incomingPaymentId: Scalars['String']['input']; +}; + +export type WithdrawOutgoingPaymentLiquidityInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the outgoing payment to withdraw from. */ + outgoingPaymentId: Scalars['String']['input']; +}; + + + +export type ResolverTypeWrapper = Promise | T; + + +export type ResolverWithResolve = { + resolve: ResolverFn; +}; +export type Resolver = ResolverFn | ResolverWithResolve; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterable | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + + +/** Mapping of interface types */ +export type ResolversInterfaceTypes> = { + BasePayment: ( Partial ) | ( Partial ) | ( Partial ); + Model: ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ); + MutationResponse: ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ); +}; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + Alg: ResolverTypeWrapper>; + Amount: ResolverTypeWrapper>; + AmountInput: ResolverTypeWrapper>; + Asset: ResolverTypeWrapper>; + AssetEdge: ResolverTypeWrapper>; + AssetMutationResponse: ResolverTypeWrapper>; + AssetsConnection: ResolverTypeWrapper>; + BasePayment: ResolverTypeWrapper['BasePayment']>; + Boolean: ResolverTypeWrapper>; + CreateAssetInput: ResolverTypeWrapper>; + CreateAssetLiquidityWithdrawalInput: ResolverTypeWrapper>; + CreateIncomingPaymentInput: ResolverTypeWrapper>; + CreateOrUpdatePeerByUrlInput: ResolverTypeWrapper>; + CreateOrUpdatePeerByUrlMutationResponse: ResolverTypeWrapper>; + CreateOutgoingPaymentInput: ResolverTypeWrapper>; + CreatePeerInput: ResolverTypeWrapper>; + CreatePeerLiquidityWithdrawalInput: ResolverTypeWrapper>; + CreatePeerMutationResponse: ResolverTypeWrapper>; + CreateQuoteInput: ResolverTypeWrapper>; + CreateReceiverInput: ResolverTypeWrapper>; + CreateReceiverResponse: ResolverTypeWrapper>; + CreateWalletAddressInput: ResolverTypeWrapper>; + CreateWalletAddressKeyInput: ResolverTypeWrapper>; + CreateWalletAddressKeyMutationResponse: ResolverTypeWrapper>; + CreateWalletAddressMutationResponse: ResolverTypeWrapper>; + CreateWalletAddressWithdrawalInput: ResolverTypeWrapper>; + Crv: ResolverTypeWrapper>; + DeletePeerInput: ResolverTypeWrapper>; + DeletePeerMutationResponse: ResolverTypeWrapper>; + DepositAssetLiquidityInput: ResolverTypeWrapper>; + DepositEventLiquidityInput: ResolverTypeWrapper>; + DepositOutgoingPaymentLiquidityInput: ResolverTypeWrapper>; + DepositPeerLiquidityInput: ResolverTypeWrapper>; + Fee: ResolverTypeWrapper>; + FeeDetails: ResolverTypeWrapper>; + FeeEdge: ResolverTypeWrapper>; + FeeType: ResolverTypeWrapper>; + FeesConnection: ResolverTypeWrapper>; + FilterString: ResolverTypeWrapper>; + Float: ResolverTypeWrapper>; + Http: ResolverTypeWrapper>; + HttpIncomingInput: ResolverTypeWrapper>; + HttpInput: ResolverTypeWrapper>; + HttpOutgoing: ResolverTypeWrapper>; + HttpOutgoingInput: ResolverTypeWrapper>; + ID: ResolverTypeWrapper>; + IncomingPayment: ResolverTypeWrapper>; + IncomingPaymentConnection: ResolverTypeWrapper>; + IncomingPaymentEdge: ResolverTypeWrapper>; + IncomingPaymentResponse: ResolverTypeWrapper>; + IncomingPaymentState: ResolverTypeWrapper>; + Int: ResolverTypeWrapper>; + JSONObject: ResolverTypeWrapper>; + Jwk: ResolverTypeWrapper>; + JwkInput: ResolverTypeWrapper>; + Kty: ResolverTypeWrapper>; + LiquidityError: ResolverTypeWrapper>; + LiquidityMutationResponse: ResolverTypeWrapper>; + Model: ResolverTypeWrapper['Model']>; + Mutation: ResolverTypeWrapper<{}>; + MutationResponse: ResolverTypeWrapper['MutationResponse']>; + OutgoingPayment: ResolverTypeWrapper>; + OutgoingPaymentConnection: ResolverTypeWrapper>; + OutgoingPaymentEdge: ResolverTypeWrapper>; + OutgoingPaymentResponse: ResolverTypeWrapper>; + OutgoingPaymentState: ResolverTypeWrapper>; + PageInfo: ResolverTypeWrapper>; + Payment: ResolverTypeWrapper>; + PaymentConnection: ResolverTypeWrapper>; + PaymentEdge: ResolverTypeWrapper>; + PaymentFilter: ResolverTypeWrapper>; + PaymentType: ResolverTypeWrapper>; + Peer: ResolverTypeWrapper>; + PeerEdge: ResolverTypeWrapper>; + PeersConnection: ResolverTypeWrapper>; + PostLiquidityWithdrawalInput: ResolverTypeWrapper>; + Query: ResolverTypeWrapper<{}>; + Quote: ResolverTypeWrapper>; + QuoteConnection: ResolverTypeWrapper>; + QuoteEdge: ResolverTypeWrapper>; + QuoteResponse: ResolverTypeWrapper>; + Receiver: ResolverTypeWrapper>; + RevokeWalletAddressKeyInput: ResolverTypeWrapper>; + RevokeWalletAddressKeyMutationResponse: ResolverTypeWrapper>; + SetFeeInput: ResolverTypeWrapper>; + SetFeeResponse: ResolverTypeWrapper>; + SortOrder: ResolverTypeWrapper>; + String: ResolverTypeWrapper>; + TransferMutationResponse: ResolverTypeWrapper>; + TriggerWalletAddressEventsInput: ResolverTypeWrapper>; + TriggerWalletAddressEventsMutationResponse: ResolverTypeWrapper>; + UInt8: ResolverTypeWrapper>; + UInt64: ResolverTypeWrapper>; + UpdateAssetInput: ResolverTypeWrapper>; + UpdatePeerInput: ResolverTypeWrapper>; + UpdatePeerMutationResponse: ResolverTypeWrapper>; + UpdateWalletAddressInput: ResolverTypeWrapper>; + UpdateWalletAddressMutationResponse: ResolverTypeWrapper>; + VoidLiquidityWithdrawalInput: ResolverTypeWrapper>; + WalletAddress: ResolverTypeWrapper>; + WalletAddressEdge: ResolverTypeWrapper>; + WalletAddressKey: ResolverTypeWrapper>; + WalletAddressStatus: ResolverTypeWrapper>; + WalletAddressWithdrawal: ResolverTypeWrapper>; + WalletAddressWithdrawalMutationResponse: ResolverTypeWrapper>; + WalletAddressesConnection: ResolverTypeWrapper>; + WebhookEvent: ResolverTypeWrapper>; + WebhookEventFilter: ResolverTypeWrapper>; + WebhookEventsConnection: ResolverTypeWrapper>; + WebhookEventsEdge: ResolverTypeWrapper>; + WithdrawEventLiquidityInput: ResolverTypeWrapper>; + WithdrawIncomingPaymentLiquidityInput: ResolverTypeWrapper>; + WithdrawOutgoingPaymentLiquidityInput: ResolverTypeWrapper>; +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + Amount: Partial; + AmountInput: Partial; + Asset: Partial; + AssetEdge: Partial; + AssetMutationResponse: Partial; + AssetsConnection: Partial; + BasePayment: ResolversInterfaceTypes['BasePayment']; + Boolean: Partial; + CreateAssetInput: Partial; + CreateAssetLiquidityWithdrawalInput: Partial; + CreateIncomingPaymentInput: Partial; + CreateOrUpdatePeerByUrlInput: Partial; + CreateOrUpdatePeerByUrlMutationResponse: Partial; + CreateOutgoingPaymentInput: Partial; + CreatePeerInput: Partial; + CreatePeerLiquidityWithdrawalInput: Partial; + CreatePeerMutationResponse: Partial; + CreateQuoteInput: Partial; + CreateReceiverInput: Partial; + CreateReceiverResponse: Partial; + CreateWalletAddressInput: Partial; + CreateWalletAddressKeyInput: Partial; + CreateWalletAddressKeyMutationResponse: Partial; + CreateWalletAddressMutationResponse: Partial; + CreateWalletAddressWithdrawalInput: Partial; + DeletePeerInput: Partial; + DeletePeerMutationResponse: Partial; + DepositAssetLiquidityInput: Partial; + DepositEventLiquidityInput: Partial; + DepositOutgoingPaymentLiquidityInput: Partial; + DepositPeerLiquidityInput: Partial; + Fee: Partial; + FeeDetails: Partial; + FeeEdge: Partial; + FeesConnection: Partial; + FilterString: Partial; + Float: Partial; + Http: Partial; + HttpIncomingInput: Partial; + HttpInput: Partial; + HttpOutgoing: Partial; + HttpOutgoingInput: Partial; + ID: Partial; + IncomingPayment: Partial; + IncomingPaymentConnection: Partial; + IncomingPaymentEdge: Partial; + IncomingPaymentResponse: Partial; + Int: Partial; + JSONObject: Partial; + Jwk: Partial; + JwkInput: Partial; + LiquidityMutationResponse: Partial; + Model: ResolversInterfaceTypes['Model']; + Mutation: {}; + MutationResponse: ResolversInterfaceTypes['MutationResponse']; + OutgoingPayment: Partial; + OutgoingPaymentConnection: Partial; + OutgoingPaymentEdge: Partial; + OutgoingPaymentResponse: Partial; + PageInfo: Partial; + Payment: Partial; + PaymentConnection: Partial; + PaymentEdge: Partial; + PaymentFilter: Partial; + Peer: Partial; + PeerEdge: Partial; + PeersConnection: Partial; + PostLiquidityWithdrawalInput: Partial; + Query: {}; + Quote: Partial; + QuoteConnection: Partial; + QuoteEdge: Partial; + QuoteResponse: Partial; + Receiver: Partial; + RevokeWalletAddressKeyInput: Partial; + RevokeWalletAddressKeyMutationResponse: Partial; + SetFeeInput: Partial; + SetFeeResponse: Partial; + String: Partial; + TransferMutationResponse: Partial; + TriggerWalletAddressEventsInput: Partial; + TriggerWalletAddressEventsMutationResponse: Partial; + UInt8: Partial; + UInt64: Partial; + UpdateAssetInput: Partial; + UpdatePeerInput: Partial; + UpdatePeerMutationResponse: Partial; + UpdateWalletAddressInput: Partial; + UpdateWalletAddressMutationResponse: Partial; + VoidLiquidityWithdrawalInput: Partial; + WalletAddress: Partial; + WalletAddressEdge: Partial; + WalletAddressKey: Partial; + WalletAddressWithdrawal: Partial; + WalletAddressWithdrawalMutationResponse: Partial; + WalletAddressesConnection: Partial; + WebhookEvent: Partial; + WebhookEventFilter: Partial; + WebhookEventsConnection: Partial; + WebhookEventsEdge: Partial; + WithdrawEventLiquidityInput: Partial; + WithdrawIncomingPaymentLiquidityInput: Partial; + WithdrawOutgoingPaymentLiquidityInput: Partial; +}; + +export type AmountResolvers = { + assetCode?: Resolver; + assetScale?: Resolver; + value?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetResolvers = { + code?: Resolver; + createdAt?: Resolver; + fees?: Resolver, ParentType, ContextType, Partial>; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + liquidityThreshold?: Resolver, ParentType, ContextType>; + receivingFee?: Resolver, ParentType, ContextType>; + scale?: Resolver; + sendingFee?: Resolver, ParentType, ContextType>; + withdrawalThreshold?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetMutationResponseResolvers = { + asset?: Resolver, ParentType, ContextType>; + code?: Resolver; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetsConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BasePaymentResolvers = { + __resolveType: TypeResolveFn<'IncomingPayment' | 'OutgoingPayment' | 'Payment', ParentType, ContextType>; + createdAt?: Resolver; + id?: Resolver; + metadata?: Resolver, ParentType, ContextType>; + walletAddressId?: Resolver; +}; + +export type CreateOrUpdatePeerByUrlMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + peer?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreatePeerMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + peer?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateReceiverResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + receiver?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateWalletAddressKeyMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddressKey?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateWalletAddressMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddress?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DeletePeerMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeeResolvers = { + assetId?: Resolver; + basisPoints?: Resolver; + createdAt?: Resolver; + fixed?: Resolver; + id?: Resolver; + type?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeeEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeesConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type HttpResolvers = { + outgoing?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type HttpOutgoingResolvers = { + authToken?: Resolver; + endpoint?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentResolvers = { + createdAt?: Resolver; + expiresAt?: Resolver; + id?: Resolver; + incomingAmount?: Resolver, ParentType, ContextType>; + liquidity?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + receivedAmount?: Resolver; + state?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + payment?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig { + name: 'JSONObject'; +} + +export type JwkResolvers = { + alg?: Resolver; + crv?: Resolver; + kid?: Resolver; + kty?: Resolver; + x?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LiquidityMutationResponseResolvers = { + code?: Resolver; + error?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ModelResolvers = { + __resolveType: TypeResolveFn<'Asset' | 'Fee' | 'IncomingPayment' | 'OutgoingPayment' | 'Payment' | 'Peer' | 'WalletAddress' | 'WalletAddressKey' | 'WebhookEvent', ParentType, ContextType>; + createdAt?: Resolver; + id?: Resolver; +}; + +export type MutationResolvers = { + createAsset?: Resolver>; + createAssetLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + createIncomingPayment?: Resolver>; + createOrUpdatePeerByUrl?: Resolver>; + createOutgoingPayment?: Resolver>; + createPeer?: Resolver>; + createPeerLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + createQuote?: Resolver>; + createReceiver?: Resolver>; + createWalletAddress?: Resolver>; + createWalletAddressKey?: Resolver, ParentType, ContextType, RequireFields>; + createWalletAddressWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + deletePeer?: Resolver>; + depositAssetLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + depositEventLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + depositOutgoingPaymentLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + depositPeerLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + postLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + revokeWalletAddressKey?: Resolver, ParentType, ContextType, RequireFields>; + setFee?: Resolver>; + triggerWalletAddressEvents?: Resolver>; + updateAsset?: Resolver>; + updatePeer?: Resolver>; + updateWalletAddress?: Resolver>; + voidLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + withdrawEventLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + withdrawIncomingPaymentLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + withdrawOutgoingPaymentLiquidity?: Resolver, ParentType, ContextType, RequireFields>; +}; + +export type MutationResponseResolvers = { + __resolveType: TypeResolveFn<'AssetMutationResponse' | 'CreateOrUpdatePeerByUrlMutationResponse' | 'CreatePeerMutationResponse' | 'CreateWalletAddressKeyMutationResponse' | 'CreateWalletAddressMutationResponse' | 'DeletePeerMutationResponse' | 'LiquidityMutationResponse' | 'RevokeWalletAddressKeyMutationResponse' | 'SetFeeResponse' | 'TransferMutationResponse' | 'TriggerWalletAddressEventsMutationResponse' | 'UpdatePeerMutationResponse' | 'UpdateWalletAddressMutationResponse' | 'WalletAddressWithdrawalMutationResponse', ParentType, ContextType>; + code?: Resolver; + message?: Resolver; + success?: Resolver; +}; + +export type OutgoingPaymentResolvers = { + createdAt?: Resolver; + debitAmount?: Resolver; + error?: Resolver, ParentType, ContextType>; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + quote?: Resolver, ParentType, ContextType>; + receiveAmount?: Resolver; + receiver?: Resolver; + sentAmount?: Resolver; + state?: Resolver; + stateAttempts?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OutgoingPaymentConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OutgoingPaymentEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OutgoingPaymentResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + payment?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PageInfoResolvers = { + endCursor?: Resolver, ParentType, ContextType>; + hasNextPage?: Resolver; + hasPreviousPage?: Resolver; + startCursor?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PaymentResolvers = { + createdAt?: Resolver; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + state?: Resolver; + type?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PaymentConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PaymentEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PeerResolvers = { + asset?: Resolver; + createdAt?: Resolver; + http?: Resolver; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + liquidityThreshold?: Resolver, ParentType, ContextType>; + maxPacketAmount?: Resolver, ParentType, ContextType>; + name?: Resolver, ParentType, ContextType>; + staticIlpAddress?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PeerEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PeersConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryResolvers = { + asset?: Resolver, ParentType, ContextType, RequireFields>; + assets?: Resolver>; + incomingPayment?: Resolver, ParentType, ContextType, RequireFields>; + outgoingPayment?: Resolver, ParentType, ContextType, RequireFields>; + payments?: Resolver>; + peer?: Resolver, ParentType, ContextType, RequireFields>; + peers?: Resolver>; + quote?: Resolver, ParentType, ContextType, RequireFields>; + receiver?: Resolver, ParentType, ContextType, RequireFields>; + walletAddress?: Resolver, ParentType, ContextType, RequireFields>; + walletAddresses?: Resolver>; + webhookEvents?: Resolver>; +}; + +export type QuoteResolvers = { + createdAt?: Resolver; + debitAmount?: Resolver; + expiresAt?: Resolver; + highEstimatedExchangeRate?: Resolver; + id?: Resolver; + lowEstimatedExchangeRate?: Resolver; + maxPacketAmount?: Resolver; + minExchangeRate?: Resolver; + receiveAmount?: Resolver; + receiver?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuoteConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuoteEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuoteResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + quote?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ReceiverResolvers = { + completed?: Resolver; + createdAt?: Resolver; + expiresAt?: Resolver, ParentType, ContextType>; + id?: Resolver; + incomingAmount?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + receivedAmount?: Resolver; + updatedAt?: Resolver; + walletAddressUrl?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RevokeWalletAddressKeyMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddressKey?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SetFeeResponseResolvers = { + code?: Resolver; + fee?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransferMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TriggerWalletAddressEventsMutationResponseResolvers = { + code?: Resolver; + count?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface UInt8ScalarConfig extends GraphQLScalarTypeConfig { + name: 'UInt8'; +} + +export interface UInt64ScalarConfig extends GraphQLScalarTypeConfig { + name: 'UInt64'; +} + +export type UpdatePeerMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + peer?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UpdateWalletAddressMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddress?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressResolvers = { + asset?: Resolver; + createdAt?: Resolver; + id?: Resolver; + incomingPayments?: Resolver, ParentType, ContextType, Partial>; + liquidity?: Resolver, ParentType, ContextType>; + outgoingPayments?: Resolver, ParentType, ContextType, Partial>; + publicName?: Resolver, ParentType, ContextType>; + quotes?: Resolver, ParentType, ContextType, Partial>; + status?: Resolver; + url?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressKeyResolvers = { + createdAt?: Resolver; + id?: Resolver; + jwk?: Resolver; + revoked?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressWithdrawalResolvers = { + amount?: Resolver; + id?: Resolver; + walletAddress?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressWithdrawalMutationResponseResolvers = { + code?: Resolver; + error?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + withdrawal?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressesConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookEventResolvers = { + createdAt?: Resolver; + data?: Resolver; + id?: Resolver; + type?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookEventsConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookEventsEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type Resolvers = { + Amount?: AmountResolvers; + Asset?: AssetResolvers; + AssetEdge?: AssetEdgeResolvers; + AssetMutationResponse?: AssetMutationResponseResolvers; + AssetsConnection?: AssetsConnectionResolvers; + BasePayment?: BasePaymentResolvers; + CreateOrUpdatePeerByUrlMutationResponse?: CreateOrUpdatePeerByUrlMutationResponseResolvers; + CreatePeerMutationResponse?: CreatePeerMutationResponseResolvers; + CreateReceiverResponse?: CreateReceiverResponseResolvers; + CreateWalletAddressKeyMutationResponse?: CreateWalletAddressKeyMutationResponseResolvers; + CreateWalletAddressMutationResponse?: CreateWalletAddressMutationResponseResolvers; + DeletePeerMutationResponse?: DeletePeerMutationResponseResolvers; + Fee?: FeeResolvers; + FeeEdge?: FeeEdgeResolvers; + FeesConnection?: FeesConnectionResolvers; + Http?: HttpResolvers; + HttpOutgoing?: HttpOutgoingResolvers; + IncomingPayment?: IncomingPaymentResolvers; + IncomingPaymentConnection?: IncomingPaymentConnectionResolvers; + IncomingPaymentEdge?: IncomingPaymentEdgeResolvers; + IncomingPaymentResponse?: IncomingPaymentResponseResolvers; + JSONObject?: GraphQLScalarType; + Jwk?: JwkResolvers; + LiquidityMutationResponse?: LiquidityMutationResponseResolvers; + Model?: ModelResolvers; + Mutation?: MutationResolvers; + MutationResponse?: MutationResponseResolvers; + OutgoingPayment?: OutgoingPaymentResolvers; + OutgoingPaymentConnection?: OutgoingPaymentConnectionResolvers; + OutgoingPaymentEdge?: OutgoingPaymentEdgeResolvers; + OutgoingPaymentResponse?: OutgoingPaymentResponseResolvers; + PageInfo?: PageInfoResolvers; + Payment?: PaymentResolvers; + PaymentConnection?: PaymentConnectionResolvers; + PaymentEdge?: PaymentEdgeResolvers; + Peer?: PeerResolvers; + PeerEdge?: PeerEdgeResolvers; + PeersConnection?: PeersConnectionResolvers; + Query?: QueryResolvers; + Quote?: QuoteResolvers; + QuoteConnection?: QuoteConnectionResolvers; + QuoteEdge?: QuoteEdgeResolvers; + QuoteResponse?: QuoteResponseResolvers; + Receiver?: ReceiverResolvers; + RevokeWalletAddressKeyMutationResponse?: RevokeWalletAddressKeyMutationResponseResolvers; + SetFeeResponse?: SetFeeResponseResolvers; + TransferMutationResponse?: TransferMutationResponseResolvers; + TriggerWalletAddressEventsMutationResponse?: TriggerWalletAddressEventsMutationResponseResolvers; + UInt8?: GraphQLScalarType; + UInt64?: GraphQLScalarType; + UpdatePeerMutationResponse?: UpdatePeerMutationResponseResolvers; + UpdateWalletAddressMutationResponse?: UpdateWalletAddressMutationResponseResolvers; + WalletAddress?: WalletAddressResolvers; + WalletAddressEdge?: WalletAddressEdgeResolvers; + WalletAddressKey?: WalletAddressKeyResolvers; + WalletAddressWithdrawal?: WalletAddressWithdrawalResolvers; + WalletAddressWithdrawalMutationResponse?: WalletAddressWithdrawalMutationResponseResolvers; + WalletAddressesConnection?: WalletAddressesConnectionResolvers; + WebhookEvent?: WebhookEventResolvers; + WebhookEventsConnection?: WebhookEventsConnectionResolvers; + WebhookEventsEdge?: WebhookEventsEdgeResolvers; +}; + diff --git a/packages/mock-account-servicing-lib/src/index.ts b/packages/mock-account-servicing-lib/src/index.ts new file mode 100644 index 0000000000..82e3151ea7 --- /dev/null +++ b/packages/mock-account-servicing-lib/src/index.ts @@ -0,0 +1,4 @@ +export { Peering, Account, Config } from './types' + +export { AccountProvider } from './AccountProvider' +export { setupFromSeed } from './setupFromSeed' diff --git a/packages/mock-account-servicing-lib/src/requesters.ts b/packages/mock-account-servicing-lib/src/requesters.ts new file mode 100644 index 0000000000..506aa5e074 --- /dev/null +++ b/packages/mock-account-servicing-lib/src/requesters.ts @@ -0,0 +1,476 @@ +import { gql, ApolloClient, NormalizedCacheObject } from '@apollo/client' +import type { + AssetMutationResponse, + CreatePeerMutationResponse, + LiquidityMutationResponse, + WalletAddress, + CreateWalletAddressKeyMutationResponse, + CreateWalletAddressKeyInput, + CreateWalletAddressInput, + JwkInput, + SetFeeResponse, + FeeType, + CreateOrUpdatePeerByUrlMutationResponse, + CreateOrUpdatePeerByUrlInput +} from './generated/graphql' +import { v4 as uuid } from 'uuid' + +export function createRequesters( + apolloClient: ApolloClient, + debug: boolean +): { + createAsset: ( + code: string, + scale: number, + liquidityThreshold: number + ) => Promise + createPeer: ( + staticIlpAddress: string, + outgoingEndpoint: string, + assetId: string, + assetCode: string, + name: string, + liquidityThreshold: number + ) => Promise + createAutoPeer: ( + peerUrl: string, + assetId: string + ) => Promise + depositPeerLiquidity: ( + peerId: string, + amount: string, + transferUid: string + ) => Promise + depositAssetLiquidity: ( + assetId: string, + amount: number, + transferId: string + ) => Promise + createWalletAddress: ( + accountName: string, + accountUrl: string, + assetId: string + ) => Promise + createWalletAddressKey: ({ + walletAddressId, + jwk + }: { + walletAddressId: string + jwk: string + }) => Promise + setFee: ( + assetId: string, + type: FeeType, + fixed: number, + basisPoints: number + ) => Promise +} { + return { + createAsset: (code, scale, liquidityThreshold) => + createAsset(apolloClient, code, scale, liquidityThreshold), + createPeer: ( + staticIlpAddress, + outgoingEndpoint, + assetId, + assetCode, + name, + liquidityThreshold + ) => + createPeer( + apolloClient, + staticIlpAddress, + outgoingEndpoint, + assetId, + assetCode, + name, + liquidityThreshold, + debug + ), + createAutoPeer: (peerUrl, assetId) => + createAutoPeer(apolloClient, peerUrl, assetId, debug), + depositPeerLiquidity: (peerId, amount, transferUid) => + depositPeerLiquidity(apolloClient, peerId, amount, transferUid, debug), + depositAssetLiquidity: (assetId, amount, transferId) => + depositAssetLiquidity(apolloClient, assetId, amount, transferId, debug), + createWalletAddress: (accountName, accountUrl, assetId) => + createWalletAddress( + apolloClient, + accountName, + accountUrl, + assetId, + debug + ), + createWalletAddressKey: ({ walletAddressId, jwk }) => + createWalletAddressKey(apolloClient, { walletAddressId, jwk }, debug), + setFee: (assetId, type, fixed, basisPoints) => + setFee(apolloClient, assetId, type, fixed, basisPoints, debug) + } +} + +export async function createAsset( + apolloClient: ApolloClient, + code: string, + scale: number, + liquidityThreshold: number +): Promise { + const createAssetMutation = gql` + mutation CreateAsset($input: CreateAssetInput!) { + createAsset(input: $input) { + code + success + message + asset { + id + code + scale + liquidityThreshold + } + } + } + ` + const createAssetInput = { + input: { + code, + scale, + liquidityThreshold + } + } + return apolloClient + .mutate({ + mutation: createAssetMutation, + variables: createAssetInput + }) + .then(({ data }): AssetMutationResponse => { + if (!data.createAsset.success) { + throw new Error('Data was empty') + } + return data.createAsset + }) +} + +export async function createPeer( + apolloClient: ApolloClient, + staticIlpAddress: string, + outgoingEndpoint: string, + assetId: string, + assetCode: string, + name: string, + liquidityThreshold: number, + debug: boolean +): Promise { + const createPeerMutation = gql` + mutation CreatePeer($input: CreatePeerInput!) { + createPeer(input: $input) { + code + success + message + peer { + id + } + } + } + ` + const createPeerInput = { + input: { + staticIlpAddress, + http: { + incoming: { authTokens: [`test-${assetCode}`] }, + outgoing: { endpoint: outgoingEndpoint, authToken: `test-${assetCode}` } + }, + assetId, + name, + liquidityThreshold + } + } + return apolloClient + .mutate({ + mutation: createPeerMutation, + variables: createPeerInput + }) + .then(({ data }): CreatePeerMutationResponse => { + if (debug) { + console.log(data) + } + if (!data.createPeer.success) { + throw new Error('Data was empty') + } + return data.createPeer + }) +} + +export async function createAutoPeer( + apolloClient: ApolloClient, + peerUrl: string, + assetId: string, + debug: boolean +): Promise { + const createAutoPeerMutation = gql` + mutation CreateOrUpdatePeerByUrl($input: CreateOrUpdatePeerByUrlInput!) { + createOrUpdatePeerByUrl(input: $input) { + code + success + message + peer { + id + name + asset { + id + scale + code + withdrawalThreshold + } + } + } + } + ` + + const liquidityToDeposit = '10000' as unknown as bigint + const createPeerInput: { input: CreateOrUpdatePeerByUrlInput } = { + input: { + peerUrl, + assetId, + liquidityToDeposit + } + } + return apolloClient + .mutate({ + mutation: createAutoPeerMutation, + variables: createPeerInput + }) + .then(({ data }): CreateOrUpdatePeerByUrlMutationResponse => { + if (!data.createOrUpdatePeerByUrl.success) { + if (debug) { + console.log(data.createOrUpdatePeerByUrl) + } + throw new Error(`Data was empty for assetId: ${assetId}`) + } + return data.createOrUpdatePeerByUrl + }) +} + +export async function depositPeerLiquidity( + apolloClient: ApolloClient, + peerId: string, + amount: string, + transferUid: string, + debug: boolean +): Promise { + const depositPeerLiquidityMutation = gql` + mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { + depositPeerLiquidity(input: $input) { + code + success + message + error + } + } + ` + const depositPeerLiquidityInput = { + input: { + peerId: peerId, + amount: amount, + id: transferUid, + idempotencyKey: uuid() + } + } + return apolloClient + .mutate({ + mutation: depositPeerLiquidityMutation, + variables: depositPeerLiquidityInput + }) + .then(({ data }): LiquidityMutationResponse => { + if (debug) { + console.log(data) + } + if (!data.depositPeerLiquidity.success) { + throw new Error('Data was empty') + } + return data.depositPeerLiquidity + }) +} + +export async function depositAssetLiquidity( + apolloClient: ApolloClient, + assetId: string, + amount: number, + transferId: string, + debug: boolean +): Promise { + const depositAssetLiquidityMutation = gql` + mutation DepositAssetLiquidity($input: DepositAssetLiquidityInput!) { + depositAssetLiquidity(input: $input) { + code + success + message + error + } + } + ` + const depositAssetLiquidityInput = { + input: { + assetId, + amount, + id: transferId, + idempotencyKey: uuid() + } + } + return apolloClient + .mutate({ + mutation: depositAssetLiquidityMutation, + variables: depositAssetLiquidityInput + }) + .then(({ data }): LiquidityMutationResponse => { + if (debug) { + console.log(data) + } + if (!data.depositAssetLiquidity.success) { + throw new Error('Data was empty') + } + return data.depositAssetLiquidity + }) +} + +export async function createWalletAddress( + apolloClient: ApolloClient, + accountName: string, + accountUrl: string, + assetId: string, + debug: boolean +): Promise { + const createWalletAddressMutation = gql` + mutation CreateWalletAddress($input: CreateWalletAddressInput!) { + createWalletAddress(input: $input) { + code + success + message + walletAddress { + id + url + publicName + } + } + } + ` + const createWalletAddressInput: CreateWalletAddressInput = { + assetId, + url: accountUrl, + publicName: accountName + } + + return apolloClient + .mutate({ + mutation: createWalletAddressMutation, + variables: { + input: createWalletAddressInput + } + }) + .then(({ data }) => { + if (debug) { + console.log(data) + } + + if ( + !data.createWalletAddress.success || + !data.createWalletAddress.walletAddress + ) { + throw new Error('Data was empty') + } + + return data.createWalletAddress.walletAddress + }) +} + +export async function createWalletAddressKey( + apolloClient: ApolloClient, + { + walletAddressId, + jwk + }: { + walletAddressId: string + jwk: string + }, + debug: boolean +): Promise { + const createWalletAddressKeyMutation = gql` + mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { + createWalletAddressKey(input: $input) { + code + success + message + } + } + ` + const createWalletAddressKeyInput: CreateWalletAddressKeyInput = { + walletAddressId, + jwk: jwk as unknown as JwkInput + } + + return apolloClient + .mutate({ + mutation: createWalletAddressKeyMutation, + variables: { + input: createWalletAddressKeyInput + } + }) + .then(({ data }): CreateWalletAddressKeyMutationResponse => { + if (debug) { + console.log(data) + } + if (!data.createWalletAddressKey.success) { + throw new Error('Data was empty') + } + return data.createWalletAddressKey + }) +} + +export async function setFee( + apolloClient: ApolloClient, + assetId: string, + type: FeeType, + fixed: number, + basisPoints: number, + debug: boolean +): Promise { + const setFeeMutation = gql` + mutation SetFee($input: SetFeeInput!) { + setFee(input: $input) { + code + success + message + fee { + id + assetId + type + fixed + basisPoints + } + } + } + ` + + const setFeeInput = { + assetId, + type, + fee: { + fixed: String(fixed), + basisPoints + } + } + + return apolloClient + .mutate({ + mutation: setFeeMutation, + variables: { + input: setFeeInput + } + }) + .then(({ data }): SetFeeResponse => { + if (debug) { + console.log(data) + } + if (!data.setFee) { + throw new Error('Data was empty') + } + return data.setFee + }) +} diff --git a/localenv/mock-account-servicing-entity/app/lib/run_seed.server.ts b/packages/mock-account-servicing-lib/src/setupFromSeed.ts similarity index 62% rename from localenv/mock-account-servicing-entity/app/lib/run_seed.server.ts rename to packages/mock-account-servicing-lib/src/setupFromSeed.ts index c98d8107ef..9ce23c0a7f 100644 --- a/localenv/mock-account-servicing-entity/app/lib/run_seed.server.ts +++ b/packages/mock-account-servicing-lib/src/setupFromSeed.ts @@ -1,25 +1,33 @@ -import { - CONFIG, - type Config, - type Account, - type Peering -} from './parse_config.server' -import { - createAsset, - createPeer, - depositPeerLiquidity, - createWalletAddress, - createWalletAddressKey, - setFee, - depositAssetLiquidity, - createAutoPeer -} from './requesters' import { v4 } from 'uuid' -import { mockAccounts } from './accounts.server' +import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { generateJwk } from '@interledger/http-signature-utils' -import { Asset, FeeType } from 'generated/graphql' +import { createRequesters } from './requesters' +import { Config, Account, Peering } from './types' +import { Asset, FeeType } from './generated/graphql' +import { AccountProvider } from './AccountProvider' + +interface SetupFromSeedOptions { + debug?: boolean +} + +export async function setupFromSeed( + config: Config, + apolloClient: ApolloClient, + mockAccounts: AccountProvider, + options: SetupFromSeedOptions = {} +): Promise { + const { debug = false } = options + const { + createAsset, + depositAssetLiquidity, + setFee, + createPeer, + depositPeerLiquidity, + createAutoPeer, + createWalletAddress, + createWalletAddressKey + } = createRequesters(apolloClient, debug) -export async function setupFromSeed(config: Config): Promise { const assets: Record = {} for (const { code, scale, liquidity, liquidityThreshold } of config.seed .assets) { @@ -35,7 +43,9 @@ export async function setupFromSeed(config: Config): Promise { ) assets[code] = asset - console.log(JSON.stringify({ asset, initialLiquidity }, null, 2)) + if (debug) { + console.log(JSON.stringify({ asset, initialLiquidity }, null, 2)) + } const { fees } = config.seed const fee = fees.find((fee) => fee.asset === code && fee.scale == scale) @@ -69,18 +79,26 @@ export async function setupFromSeed(config: Config): Promise { }) ) - console.log(JSON.stringify(peerResponses, null, 2)) + if (debug) { + console.log(JSON.stringify(peerResponses, null, 2)) + } - if (CONFIG.testnetAutoPeerUrl) { - console.log('autopeering url: ', CONFIG.testnetAutoPeerUrl) + if (config.testnetAutoPeerUrl) { + if (debug) { + console.log('autopeering url: ', config.testnetAutoPeerUrl) + } const autoPeerResponse = await createAutoPeer( - CONFIG.testnetAutoPeerUrl, + config.testnetAutoPeerUrl, assets[peeringAsset].id ).catch((e) => { - console.log('error on autopeering: ', e) + if (debug) { + console.log('error on autopeering: ', e) + } return }) - console.log(JSON.stringify(autoPeerResponse, null, 2)) + if (debug) { + console.log(JSON.stringify(autoPeerResponse, null, 2)) + } } // Clear the accounts before seeding. @@ -109,10 +127,12 @@ export async function setupFromSeed(config: Config): Promise { return } - console.log('hostname: ', CONFIG.publicHost) + if (debug) { + console.log('hostname: ', config.publicHost) + } const walletAddress = await createWalletAddress( account.name, - `${CONFIG.publicHost}/${account.path}`, + `${config.publicHost}/${account.path}`, accountAsset.id ) @@ -133,16 +153,15 @@ export async function setupFromSeed(config: Config): Promise { return walletAddress }) ) - console.log('seed complete') - console.log(JSON.stringify(accountResponses, null, 2)) - const hostname = new URL(CONFIG.publicHost).hostname + if (debug) { + console.log('seed complete') + console.log(JSON.stringify(accountResponses, null, 2)) + } + const hostname = new URL(config.publicHost).hostname const envVarStrings = config.seed.accounts.map((account) => { - return `${account.postmanEnvVar}: ${CONFIG.publicHost}/${account.path} hostname: ${hostname}` + return `${account.postmanEnvVar}: ${config.publicHost}/${account.path} hostname: ${hostname}` }) - console.log(envVarStrings.join('\n')) -} - -export async function runSeed(): Promise { - console.log('calling run_seed') - return setupFromSeed(CONFIG) + if (debug) { + console.log(envVarStrings.join('\n')) + } } diff --git a/packages/mock-account-servicing-lib/src/types.ts b/packages/mock-account-servicing-lib/src/types.ts new file mode 100644 index 0000000000..113e569f79 --- /dev/null +++ b/packages/mock-account-servicing-lib/src/types.ts @@ -0,0 +1,58 @@ +import type { KeyObject } from 'crypto' + +interface Self { + graphqlUrl: string + hostname: string + mapHostname: string + openPaymentPublishedPort: number +} + +interface Asset { + code: string + scale: number + liquidity: number + liquidityThreshold: number +} + +export interface Peering { + liquidityThreshold: number + peerUrl: string + peerIlpAddress: string + initialLiquidity: string + name: string +} + +export interface Account { + name: string + id: string + initialBalance: bigint + path: string + postmanEnvVar: string + assetCode: string + skipWalletAddressCreation?: boolean +} + +interface Fee { + fixed: number + basisPoints: number + asset: string + scale: number +} + +interface SeedInstance { + self: Self + assets: Array + peeringAsset: string + peers: Array + accounts: Array + fees: Array + rates: Record> +} + +export interface Config { + seed: SeedInstance + key: KeyObject + publicHost: string + testnetAutoPeerUrl: string + authServerDomain: string +} diff --git a/packages/mock-account-servicing-lib/tsconfig.json b/packages/mock-account-servicing-lib/tsconfig.json new file mode 100644 index 0000000000..bc4252bfc2 --- /dev/null +++ b/packages/mock-account-servicing-lib/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "lib": ["ES2020"], + "outDir": "./dist", + "rootDir": "./src", + "declaration": true + }, + "include": ["src/**/*"], + "exclude": ["**/*.test.ts", "src/test/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 211c6d3740..d6e8825603 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ importers: graphql: specifier: ^16.8.1 version: 16.8.1 + mock-account-servicing-lib: + specifier: workspace:* + version: link:../../packages/mock-account-servicing-lib react: specifier: ^18.2.0 version: 18.2.0 @@ -553,6 +556,28 @@ importers: specifier: ^3.4.1 version: 3.4.1 + packages/mock-account-servicing-lib: + dependencies: + '@interledger/http-signature-utils': + specifier: 2.0.0 + version: 2.0.0 + graphql: + specifier: ^16.8.1 + version: 16.8.1 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@apollo/client': + specifier: ^3.8.10 + version: 3.8.10(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@types/node': + specifier: ^18.7.12 + version: 18.18.5 + '@types/uuid': + specifier: ^9.0.8 + version: 9.0.8 + packages/token-introspection: dependencies: '@interledger/openapi': @@ -577,12 +602,21 @@ importers: test/integration: devDependencies: - jest: - specifier: ^29.7.0 - version: 29.7.0 - testcontainers: - specifier: ^10.6.0 - version: 10.6.0 + '@apollo/client': + specifier: ^3.8.10 + version: 3.8.10(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@interledger/http-signature-utils': + specifier: 2.0.0 + version: 2.0.0 + '@interledger/open-payments': + specifier: ^6.5.0 + version: 6.5.0 + mock-account-servicing-lib: + specifier: workspace:* + version: link:../../packages/mock-account-servicing-lib + yaml: + specifier: ^2.3.4 + version: 2.3.4 packages: @@ -618,7 +652,6 @@ packages: '@types/lodash.clonedeep': 4.5.7 js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 - dev: false /@apollo/cache-control-types@1.0.3(graphql@16.8.1): resolution: {integrity: sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==} @@ -3203,7 +3236,6 @@ packages: httpbis-digest-headers: 1.0.0 jose: 4.13.1 uuid: 9.0.1 - dev: false /@interledger/open-payments@6.0.0: resolution: {integrity: sha512-r9YOtS02ON/B4Jz9lBaLGcfuYGqGVsKEpcBCBADRb1R+IcwizKXl8NOF3nGuqJ8TBK50ENcG2DoBsU7/uqyVhA==} @@ -3233,7 +3265,6 @@ packages: transitivePeerDependencies: - debug - supports-color - dev: false /@interledger/openapi@1.2.1: resolution: {integrity: sha512-CVEMjLH94svT5ikaojplgZ3YlZAe7ml6G6bt0ZCbqkbwHszUwY1E6RexZZejiGju5QvwS/6Jl/Op5ymv/ECaLg==} @@ -3249,7 +3280,6 @@ packages: openapi-types: 12.1.3 transitivePeerDependencies: - supports-color - dev: false /@interledger/pay@0.4.0-alpha.9: resolution: {integrity: sha512-ScT+hsAFBjpSy68VncSa6wW+VidgviKQE9W9lyiOBCrXfnrwrTdycEXWOG9ShoAYXpA3/FG/dYO9eImAPO5Pzg==} @@ -3315,7 +3345,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.6 + '@types/node': 18.18.5 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -3336,14 +3366,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.6 + '@types/node': 18.18.5 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.6) + jest-config: 29.7.0(@types/node@18.18.5) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -3438,7 +3468,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 20.10.6 + '@types/node': 18.18.5 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -3537,7 +3567,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.10.6 + '@types/node': 18.18.5 '@types/yargs': 17.0.11 chalk: 4.1.2 dev: true @@ -3580,7 +3610,6 @@ packages: /@jsdevtools/ono@7.1.3: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: false /@jspm/core@2.0.1: resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} @@ -4511,7 +4540,7 @@ packages: /@types/docker-modem@3.0.6: resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} dependencies: - '@types/node': 20.10.6 + '@types/node': 18.18.5 '@types/ssh2': 0.5.52 dev: true @@ -4519,7 +4548,7 @@ packages: resolution: {integrity: sha512-Lz5J+NFgZS4cEVhquwjIGH4oQwlVn2h7LXD3boitujBnzOE5o7s9H8hchEjoDK2SlRsJTogdKnQeiJgPPKLIEw==} dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 20.10.6 + '@types/node': 18.18.5 dev: true /@types/estree-jsx@1.0.0: @@ -4692,7 +4721,6 @@ packages: resolution: {integrity: sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==} dependencies: '@types/lodash': 4.14.202 - dev: false /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} @@ -4849,13 +4877,13 @@ packages: /@types/ssh2-streams@0.1.9: resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} dependencies: - '@types/node': 20.10.6 + '@types/node': 18.18.5 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 20.10.6 + '@types/node': 18.18.5 '@types/ssh2-streams': 0.1.9 dev: true @@ -6023,7 +6051,6 @@ packages: /base64url@3.0.1: resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} engines: {node: '>=6.0.0'} - dev: false /basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} @@ -6130,17 +6157,6 @@ packages: pako: 0.2.9 dev: true - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001547 - electron-to-chromium: 1.4.553 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - /browserslist@4.22.2: resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -6250,7 +6266,6 @@ packages: dependencies: mime-types: 2.1.35 ylru: 1.3.2 - dev: false /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} @@ -6289,10 +6304,6 @@ packages: engines: {node: '>=14.16'} dev: false - /caniuse-lite@1.0.30001547: - resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} - dev: true - /caniuse-lite@1.0.30001578: resolution: {integrity: sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==} @@ -6691,7 +6702,6 @@ packages: dependencies: depd: 2.0.0 keygrip: 1.1.0 - dev: false /copy-to@2.0.1: resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} @@ -7274,7 +7284,6 @@ packages: /deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - dev: false /deep-equal@2.2.0: resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} @@ -7359,7 +7368,6 @@ packages: /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false /denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} @@ -7541,10 +7549,6 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.553: - resolution: {integrity: sha512-HiRdtyKS2+VhiXvjhMvvxiMC33FJJqTA5EB2YHgFZW6v7HkK4Q9Ahv2V7O2ZPgAjw+MyCJVMQvigj13H8t+wvA==} - dev: true - /electron-to-chromium@1.4.635: resolution: {integrity: sha512-iu/2D0zolKU3iDGXXxdOzNf72Jnokn+K1IN6Kk4iV6l1Tr2g/qy+mvmtfAiBwZe5S3aB5r92vp+zSZ69scYRrg==} @@ -8497,7 +8501,6 @@ packages: /fast-redact@3.1.2: resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} - dev: false /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -9377,7 +9380,6 @@ packages: dependencies: deep-equal: 1.0.1 http-errors: 1.8.1 - dev: false /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -9392,7 +9394,6 @@ packages: setprototypeof: 1.2.0 statuses: 1.5.0 toidentifier: 1.0.1 - dev: false /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -9406,7 +9407,6 @@ packages: /http-message-signatures@0.1.2: resolution: {integrity: sha512-gjJYDgFBy+xnlAs2G0gIWpiorCv9Xi7pIlOnnd91zHAK7BtkLxonmm/JAtd5e6CakOuW03IwEuJzj2YMy8lfWQ==} - dev: false /http-proxy-agent@7.0.0: resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} @@ -9421,7 +9421,6 @@ packages: resolution: {integrity: sha512-RpaFuZD3tG8wtsvjDv1u7O8wAvfpAxS20F3CrFPZOMn+IBb7E7yiqlN5Tks4E5tBEnTdpMOD151rJsUv03sAIg==} dependencies: structured-headers: 0.5.0 - dev: false /https-proxy-agent@7.0.1: resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} @@ -10232,46 +10231,6 @@ packages: - supports-color dev: true - /jest-config@29.7.0(@types/node@20.10.6): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.23.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - babel-jest: 29.7.0(@babel/core@7.23.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.2.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - /jest-diff@26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} @@ -10338,7 +10297,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.5 - '@types/node': 20.10.6 + '@types/node': 18.18.5 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -10546,7 +10505,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.6 + '@types/node': 18.18.5 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.10 @@ -10571,7 +10530,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.6 + '@types/node': 18.18.5 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -10793,7 +10752,6 @@ packages: engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 - dev: false /khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} @@ -10870,7 +10828,6 @@ packages: /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - dev: false /koa-convert@2.0.0: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} @@ -10878,7 +10835,6 @@ packages: dependencies: co: 4.6.0 koa-compose: 4.1.0 - dev: false /koa-session@6.4.0: resolution: {integrity: sha512-h/dxmSOvNEXpHQPRs4TV03TZVFyZIjmYQiTAW5JBFTYBOZ0VdpZ8QEE6Dud75g8z9JNGXi3m++VqRmqToB+c2A==} @@ -10921,7 +10877,6 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: false /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} @@ -11042,7 +10997,6 @@ packages: /lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -12429,10 +12383,6 @@ packages: type-is: 1.6.18 dev: true - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -12707,7 +12657,6 @@ packages: /only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - dev: false /open@8.4.0: resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} @@ -12722,20 +12671,17 @@ packages: resolution: {integrity: sha512-wHKwvEuOWwke5WcQn8pyCTXT5WQ+rm9FpJmDeEVECEBWjEyB/MVLYfXi+UQeSHTTu2Tg4VDHHmzbjOqN6hYeLQ==} dependencies: openapi-types: 12.1.3 - dev: false /openapi-jsonschema-parameters@12.1.3: resolution: {integrity: sha512-aHypKxWHwu2lVqfCIOCZeJA/2NTDiP63aPwuoIC+5ksLK5/IQZ3oKTz7GiaIegz5zFvpMDxDvLR2DMQQSkOAug==} dependencies: openapi-types: 12.1.3 - dev: false /openapi-request-coercer@12.1.3: resolution: {integrity: sha512-CT2ZDhBmAZpHhAzHhEN+/J5oMK3Ds99ayLLdXh2Aw1DCcn72EM8VuIGVwG5fSjvkMsgtn7FgltFosHqeM6PRFQ==} dependencies: openapi-types: 12.1.3 ts-log: 2.2.5 - dev: false /openapi-request-validator@12.1.3: resolution: {integrity: sha512-HW1sG00A9Hp2oS5g8CBvtaKvRAc4h5E4ksmuC5EJgmQ+eAUacL7g+WaYCrC7IfoQaZrjxDfeivNZUye/4D8pwA==} @@ -12746,14 +12692,12 @@ packages: openapi-jsonschema-parameters: 12.1.3 openapi-types: 12.1.3 ts-log: 2.2.5 - dev: false /openapi-response-validator@12.1.3: resolution: {integrity: sha512-beZNb6r1SXAg1835S30h9XwjE596BYzXQFAEZlYAoO2imfxAu5S7TvNFws5k/MMKMCOFTzBXSjapqEvAzlblrQ==} dependencies: ajv: 8.12.0 openapi-types: 12.1.3 - dev: false /openapi-response-validator@9.3.1: resolution: {integrity: sha512-2AOzHAbrwdj5DNL3u+BadhfmL3mlc3mmCv6cSAsEjoMncpOOVd95JyMf0j0XUyJigJ8/ILxnhETfg35vt1pGSQ==} @@ -13246,7 +13190,6 @@ packages: /pino-std-serializers@6.0.0: resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==} - dev: false /pino@8.17.2: resolution: {integrity: sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==} @@ -13263,7 +13206,6 @@ packages: safe-stable-stringify: 2.3.1 sonic-boom: 3.7.0 thread-stream: 2.1.0 - dev: false /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} @@ -13553,7 +13495,6 @@ packages: /process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: false /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} @@ -13702,7 +13643,6 @@ packages: /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -13849,7 +13789,6 @@ packages: /real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - dev: false /rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} @@ -14315,7 +14254,6 @@ packages: /safe-stable-stringify@2.3.1: resolution: {integrity: sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==} engines: {node: '>=10'} - dev: false /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -14721,7 +14659,6 @@ packages: /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - dev: false /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} @@ -14921,7 +14858,6 @@ packages: /structured-headers@0.5.0: resolution: {integrity: sha512-oLnmXSsjhud+LxRJpvokwP8ImEB2wTg8sg30buwfVViKMuluTv3BlOJHUX9VW9pJ2nQOxmx87Z0kB86O4cphag==} - dev: false /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -15142,7 +15078,6 @@ packages: resolution: {integrity: sha512-5+Pf2Ya31CsZyIPYYkhINzdTZ3guL+jHq7D8lkBybgGcSQIKDbid3NJku3SpCKeE/gACWAccDA/rH2B6doC5aA==} dependencies: real-require: 0.2.0 - dev: false /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -15309,7 +15244,6 @@ packages: /ts-log@2.2.5: resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} - dev: false /ts-node@10.9.2(@swc/core@1.3.92)(@types/node@18.18.5)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} @@ -15388,7 +15322,6 @@ packages: /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - dev: false /tsutils@3.21.0(typescript@5.3.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -15733,17 +15666,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -16346,7 +16268,6 @@ packages: /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} - dev: false /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/scripts/run-integration-tests.sh b/scripts/run-integration-tests.sh new file mode 100755 index 0000000000..18fd251995 --- /dev/null +++ b/scripts/run-integration-tests.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +timeout=30 + +pnpm --filter integration testenv:compose down +pnpm --filter integration testenv:compose up -d + +# perform healthcheck until OK, or errors if timeout. +function makeRequest() { + local url="$1" + local start_time=$(date +%s) + + while true; do + response=$(curl -s -o /dev/null -w "%{http_code}" "$url") + + if [ "$response" == "200" ]; then + echo "Health check successful! Response: OK" + break + fi + + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + + if [ "$elapsed_time" -ge "$timeout" ]; then + echo "Timeout reached. Health check failed." + exit 1 + fi + + sleep 1 + done +} + +makeRequest "http://localhost:4000/healthz" + +pnpm --filter integration test diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts new file mode 100644 index 0000000000..aa0f120cc6 --- /dev/null +++ b/test/integration/integration.test.ts @@ -0,0 +1,40 @@ +import { c9Config, hlbConfig } from './lib/config' +import { MockASE } from './lib/MockASE' + +describe('Open Payments Flow', (): void => { + let c9: MockASE + let hlb: MockASE + + beforeAll(async () => { + c9 = await MockASE.create(c9Config) + hlb = await MockASE.create(hlbConfig) + }) + + test('Grant Request Incoming Payment', async (): Promise => { + expect(true).toBe(false) + }) + + // test('Create Incoming Payment', async (): Promise => { + // expect(true).toBe(true) + // }) + + // test('Grant Request Quote', async (): Promise => { + // expect(true).toBe(true) + // }) + + // test('Grant Request Quote', async (): Promise => { + // expect(true).toBe(true) + // }) + + // test('Grant Request Outgoing Payment', async (): Promise => { + // expect(true).toBe(true) + // }) + + // test('Continuation Request', async (): Promise => { + // expect(true).toBe(true) + // }) + + // test('Create Outgoing Payment', async (): Promise => { + // expect(true).toBe(true) + // }) +}) diff --git a/test/integration/jest.config.js b/test/integration/jest.config.js new file mode 100644 index 0000000000..0bb24093cf --- /dev/null +++ b/test/integration/jest.config.js @@ -0,0 +1,15 @@ +'use strict' +// eslint-disable-next-line @typescript-eslint/no-var-requires +const baseConfig = require('../../jest.config.base.js') +// eslint-disable-next-line @typescript-eslint/no-var-requires +const packageName = require('./package.json').name + +module.exports = { + ...baseConfig, + clearMocks: true, + roots: [`/test/${packageName}`], + moduleDirectories: [`node_modules`, `test/${packageName}/node_modules`], + id: packageName, + displayName: packageName, + rootDir: '../..' +} diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts new file mode 100644 index 0000000000..9b0041839d --- /dev/null +++ b/test/integration/lib/MockASE.ts @@ -0,0 +1,36 @@ +import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' +import { createApolloClient } from './apolloClient' +import { TestConfig } from './config' +import { ApolloClient, NormalizedCacheObject } from '@apollo/client' + +export class MockASE { + private config: TestConfig + private apolloClient: ApolloClient + public accounts: AccountProvider + // private opClient: AuthenticatedClient + + // Use .create factory because async construction + public static async create(config: TestConfig) { + const mase = new MockASE(config) + await mase.initAsync() + return mase + } + + // Private to ensure it doesnt get called directly. + // Use static MockASE.create instead. + private constructor(config: TestConfig) { + this.config = config + this.apolloClient = createApolloClient(config.graphqlUrl) + this.accounts = new AccountProvider() + } + + private async initAsync() { + await setupFromSeed(this.config, this.apolloClient, this.accounts) + + // this.opClient = await createAuthenticatedClient({ + // privateKey: this.config.clientPrivateKey, + // keyId: this.config.clientKeyId, + // walletAddressUrl: this.config.clientWalletAddress + // }) + } +} diff --git a/test/integration/lib/apolloClient.ts b/test/integration/lib/apolloClient.ts new file mode 100644 index 0000000000..6ef4647bd8 --- /dev/null +++ b/test/integration/lib/apolloClient.ts @@ -0,0 +1,22 @@ +import type { NormalizedCacheObject } from '@apollo/client' +import { ApolloClient, InMemoryCache } from '@apollo/client' + +export function createApolloClient( + graphqlUrl: string +): ApolloClient { + return new ApolloClient({ + uri: graphqlUrl, + cache: new InMemoryCache(), + defaultOptions: { + query: { + fetchPolicy: 'no-cache' + }, + mutate: { + fetchPolicy: 'no-cache' + }, + watchQuery: { + fetchPolicy: 'no-cache' + } + } + }) +} diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts new file mode 100644 index 0000000000..ee578d64de --- /dev/null +++ b/test/integration/lib/config.ts @@ -0,0 +1,40 @@ +import { parse } from 'yaml' +import { readFileSync } from 'fs' +import { loadOrGenerateKey } from '@interledger/http-signature-utils' +import type { Config } from 'mock-account-servicing-lib' + +import { resolve } from 'path' + +export type TestConfig = Config & { + graphqlUrl: string +} + +export const c9Config: TestConfig = { + seed: parse( + readFileSync( + resolve(__dirname, '../seed.cloud-nine-wallet-test.yml') + ).toString('utf8') + ), + key: loadOrGenerateKey( + resolve(__dirname, '../private-key.cloud-nine-wallet-test.pem') + ), + publicHost: 'https://cloud-nine-wallet-backend-test', + testnetAutoPeerUrl: '', + authServerDomain: 'http://localhost:3006', + graphqlUrl: 'http://localhost:3001/graphql' +} as const + +export const hlbConfig: TestConfig = { + seed: parse( + readFileSync( + resolve(__dirname, '../seed.happy-life-bank-test.yml') + ).toString('utf8') + ), + key: loadOrGenerateKey( + resolve(__dirname, '../private-key.happy-life-bank-test.pem') + ), + publicHost: 'https://happy-life-bank-backend-test', + testnetAutoPeerUrl: '', + authServerDomain: 'http://localhost:3006', + graphqlUrl: 'http://localhost:4001/graphql' +} as const diff --git a/test/integration/package.json b/test/integration/package.json index 29d06bf2ca..3ccdcb75e7 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -5,13 +5,16 @@ "description": "", "scripts": { "testenv:compose": "docker-compose -f docker-compose.cloud-nine-wallet-test.yml -f docker-compose.happy_life_bank_test.yml -f docker-compose.yml", - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { - "jest": "^29.7.0", - "testcontainers": "^10.6.0" + "@apollo/client": "^3.8.10", + "@interledger/http-signature-utils": "2.0.0", + "@interledger/open-payments": "^6.5.0", + "mock-account-servicing-lib": "workspace:*", + "yaml": "^2.3.4" } } diff --git a/test/integration/private-key.cloud-nine-wallet-test.pem b/test/integration/private-key.cloud-nine-wallet-test.pem new file mode 100644 index 0000000000..5814233c8c --- /dev/null +++ b/test/integration/private-key.cloud-nine-wallet-test.pem @@ -0,0 +1,3 @@ +-----BEGIN PRIVATE KEY----- +MC4CAQAwBQYDK2VwBCIEICxfM9mUurUGnwlMMQEDclDEQnX7c49BoGKOB48URBxO +-----END PRIVATE KEY----- diff --git a/test/integration/private-key.happy-life-bank-test.pem b/test/integration/private-key.happy-life-bank-test.pem new file mode 100644 index 0000000000..7fa97c747d --- /dev/null +++ b/test/integration/private-key.happy-life-bank-test.pem @@ -0,0 +1,3 @@ +-----BEGIN PRIVATE KEY----- +MC4CAQAwBQYDK2VwBCIEIEqezmcPhOE8bkwN+jQrppfRYzGIdFTVWQGTHJIKpz88 +-----END PRIVATE KEY----- diff --git a/test/integration/seed.cloud-nine-wallet-test.yml b/test/integration/seed.cloud-nine-wallet-test.yml new file mode 100644 index 0000000000..90ad5a6f60 --- /dev/null +++ b/test/integration/seed.cloud-nine-wallet-test.yml @@ -0,0 +1,80 @@ +self: + graphqlUrl: http://cloud-nine-wallet-test-backend:3001/graphql + mapHostname: 'primary-mase' + openPaymentPublishedPort: 3000 +assets: + - code: USD + scale: 2 + liquidity: 1000000 + liquidityThreshold: 100000 + - code: EUR + scale: 2 + liquidity: 1000000 + liquidityThreshold: 100000 + - code: MXN + scale: 2 + liquidity: 1000000 + liquidityThreshold: 100000 + - code: JPY + scale: 0 + liquidity: 10000 + liquidityThreshold: 1000 +peeringAsset: 'USD' +peers: + - initialLiquidity: '100000' + peerUrl: http://happy-life-bank-test-backend:3002 + peerIlpAddress: test.happy-life-test-bank + liquidityThreshold: 10000 +accounts: + - name: 'Grace Franklin' + path: accounts/gfranklin + id: 742ab7cd-1624-4d2e-af6e-e15a71638669 + initialBalance: 50000 + postmanEnvVar: gfranklinWalletAddress + assetCode: USD + - name: 'Bert Hamchest' + id: a9adbe1a-df31-4766-87c9-d2cb2e636a9b + initialBalance: 50000 + path: accounts/bhamchest + postmanEnvVar: bhamchestWalletAddress + assetCode: USD + - name: "World's Best Donut Co" + id: 5726eefe-8737-459d-a36b-0acce152cb90 + initialBalance: 2000 + path: accounts/wbdc + postmanEnvVar: wbdcWalletAddress + assetCode: USD +rates: + EUR: + MXN: 18.78 + USD: 1.10 + JPY: 157.83 + USD: + MXN: 17.07 + EUR: 0.91 + JPY: 147.71 + MXN: + USD: 0.059 + EUR: 0.054 + JPY: 8.65 + JPY: + USD: 0.007 + EUR: 0.006 + MXN: 0.12 +fees: + - fixed: 100 + basisPoints: 200 + asset: USD + scale: 2 + - fixed: 100 + basisPoints: 200 + asset: EUR + scale: 2 + - fixed: 100 + basisPoints: 200 + asset: MXN + scale: 2 + - fixed: 1 + basisPoints: 200 + asset: JPY + scale: 0 diff --git a/test/integration/seed.happy-life-bank-test.yml b/test/integration/seed.happy-life-bank-test.yml new file mode 100644 index 0000000000..d1befac367 --- /dev/null +++ b/test/integration/seed.happy-life-bank-test.yml @@ -0,0 +1,91 @@ +self: + graphqlUrl: http://happy-life-bank-test-backend:3001/graphql + mapHostname: 'primary-mase' + openPaymentPublishedPort: 4000 +assets: + - code: USD + scale: 2 + liquidity: 1000000 + liquidityThreshold: 100000 + - code: EUR + scale: 2 + liquidity: 1000000 + liquidityThreshold: 100000 + - code: MXN + scale: 2 + liquidity: 1000000 + liquidityThreshold: 100000 + - code: JPY + scale: 0 + liquidity: 10000 + liquidityThreshold: 1000 +peeringAsset: 'USD' +peers: + - initialLiquidity: '1000000000000' + peerUrl: http://cloud-nine-wallet-test-backend:3002 + peerIlpAddress: test.cloud-nine-wallet-test + liquidityThreshold: 100000 +accounts: + - name: 'Philip Fry' + path: accounts/pfry + id: 97a3a431-8ee1-48fc-ac85-70e2f5eba8e5 + initialBalance: 50000 + postmanEnvVar: pfryWalletAddress + assetCode: USD + - name: 'PlanEx Corp' + id: a455cc54-b583-455b-836a-e5275c5c05b7 + initialBalance: 2000 + path: accounts/planex + postmanEnvVar: planexWalletAddress + assetCode: USD + - name: 'Alice Smith' + path: accounts/asmith + id: f47ac10b-58cc-4372-a567-0e02b2c3d479 + initialBalance: 500 + postmanEnvVar: asmithWalletAddress + skipWalletAddressCreation: true + assetCode: USD + - name: 'Lars' + path: accounts/lars + id: fd4ecbc9-205d-4ecd-a030-507d6ce2bde6 + initialBalance: 50000 + assetCode: EUR + - name: 'David' + path: accounts/david + id: 60257507-3191-4507-9d77-9071fd6b3c30 + initialBalance: 150000 + assetCode: MXN +rates: + EUR: + MXN: 18.78 + USD: 1.10 + JPY: 157.83 + USD: + MXN: 17.07 + EUR: 0.91 + JPY: 147.71 + MXN: + USD: 0.059 + EUR: 0.054 + JPY: 8.65 + JPY: + USD: 0.007 + EUR: 0.006 + MXN: 0.12 +fees: + - fixed: 100 + basisPoints: 200 + asset: USD + scale: 2 + - fixed: 100 + basisPoints: 200 + asset: EUR + scale: 2 + - fixed: 100 + basisPoints: 200 + asset: MXN + scale: 2 + - fixed: 1 + basisPoints: 200 + asset: JPY + scale: 0 diff --git a/test/integration/tsconfig.json b/test/integration/tsconfig.json new file mode 100644 index 0000000000..8a45ccad56 --- /dev/null +++ b/test/integration/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "lib": ["ESNext"] + } +} From 71b0257aedc3559109d01d46e796c1f1228a61b7 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:14:02 -0500 Subject: [PATCH 03/53] refactor(localenv,integration): move graphql url to config from seed - moves graphql url to config from seed - also removes self section which only contained unused properties --- localenv/cloud-nine-wallet/docker-compose.yml | 1 + localenv/cloud-nine-wallet/seed.yml | 4 ---- localenv/happy-life-bank/docker-compose.yml | 1 + localenv/happy-life-bank/seed.yml | 4 ---- .../app/lib/apolloClient.ts | 2 +- .../app/lib/parse_config.server.ts | 3 ++- .../mock-account-servicing-entity/seed.example.yml | 4 ---- packages/mock-account-servicing-lib/src/types.ts | 9 +-------- test/integration/lib/MockASE.ts | 13 ++++++++----- test/integration/lib/config.ts | 8 ++------ test/integration/seed.cloud-nine-wallet-test.yml | 4 ---- test/integration/seed.happy-life-bank-test.yml | 4 ---- 12 files changed, 16 insertions(+), 41 deletions(-) diff --git a/localenv/cloud-nine-wallet/docker-compose.yml b/localenv/cloud-nine-wallet/docker-compose.yml index fc8b22641e..9f6ed49ee7 100644 --- a/localenv/cloud-nine-wallet/docker-compose.yml +++ b/localenv/cloud-nine-wallet/docker-compose.yml @@ -19,6 +19,7 @@ services: OPEN_PAYMENTS_URL: ${CLOUD_NINE_OPEN_PAYMENTS_URL:-https://cloud-nine-wallet-backend} AUTH_SERVER_DOMAIN: ${CLOUD_NINE_AUTH_SERVER_DOMAIN:-http://localhost:3006} TESTNET_AUTOPEER_URL: ${TESTNET_AUTOPEER_URL} + GRAPHQL_URL: http://cloud-nine-wallet-backend:3001/graphql volumes: - ../cloud-nine-wallet/seed.yml:/workspace/seed.yml - ../cloud-nine-wallet/private-key.pem:/workspace/private-key.pem diff --git a/localenv/cloud-nine-wallet/seed.yml b/localenv/cloud-nine-wallet/seed.yml index bdf6e825ec..cfc610dcd5 100644 --- a/localenv/cloud-nine-wallet/seed.yml +++ b/localenv/cloud-nine-wallet/seed.yml @@ -1,7 +1,3 @@ -self: - graphqlUrl: http://cloud-nine-wallet-backend:3001/graphql - mapHostname: 'primary-mase' - openPaymentPublishedPort: 3000 assets: - code: USD scale: 2 diff --git a/localenv/happy-life-bank/docker-compose.yml b/localenv/happy-life-bank/docker-compose.yml index e4495d0e07..f9e87bb4f0 100644 --- a/localenv/happy-life-bank/docker-compose.yml +++ b/localenv/happy-life-bank/docker-compose.yml @@ -15,6 +15,7 @@ services: SEED_FILE_LOCATION: /workspace/seed.yml KEY_FILE: /workspace/private-key.pem OPEN_PAYMENTS_URL: ${HAPPY_LIFE_BANK_OPEN_PAYMENTS_URL:-https://happy-life-bank-backend} + GRAPHQL_URL: http://happy-life-bank-backend:3001/graphql volumes: - ../happy-life-bank/seed.yml:/workspace/seed.yml - ../happy-life-bank/private-key.pem:/workspace/private-key.pem diff --git a/localenv/happy-life-bank/seed.yml b/localenv/happy-life-bank/seed.yml index e86869588b..d169ebb7e8 100644 --- a/localenv/happy-life-bank/seed.yml +++ b/localenv/happy-life-bank/seed.yml @@ -1,7 +1,3 @@ -self: - graphqlUrl: http://happy-life-bank-backend:3001/graphql - mapHostname: 'primary-mase' - openPaymentPublishedPort: 4000 assets: - code: USD scale: 2 diff --git a/localenv/mock-account-servicing-entity/app/lib/apolloClient.ts b/localenv/mock-account-servicing-entity/app/lib/apolloClient.ts index 31798241dc..ce74355a32 100644 --- a/localenv/mock-account-servicing-entity/app/lib/apolloClient.ts +++ b/localenv/mock-account-servicing-entity/app/lib/apolloClient.ts @@ -10,7 +10,7 @@ import { CONFIG } from './parse_config.server' import { onError } from '@apollo/client/link/error' const httpLink = createHttpLink({ - uri: CONFIG.seed.self.graphqlUrl + uri: CONFIG.graphqlUrl }) const errorLink = onError(({ graphQLErrors }) => { diff --git a/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts b/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts index 33b2ac1e21..826de08e3c 100644 --- a/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts @@ -12,5 +12,6 @@ export const CONFIG: Config = { key: loadOrGenerateKey(process.env.KEY_FILE), publicHost: process.env.OPEN_PAYMENTS_URL ?? '', testnetAutoPeerUrl: process.env.TESTNET_AUTOPEER_URL ?? '', - authServerDomain: process.env.AUTH_SERVER_DOMAIN || 'http://localhost:3006' + authServerDomain: process.env.AUTH_SERVER_DOMAIN || 'http://localhost:3006', + graphqlUrl: process.env.GRAPHQL_URL ?? '' } diff --git a/localenv/mock-account-servicing-entity/seed.example.yml b/localenv/mock-account-servicing-entity/seed.example.yml index e0a89cee1d..04a18cbbe4 100644 --- a/localenv/mock-account-servicing-entity/seed.example.yml +++ b/localenv/mock-account-servicing-entity/seed.example.yml @@ -1,7 +1,3 @@ -self: - graphqlUrl: http://localhost:3001/graphql - hostname: 'backend' - mapHostname: 'primary-mase' assets: - code: USD scale: 2 diff --git a/packages/mock-account-servicing-lib/src/types.ts b/packages/mock-account-servicing-lib/src/types.ts index 113e569f79..c2d1553375 100644 --- a/packages/mock-account-servicing-lib/src/types.ts +++ b/packages/mock-account-servicing-lib/src/types.ts @@ -1,12 +1,5 @@ import type { KeyObject } from 'crypto' -interface Self { - graphqlUrl: string - hostname: string - mapHostname: string - openPaymentPublishedPort: number -} - interface Asset { code: string scale: number @@ -40,7 +33,6 @@ interface Fee { } interface SeedInstance { - self: Self assets: Array peeringAsset: string peers: Array @@ -55,4 +47,5 @@ export interface Config { publicHost: string testnetAutoPeerUrl: string authServerDomain: string + graphqlUrl: string } diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index 9b0041839d..2f23dc45b2 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -1,16 +1,19 @@ -import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' +import { + AccountProvider, + setupFromSeed, + Config +} from 'mock-account-servicing-lib' import { createApolloClient } from './apolloClient' -import { TestConfig } from './config' import { ApolloClient, NormalizedCacheObject } from '@apollo/client' export class MockASE { - private config: TestConfig + private config: Config private apolloClient: ApolloClient public accounts: AccountProvider // private opClient: AuthenticatedClient // Use .create factory because async construction - public static async create(config: TestConfig) { + public static async create(config: Config) { const mase = new MockASE(config) await mase.initAsync() return mase @@ -18,7 +21,7 @@ export class MockASE { // Private to ensure it doesnt get called directly. // Use static MockASE.create instead. - private constructor(config: TestConfig) { + private constructor(config: Config) { this.config = config this.apolloClient = createApolloClient(config.graphqlUrl) this.accounts = new AccountProvider() diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index ee578d64de..0477eccc1d 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -5,11 +5,7 @@ import type { Config } from 'mock-account-servicing-lib' import { resolve } from 'path' -export type TestConfig = Config & { - graphqlUrl: string -} - -export const c9Config: TestConfig = { +export const c9Config: Config = { seed: parse( readFileSync( resolve(__dirname, '../seed.cloud-nine-wallet-test.yml') @@ -24,7 +20,7 @@ export const c9Config: TestConfig = { graphqlUrl: 'http://localhost:3001/graphql' } as const -export const hlbConfig: TestConfig = { +export const hlbConfig: Config = { seed: parse( readFileSync( resolve(__dirname, '../seed.happy-life-bank-test.yml') diff --git a/test/integration/seed.cloud-nine-wallet-test.yml b/test/integration/seed.cloud-nine-wallet-test.yml index 90ad5a6f60..d79533bcd4 100644 --- a/test/integration/seed.cloud-nine-wallet-test.yml +++ b/test/integration/seed.cloud-nine-wallet-test.yml @@ -1,7 +1,3 @@ -self: - graphqlUrl: http://cloud-nine-wallet-test-backend:3001/graphql - mapHostname: 'primary-mase' - openPaymentPublishedPort: 3000 assets: - code: USD scale: 2 diff --git a/test/integration/seed.happy-life-bank-test.yml b/test/integration/seed.happy-life-bank-test.yml index d1befac367..9d881dbcc8 100644 --- a/test/integration/seed.happy-life-bank-test.yml +++ b/test/integration/seed.happy-life-bank-test.yml @@ -1,7 +1,3 @@ -self: - graphqlUrl: http://happy-life-bank-test-backend:3001/graphql - mapHostname: 'primary-mase' - openPaymentPublishedPort: 4000 assets: - code: USD scale: 2 From ec4fe8fc4fd59971b25ecca3ef53db12aafe589b Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:38:34 -0500 Subject: [PATCH 04/53] refactor: move testenv configuration into new dir --- test/integration/lib/config.ts | 32 +++++++++---------- test/integration/package.json | 2 +- .../cloud-nine-wallet/docker-compose.yml} | 4 +-- .../cloud-nine-wallet/private-key.pem} | 0 .../cloud-nine-wallet/seed.yml} | 0 test/integration/{ => testenv}/dbinit.sql | 0 .../{ => testenv}/docker-compose.yml | 3 +- .../happy-life-bank/docker-compose.yml} | 0 .../happy-life-bank/private-key.pem} | 0 .../happy-life-bank/seed.yml} | 0 10 files changed, 21 insertions(+), 20 deletions(-) rename test/integration/{docker-compose.cloud-nine-wallet-test.yml => testenv/cloud-nine-wallet/docker-compose.yml} (97%) rename test/integration/{private-key.cloud-nine-wallet-test.pem => testenv/cloud-nine-wallet/private-key.pem} (100%) rename test/integration/{seed.cloud-nine-wallet-test.yml => testenv/cloud-nine-wallet/seed.yml} (100%) rename test/integration/{ => testenv}/dbinit.sql (100%) rename test/integration/{ => testenv}/docker-compose.yml (79%) rename test/integration/{docker-compose.happy_life_bank_test.yml => testenv/happy-life-bank/docker-compose.yml} (100%) rename test/integration/{private-key.happy-life-bank-test.pem => testenv/happy-life-bank/private-key.pem} (100%) rename test/integration/{seed.happy-life-bank-test.yml => testenv/happy-life-bank/seed.yml} (100%) diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index 0477eccc1d..93abd5517e 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -5,30 +5,30 @@ import type { Config } from 'mock-account-servicing-lib' import { resolve } from 'path' +const C9_KEY_PATH = resolve( + __dirname, + '../testenv/cloud-nine-wallet/private-key.pem' +) +const C9_SEED_PATH = resolve(__dirname, '../testenv/cloud-nine-wallet/seed.yml') + export const c9Config: Config = { - seed: parse( - readFileSync( - resolve(__dirname, '../seed.cloud-nine-wallet-test.yml') - ).toString('utf8') - ), - key: loadOrGenerateKey( - resolve(__dirname, '../private-key.cloud-nine-wallet-test.pem') - ), + seed: parse(readFileSync(C9_SEED_PATH).toString('utf8')), + key: loadOrGenerateKey(C9_KEY_PATH), publicHost: 'https://cloud-nine-wallet-backend-test', testnetAutoPeerUrl: '', authServerDomain: 'http://localhost:3006', graphqlUrl: 'http://localhost:3001/graphql' } as const +const HLB_KEY_PATH = resolve( + __dirname, + '../testenv/happy-life-bank/private-key.pem' +) +const HLB_SEED_PATH = resolve(__dirname, '../testenv/happy-life-bank/seed.yml') + export const hlbConfig: Config = { - seed: parse( - readFileSync( - resolve(__dirname, '../seed.happy-life-bank-test.yml') - ).toString('utf8') - ), - key: loadOrGenerateKey( - resolve(__dirname, '../private-key.happy-life-bank-test.pem') - ), + seed: parse(readFileSync(HLB_SEED_PATH).toString('utf8')), + key: loadOrGenerateKey(HLB_KEY_PATH), publicHost: 'https://happy-life-bank-backend-test', testnetAutoPeerUrl: '', authServerDomain: 'http://localhost:3006', diff --git a/test/integration/package.json b/test/integration/package.json index 3ccdcb75e7..1b70bb62d3 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "description": "", "scripts": { - "testenv:compose": "docker-compose -f docker-compose.cloud-nine-wallet-test.yml -f docker-compose.happy_life_bank_test.yml -f docker-compose.yml", + "testenv:compose": "docker-compose -f ./testenv/cloud-nine-wallet/docker-compose.yml -f ./testenv/happy-life-bank/docker-compose.yml -f ./testenv/docker-compose.yml", "test": "jest" }, "keywords": [], diff --git a/test/integration/docker-compose.cloud-nine-wallet-test.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml similarity index 97% rename from test/integration/docker-compose.cloud-nine-wallet-test.yml rename to test/integration/testenv/cloud-nine-wallet/docker-compose.yml index f443a7dfba..48a7180ea9 100644 --- a/test/integration/docker-compose.cloud-nine-wallet-test.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -4,7 +4,7 @@ services: hostname: cloud-nine-wallet-test-backend image: rafiki-backend build: - context: ../.. + context: ../../../.. dockerfile: ./packages/backend/Dockerfile restart: always privileged: true @@ -42,7 +42,7 @@ services: hostname: cloud-nine-wallet-test-auth image: rafiki-auth build: - context: ../.. + context: ../../../.. dockerfile: ./packages/auth/Dockerfile restart: always networks: diff --git a/test/integration/private-key.cloud-nine-wallet-test.pem b/test/integration/testenv/cloud-nine-wallet/private-key.pem similarity index 100% rename from test/integration/private-key.cloud-nine-wallet-test.pem rename to test/integration/testenv/cloud-nine-wallet/private-key.pem diff --git a/test/integration/seed.cloud-nine-wallet-test.yml b/test/integration/testenv/cloud-nine-wallet/seed.yml similarity index 100% rename from test/integration/seed.cloud-nine-wallet-test.yml rename to test/integration/testenv/cloud-nine-wallet/seed.yml diff --git a/test/integration/dbinit.sql b/test/integration/testenv/dbinit.sql similarity index 100% rename from test/integration/dbinit.sql rename to test/integration/testenv/dbinit.sql diff --git a/test/integration/docker-compose.yml b/test/integration/testenv/docker-compose.yml similarity index 79% rename from test/integration/docker-compose.yml rename to test/integration/testenv/docker-compose.yml index 3d876fe205..966b92baaf 100644 --- a/test/integration/docker-compose.yml +++ b/test/integration/testenv/docker-compose.yml @@ -16,7 +16,8 @@ services: networks: - rafiki-test volumes: - - ./dbinit.sql:/docker-entrypoint-initdb.d/init.sql + # this path should be relative to the docker-compose file that uses shared-database + - ../dbinit.sql:/docker-entrypoint-initdb.d/init.sql ports: - '5432:5432' environment: diff --git a/test/integration/docker-compose.happy_life_bank_test.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml similarity index 100% rename from test/integration/docker-compose.happy_life_bank_test.yml rename to test/integration/testenv/happy-life-bank/docker-compose.yml diff --git a/test/integration/private-key.happy-life-bank-test.pem b/test/integration/testenv/happy-life-bank/private-key.pem similarity index 100% rename from test/integration/private-key.happy-life-bank-test.pem rename to test/integration/testenv/happy-life-bank/private-key.pem diff --git a/test/integration/seed.happy-life-bank-test.yml b/test/integration/testenv/happy-life-bank/seed.yml similarity index 100% rename from test/integration/seed.happy-life-bank-test.yml rename to test/integration/testenv/happy-life-bank/seed.yml From 5ab8b672571467da05d628e8ae86fcdb855edd93 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:43:37 -0500 Subject: [PATCH 05/53] refactor: cleanup env vars --- pnpm-lock.yaml | 96 +------------------ test/integration/integration.test.ts | 6 +- test/integration/lib/config.ts | 80 ++++++++++------ test/integration/package.json | 1 + .../cloud-nine-wallet/docker-compose.yml | 21 ++-- .../happy-life-bank/docker-compose.yml | 12 +-- 6 files changed, 75 insertions(+), 141 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39c055f516..3a5f5e62b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -521,7 +521,7 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.5.1 - version: 2.5.1(@remix-run/serve@2.5.1)(typescript@5.3.3) + version: 2.5.1(@remix-run/serve@2.5.1)(@types/node@18.11.9)(typescript@5.3.3) '@remix-run/eslint-config': specifier: ^2.5.1 version: 2.5.1(eslint@8.56.0)(jest@29.7.0)(react@18.2.0)(typescript@5.3.3) @@ -611,6 +611,9 @@ importers: '@interledger/open-payments': specifier: ^6.5.0 version: 6.5.0 + dotenv: + specifier: ^16.4.1 + version: 16.4.1 mock-account-servicing-lib: specifier: workspace:* version: link:../../packages/mock-account-servicing-lib @@ -3885,92 +3888,6 @@ packages: dev: false /@remix-run/dev@2.5.1(@remix-run/serve@2.5.1)(@types/node@18.11.9)(typescript@5.3.3): - resolution: {integrity: sha512-IrYhWANubH+WM62Wz55n8NWT5kBqfbyytXDFlP0VoZLrr1IpJf2GtaT4IA+CODMaNoeXeMACOD5Tw5/Y2bO5lA==} - engines: {node: '>=18.0.0'} - hasBin: true - peerDependencies: - '@remix-run/serve': ^2.5.1 - typescript: ^5.1.0 - vite: ^5.0.0 - peerDependenciesMeta: - '@remix-run/serve': - optional: true - typescript: - optional: true - vite: - optional: true - dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.2) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/preset-typescript': 7.21.5(@babel/core@7.23.2) - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - '@mdx-js/mdx': 2.3.0 - '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.5.1(typescript@5.3.3) - '@remix-run/router': 1.14.2 - '@remix-run/serve': 2.5.1(typescript@5.3.3) - '@remix-run/server-runtime': 2.5.1(typescript@5.3.3) - '@types/mdx': 2.0.7 - '@vanilla-extract/integration': 6.2.1(@types/node@18.11.9) - arg: 5.0.2 - cacache: 17.1.4 - chalk: 4.1.2 - chokidar: 3.5.3 - cross-spawn: 7.0.3 - dotenv: 16.3.1 - es-module-lexer: 1.4.1 - esbuild: 0.17.6 - esbuild-plugins-node-modules-polyfill: 1.6.1(esbuild@0.17.6) - execa: 5.1.1 - exit-hook: 2.2.1 - express: 4.18.1 - fs-extra: 10.1.0 - get-port: 5.1.1 - gunzip-maybe: 1.4.2 - jsesc: 3.0.2 - json5: 2.2.3 - lodash: 4.17.21 - lodash.debounce: 4.0.8 - minimatch: 9.0.3 - ora: 5.4.1 - picocolors: 1.0.0 - picomatch: 2.3.1 - pidtree: 0.6.0 - postcss: 8.4.30 - postcss-discard-duplicates: 5.1.0(postcss@8.4.30) - postcss-load-config: 4.0.1(postcss@8.4.30) - postcss-modules: 6.0.0(postcss@8.4.30) - prettier: 2.8.8 - pretty-ms: 7.0.1 - react-refresh: 0.14.0 - remark-frontmatter: 4.0.1 - remark-mdx-frontmatter: 1.1.1 - semver: 7.5.4 - set-cookie-parser: 2.6.0 - tar-fs: 2.1.1 - tsconfig-paths: 4.1.0 - typescript: 5.3.3 - ws: 7.5.9 - transitivePeerDependencies: - - '@types/node' - - bluebird - - bufferutil - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - ts-node - - utf-8-validate - dev: true - - /@remix-run/dev@2.5.1(@remix-run/serve@2.5.1)(typescript@5.3.3): resolution: {integrity: sha512-IrYhWANubH+WM62Wz55n8NWT5kBqfbyytXDFlP0VoZLrr1IpJf2GtaT4IA+CODMaNoeXeMACOD5Tw5/Y2bO5lA==} engines: {node: '>=18.0.0'} hasBin: true @@ -7514,11 +7431,6 @@ packages: no-case: 3.0.4 tslib: 2.5.0 - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - /dotenv@16.4.1: resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} engines: {node: '>=12'} diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index aa0f120cc6..7fb4b42bf7 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -1,4 +1,4 @@ -import { c9Config, hlbConfig } from './lib/config' +import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' describe('Open Payments Flow', (): void => { @@ -6,8 +6,8 @@ describe('Open Payments Flow', (): void => { let hlb: MockASE beforeAll(async () => { - c9 = await MockASE.create(c9Config) - hlb = await MockASE.create(hlbConfig) + c9 = await MockASE.create(C9_CONFIG) + hlb = await MockASE.create(HLB_CONFIG) }) test('Grant Request Incoming Payment', async (): Promise => { diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index 93abd5517e..3972ded929 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -2,35 +2,61 @@ import { parse } from 'yaml' import { readFileSync } from 'fs' import { loadOrGenerateKey } from '@interledger/http-signature-utils' import type { Config } from 'mock-account-servicing-lib' +import { parse as envParse } from 'dotenv' import { resolve } from 'path' -const C9_KEY_PATH = resolve( - __dirname, - '../testenv/cloud-nine-wallet/private-key.pem' -) -const C9_SEED_PATH = resolve(__dirname, '../testenv/cloud-nine-wallet/seed.yml') - -export const c9Config: Config = { - seed: parse(readFileSync(C9_SEED_PATH).toString('utf8')), - key: loadOrGenerateKey(C9_KEY_PATH), - publicHost: 'https://cloud-nine-wallet-backend-test', - testnetAutoPeerUrl: '', - authServerDomain: 'http://localhost:3006', +type EnvConfig = { + OPEN_PAYMENTS_URL: string + AUTH_SERVER_DOMAIN: string +} + +const loadEnv = (filePath: string): EnvConfig => { + const fileContent = readFileSync(filePath) + const envVars = envParse(fileContent) + + const requiredKeys: (keyof EnvConfig)[] = [ + 'OPEN_PAYMENTS_URL', + 'AUTH_SERVER_DOMAIN' + ] + + const missingKeys: string[] = [] + requiredKeys.forEach((key) => { + if (!envVars[key]) { + missingKeys.push(key) + } + }) + + if (missingKeys.length > 0) { + const errorMessage = `Missing required environment variable(s): ${missingKeys.join(', ')}` + throw new Error(errorMessage) + } + + return envVars as EnvConfig +} + +type ConfigOptions = { + graphqlUrl: string +} + +const createConfig = (name: string, opts: ConfigOptions): Config => { + const keyPath = resolve(__dirname, `../testenv/${name}/private-key.pem`) + const seedPath = resolve(__dirname, `../testenv/${name}/seed.yml`) + const env = loadEnv(resolve(__dirname, `../testenv/${name}/.env`)) + + return { + seed: parse(readFileSync(seedPath).toString('utf8')), + key: loadOrGenerateKey(keyPath), + publicHost: env.OPEN_PAYMENTS_URL, + testnetAutoPeerUrl: '', + authServerDomain: env.AUTH_SERVER_DOMAIN, + ...opts + } as const +} + +export const C9_CONFIG: Config = createConfig('cloud-nine-wallet', { graphqlUrl: 'http://localhost:3001/graphql' -} as const - -const HLB_KEY_PATH = resolve( - __dirname, - '../testenv/happy-life-bank/private-key.pem' -) -const HLB_SEED_PATH = resolve(__dirname, '../testenv/happy-life-bank/seed.yml') - -export const hlbConfig: Config = { - seed: parse(readFileSync(HLB_SEED_PATH).toString('utf8')), - key: loadOrGenerateKey(HLB_KEY_PATH), - publicHost: 'https://happy-life-bank-backend-test', - testnetAutoPeerUrl: '', - authServerDomain: 'http://localhost:3006', +}) +export const HLB_CONFIG: Config = createConfig('happy-life-bank', { graphqlUrl: 'http://localhost:4001/graphql' -} as const +}) diff --git a/test/integration/package.json b/test/integration/package.json index 1b70bb62d3..e33aee8e2e 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -14,6 +14,7 @@ "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.0", "@interledger/open-payments": "^6.5.0", + "dotenv": "^16.4.1", "mock-account-servicing-lib": "workspace:*", "yaml": "^2.3.4" } diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 48a7180ea9..727c94d238 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -14,27 +14,21 @@ services: - '3002:3002' networks: - rafiki-test + # use .env file for env vars common to test config + env_file: + - .env environment: NODE_ENV: ${NODE_ENV:-development} - TRUST_PROXY: ${TRUST_PROXY} - LOG_LEVEL: debug ADMIN_PORT: 3001 - CONNECTOR_PORT: 3002 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend - USE_TIGERBEETLE: ${USE_TIGERBEETLE-false} - TIGERBEETLE_CLUSTER_ID: ${TIGERBEETLE_CLUSTER_ID-0} - TIGERBEETLE_REPLICA_ADDRESSES: ${TIGERBEETLE_REPLICA_ADDRESSES-''} - AUTH_SERVER_GRANT_URL: ${CLOUD_NINE_WALLET_TEST_AUTH_SERVER_DOMAIN:-http://cloud-nine-wallet-test-auth:3006} + AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 ILP_ADDRESS: ${ILP_ADDRESS:-test.cloud-nine-wallet-test} - STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - OPEN_PAYMENTS_URL: ${CLOUD_NINE_WALLET_TEST_OPEN_PAYMENTS_URL:-http://cloud-nine-wallet-test-backend} + STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://cloud-nine-wallet-test/webhooks EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates REDIS_URL: redis://shared-redis:6379/0 - WALLET_ADDRESS_URL: ${CLOUD_NINE_WALLET_TEST_WALLET_ADDRESS_URL:-https://cloud-nine-wallet-test/.well-known/pay} - ILP_CONNECTOR_ADDRESS: ${CLOUD_NINE_WALLET_TEST_CONNECTOR_URL} depends_on: - shared-database - shared-redis @@ -50,10 +44,11 @@ services: ports: - '3003:3003' - '3006:3006' + # use .env file for env vars common to test config + env_file: + - .env environment: NODE_ENV: ${NODE_ENV:-development} - TRUST_PROXY: ${TRUST_PROXY} AUTH_DATABASE_URL: postgresql://cloud_nine_wallet_test_auth:cloud_nine_wallet_test_auth@shared-database/cloud_nine_wallet_test_auth - AUTH_SERVER_DOMAIN: ${CLOUD_NINE_WALLET_TEST_AUTH_SERVER_DOMAIN:-http://localhost:3006} depends_on: - shared-database \ No newline at end of file diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index ff153b7e2a..eb374cb6e7 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -11,6 +11,9 @@ services: - "4001:3001" networks: - rafiki-test + # use .env file for env vars common to test config + env_file: + - .env environment: NODE_ENV: development LOG_LEVEL: debug @@ -18,18 +21,13 @@ services: CONNECTOR_PORT: 3002 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://happy_life_bank_test_backend:happy_life_bank_test_backend@shared-database/happy_life_bank_test_backend - USE_TIGERBEETLE: ${USE_TIGERBEETLE-false} - TIGERBEETLE_CLUSTER_ID: ${TIGERBEETLE_CLUSTER_ID-0} - TIGERBEETLE_REPLICA_ADDRESSES: ${TIGERBEETLE_REPLICA_ADDRESSES-''} AUTH_SERVER_GRANT_URL: ${HAPPY_LIFE_BANK_TEST_AUTH_SERVER_DOMAIN:-http://happy-life-bank-test-auth:3006} AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://happy-life-bank-test/webhooks - OPEN_PAYMENTS_URL: ${HAPPY_LIFE_BANK_TEST_OPEN_PAYMENTS_URL:-http://happy-life-bank-test} EXCHANGE_RATES_URL: http://happy-life-bank-test/rates REDIS_URL: redis://shared-redis:6379/1 - WALLET_ADDRESS_URL: ${HAPPY_LIFE_BANK_TEST_WALLET_ADDRESS_URL:-https://happy-life-bank-test/.well-known/pay} depends_on: - cloud-nine-wallet-test-backend happy-life-auth: @@ -42,9 +40,11 @@ services: ports: - '4003:3003' - '4006:3006' + # use .env file for env vars common to test config + env_file: + - .env environment: NODE_ENV: development AUTH_DATABASE_URL: postgresql://happy_life_bank_test_auth:happy_life_bank_test_auth@shared-database/happy_life_bank_test_auth - AUTH_SERVER_DOMAIN: ${HAPPY_LIFE_BANK_TEST_AUTH_SERVER_DOMAIN:-http://localhost:4006} depends_on: - cloud-nine-wallet-test-auth \ No newline at end of file From b64d369e7abeec7d2e2b0fc2926a84d7859631f9 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:39:19 -0500 Subject: [PATCH 06/53] feat: add webhook server, fix env vars --- pnpm-lock.yaml | 18 +++++--- test/integration/integration.test.ts | 10 ++++ test/integration/lib/MockASE.ts | 38 +++++++++------ test/integration/lib/WebhookServer.ts | 46 +++++++++++++++++++ test/integration/lib/config.ts | 34 ++++++++++---- test/integration/package.json | 4 ++ .../cloud-nine-wallet/docker-compose.yml | 21 +++++++-- .../happy-life-bank/docker-compose.yml | 21 +++++++-- 8 files changed, 154 insertions(+), 38 deletions(-) create mode 100644 test/integration/lib/WebhookServer.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a5f5e62b8..362c0eb0a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -611,9 +611,21 @@ importers: '@interledger/open-payments': specifier: ^6.5.0 version: 6.5.0 + '@types/koa': + specifier: 2.14.0 + version: 2.14.0 + '@types/koa-bodyparser': + specifier: ^4.3.12 + version: 4.3.12 dotenv: specifier: ^16.4.1 version: 16.4.1 + koa: + specifier: ^2.15.0 + version: 2.15.0 + koa-bodyparser: + specifier: ^4.4.1 + version: 4.4.1 mock-account-servicing-lib: specifier: workspace:* version: link:../../packages/mock-account-servicing-lib @@ -6431,7 +6443,6 @@ packages: qs: 6.11.0 raw-body: 2.5.2 type-is: 1.6.18 - dev: false /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -6626,7 +6637,6 @@ packages: /copy-to@2.0.1: resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} - dev: false /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -9478,7 +9488,6 @@ packages: /inflation@2.0.0: resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} engines: {node: '>= 0.8.0'} - dev: false /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -10725,7 +10734,6 @@ packages: co-body: 6.1.0 copy-to: 2.0.1 type-is: 1.6.18 - dev: false /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} @@ -13489,7 +13497,6 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - dev: false /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -13525,7 +13532,6 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: false /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 7fb4b42bf7..3a70e01c7b 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -8,6 +8,16 @@ describe('Open Payments Flow', (): void => { beforeAll(async () => { c9 = await MockASE.create(C9_CONFIG) hlb = await MockASE.create(HLB_CONFIG) + + const walletAddressGet = await c9.opClient.walletAddress.get({ + url: 'http://localhost:4000/accounts/pfry' + }) + console.log({ walletAddressGet }) + }) + + afterAll(async () => { + c9.shutdown() + hlb.shutdown() }) test('Grant Request Incoming Payment', async (): Promise => { diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index 2f23dc45b2..72095ae3ba 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -1,19 +1,23 @@ +import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { - AccountProvider, - setupFromSeed, - Config -} from 'mock-account-servicing-lib' + AuthenticatedClient, + createAuthenticatedClient +} from '@interledger/open-payments' +import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' import { createApolloClient } from './apolloClient' -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' +import { WebhookServer } from './WebhookServer' +import { TestConfig } from './config' +/** Mock Account Servicing Entity */ export class MockASE { - private config: Config + private config: TestConfig private apolloClient: ApolloClient public accounts: AccountProvider - // private opClient: AuthenticatedClient + public opClient!: AuthenticatedClient + private webhookServer: WebhookServer // Use .create factory because async construction - public static async create(config: Config) { + public static async create(config: TestConfig) { const mase = new MockASE(config) await mase.initAsync() return mase @@ -21,19 +25,25 @@ export class MockASE { // Private to ensure it doesnt get called directly. // Use static MockASE.create instead. - private constructor(config: Config) { + private constructor(config: TestConfig) { this.config = config this.apolloClient = createApolloClient(config.graphqlUrl) this.accounts = new AccountProvider() + this.webhookServer = new WebhookServer() + this.webhookServer.start(this.config.webhookServerPort) } private async initAsync() { await setupFromSeed(this.config, this.apolloClient, this.accounts) - // this.opClient = await createAuthenticatedClient({ - // privateKey: this.config.clientPrivateKey, - // keyId: this.config.clientKeyId, - // walletAddressUrl: this.config.clientWalletAddress - // }) + this.opClient = await createAuthenticatedClient({ + privateKey: this.config.key, + keyId: this.config.keyId, + walletAddressUrl: this.config.walletAddressUrl + }) + } + + public async shutdown() { + await this.webhookServer.close() } } diff --git a/test/integration/lib/WebhookServer.ts b/test/integration/lib/WebhookServer.ts new file mode 100644 index 0000000000..95f4dd2aa1 --- /dev/null +++ b/test/integration/lib/WebhookServer.ts @@ -0,0 +1,46 @@ +import Koa from 'koa' +import bodyParser from 'koa-bodyparser' +import http from 'http' + +export class WebhookServer { + private app: Koa + private server?: http.Server + + constructor() { + this.app = new Koa() + this.app.use(bodyParser()) + } + + public start(port: number): void { + this.app.use(async (ctx) => { + // if (ctx.path === '/webhook' && ctx.method === 'POST') { + // console.log('Received webhook payload:', ctx.request.body) + // ctx.status = 200 + // ctx.body = 'Webhook received successfully!' + // } + if (ctx.path === '/webhook') { + console.log('Received webhook payload:', ctx.request.body) + ctx.status = 200 + ctx.body = 'Webhook received successfully!' + } + }) + + this.server = this.app.listen(port, () => { + console.log(`Webhook server listening on port ${port}`) + }) + } + + public async close(): Promise { + return new Promise((resolve, reject) => { + if (!this.server) return resolve() + + this.server.close((err) => { + if (err) { + reject(err) + } + + resolve() + }) + }) + } +} diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index 3972ded929..84e29b6fc9 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -6,22 +6,33 @@ import { parse as envParse } from 'dotenv' import { resolve } from 'path' +export type TestConfig = Config & { + webhookServerPort: number + walletAddressUrl: string + keyId: string +} + type EnvConfig = { OPEN_PAYMENTS_URL: string AUTH_SERVER_DOMAIN: string + WEBHOOK_SERVER_PORT: string + WALLET_ADDRESS_URL: string + KEY_ID: string } +const REQUIRED_KEYS: (keyof EnvConfig)[] = [ + 'OPEN_PAYMENTS_URL', + 'AUTH_SERVER_DOMAIN', + 'WEBHOOK_SERVER_PORT', + 'WALLET_ADDRESS_URL', + 'KEY_ID' +] const loadEnv = (filePath: string): EnvConfig => { const fileContent = readFileSync(filePath) const envVars = envParse(fileContent) - const requiredKeys: (keyof EnvConfig)[] = [ - 'OPEN_PAYMENTS_URL', - 'AUTH_SERVER_DOMAIN' - ] - const missingKeys: string[] = [] - requiredKeys.forEach((key) => { + REQUIRED_KEYS.forEach((key) => { if (!envVars[key]) { missingKeys.push(key) } @@ -39,7 +50,7 @@ type ConfigOptions = { graphqlUrl: string } -const createConfig = (name: string, opts: ConfigOptions): Config => { +const createConfig = (name: string, opts: ConfigOptions): TestConfig => { const keyPath = resolve(__dirname, `../testenv/${name}/private-key.pem`) const seedPath = resolve(__dirname, `../testenv/${name}/seed.yml`) const env = loadEnv(resolve(__dirname, `../testenv/${name}/.env`)) @@ -50,13 +61,16 @@ const createConfig = (name: string, opts: ConfigOptions): Config => { publicHost: env.OPEN_PAYMENTS_URL, testnetAutoPeerUrl: '', authServerDomain: env.AUTH_SERVER_DOMAIN, + webhookServerPort: parseInt(env.WEBHOOK_SERVER_PORT), + walletAddressUrl: env.WALLET_ADDRESS_URL, + keyId: env.KEY_ID, ...opts - } as const + } } -export const C9_CONFIG: Config = createConfig('cloud-nine-wallet', { +export const C9_CONFIG: TestConfig = createConfig('cloud-nine-wallet', { graphqlUrl: 'http://localhost:3001/graphql' }) -export const HLB_CONFIG: Config = createConfig('happy-life-bank', { +export const HLB_CONFIG: TestConfig = createConfig('happy-life-bank', { graphqlUrl: 'http://localhost:4001/graphql' }) diff --git a/test/integration/package.json b/test/integration/package.json index e33aee8e2e..134adbb94e 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -14,7 +14,11 @@ "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.0", "@interledger/open-payments": "^6.5.0", + "@types/koa": "2.14.0", + "@types/koa-bodyparser": "^4.3.12", "dotenv": "^16.4.1", + "koa": "^2.15.0", + "koa-bodyparser": "^4.4.1", "mock-account-servicing-lib": "workspace:*", "yaml": "^2.3.4" } diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 727c94d238..630aa5c321 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -24,10 +24,23 @@ services: DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 - ILP_ADDRESS: ${ILP_ADDRESS:-test.cloud-nine-wallet-test} - STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - WEBHOOK_URL: http://cloud-nine-wallet-test/webhooks - EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates + ILP_ADDRESS: test.cloud-nine-wallet-test + STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= + + # TODO: figure out right url. localhost will probably be wrong (relative to container im guessing) + # WEBHOOK_URL: http://localhost:${WEBHOOK_SERVER_PORT}/webhooks + + # Maybe this will work? + WEBHOOK_URL: http://host.docker.internal:${WEBHOOK_SERVER_PORT}/webhooks + + # Or this? (set as env var soemwhere) + # WEBHOOK_URL=http://:8888/webhooks + + # Original (assumes there is some cloud-nine-wallet-test, which there isnt): + # WEBHOOK_URL: http://cloud-nine-wallet-test/webhooks + + # TODO: should point to the integration ASE, similar to webhook url + # EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates REDIS_URL: redis://shared-redis:6379/0 depends_on: - shared-database diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index eb374cb6e7..05925cb160 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -1,7 +1,7 @@ name: happy-life-bank-test services: - happy-life-bank-test: - hostname: happy-life-bank-test + happy-life-bank-test-backend: + hostname: happy-life-bank-test-backend image: rafiki-backend pull_policy: never restart: always @@ -21,11 +21,24 @@ services: CONNECTOR_PORT: 3002 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://happy_life_bank_test_backend:happy_life_bank_test_backend@shared-database/happy_life_bank_test_backend - AUTH_SERVER_GRANT_URL: ${HAPPY_LIFE_BANK_TEST_AUTH_SERVER_DOMAIN:-http://happy-life-bank-test-auth:3006} + AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:3006 AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - WEBHOOK_URL: http://happy-life-bank-test/webhooks + + # TODO: figure out right url. localhost will probably be wrong (relative to container im guessing) + # WEBHOOK_URL: http://localhost:${WEBHOOK_SERVER_PORT}/webhooks + + # Maybe this will work? + WEBHOOK_URL: http://host.docker.internal:${WEBHOOK_SERVER_PORT}/webhooks + + # Or this? (set as env var soemwhere). looks like thats what above does though. + # WEBHOOK_URL=http://:8888/webhooks + + # Original (assumes there is some cloud-nine-wallet-test, which there isnt because the server is on localhost): + # WEBHOOK_URL: http://happy-life-bank-test/webhooks + + # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://happy-life-bank-test/rates REDIS_URL: redis://shared-redis:6379/1 depends_on: From b95aff86ff1468769b9448ce260ed1621d722141 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:39:34 -0500 Subject: [PATCH 07/53] chore: comment --- test/integration/testenv/cloud-nine-wallet/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 630aa5c321..9674ddb2fa 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -40,7 +40,7 @@ services: # WEBHOOK_URL: http://cloud-nine-wallet-test/webhooks # TODO: should point to the integration ASE, similar to webhook url - # EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates + EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates REDIS_URL: redis://shared-redis:6379/0 depends_on: - shared-database From 322970e56a33918283bdcb847695fa37b1756984 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:16:15 -0500 Subject: [PATCH 08/53] feat: start grant request test --- .../app/lib/webhooks.server.ts | 39 ++---- .../app/routes/webhooks.ts | 27 ++-- .../src/WebhookEventType.ts | 11 ++ .../mock-account-servicing-lib/src/index.ts | 1 + .../mock-account-servicing-lib/src/types.ts | 6 + scripts/run-integration-tests.sh | 13 +- test/integration/integration.test.ts | 124 +++++++++++++++++- test/integration/lib/MockASE.ts | 6 +- test/integration/lib/WebhookServer.ts | 82 ++++++++++-- .../cloud-nine-wallet/docker-compose.yml | 12 -- .../happy-life-bank/docker-compose.yml | 18 +-- 11 files changed, 248 insertions(+), 91 deletions(-) create mode 100644 packages/mock-account-servicing-lib/src/WebhookEventType.ts diff --git a/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts b/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts index 7caee31618..dc0c4a35f4 100644 --- a/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts @@ -9,24 +9,7 @@ import { depositPeerLiquidity, createWalletAddress } from './requesters' - -export enum EventType { - IncomingPaymentCreated = 'incoming_payment.created', - IncomingPaymentCompleted = 'incoming_payment.completed', - IncomingPaymentExpired = 'incoming_payment.expired', - OutgoingPaymentCreated = 'outgoing_payment.created', - OutgoingPaymentCompleted = 'outgoing_payment.completed', - OutgoingPaymentFailed = 'outgoing_payment.failed', - WalletAddressNotFound = 'wallet_address.not_found', - AssetLiquidityLow = 'asset.liquidity_low', - PeerLiquidityLow = 'peer.liquidity_low' -} - -export interface WebHook { - id: string - type: EventType - data: Record -} +import { Webhook, WebhookEventType } from 'mock-account-servicing-lib' export interface AmountJSON { value: string @@ -42,10 +25,10 @@ export function parseAmount(amount: AmountJSON): Amount { } } -export async function handleOutgoingPaymentCompletedFailed(wh: WebHook) { +export async function handleOutgoingPaymentCompletedFailed(wh: Webhook) { if ( - wh.type !== EventType.OutgoingPaymentCompleted && - wh.type !== EventType.OutgoingPaymentFailed + wh.type !== WebhookEventType.OutgoingPaymentCompleted && + wh.type !== WebhookEventType.OutgoingPaymentFailed ) { throw new Error('Invalid event type when handling outgoing payment webhook') } @@ -72,8 +55,8 @@ export async function handleOutgoingPaymentCompletedFailed(wh: WebHook) { return } -export async function handleOutgoingPaymentCreated(wh: WebHook) { - if (wh.type !== EventType.OutgoingPaymentCreated) { +export async function handleOutgoingPaymentCreated(wh: Webhook) { + if (wh.type !== WebhookEventType.OutgoingPaymentCreated) { throw new Error('Invalid event type when handling outgoing payment webhook') } @@ -122,10 +105,10 @@ export async function handleOutgoingPaymentCreated(wh: WebHook) { return } -export async function handleIncomingPaymentCompletedExpired(wh: WebHook) { +export async function handleIncomingPaymentCompletedExpired(wh: Webhook) { if ( - wh.type !== EventType.IncomingPaymentCompleted && - wh.type !== EventType.IncomingPaymentExpired + wh.type !== WebhookEventType.IncomingPaymentCompleted && + wh.type !== WebhookEventType.IncomingPaymentExpired ) { throw new Error('Invalid event type when handling incoming payment webhook') } @@ -174,7 +157,7 @@ export async function handleIncomingPaymentCompletedExpired(wh: WebHook) { return } -export async function handleWalletAddressNotFound(wh: WebHook) { +export async function handleWalletAddressNotFound(wh: Webhook) { const walletAddressUrl = wh.data['walletAddressUrl'] as string | undefined if (!walletAddressUrl) { @@ -202,7 +185,7 @@ export async function handleWalletAddressNotFound(wh: WebHook) { ) } -export async function handleLowLiquidity(wh: WebHook) { +export async function handleLowLiquidity(wh: Webhook) { const id = wh.data['id'] as string | undefined if (!id) { diff --git a/localenv/mock-account-servicing-entity/app/routes/webhooks.ts b/localenv/mock-account-servicing-entity/app/routes/webhooks.ts index 573556a362..aca081f36e 100644 --- a/localenv/mock-account-servicing-entity/app/routes/webhooks.ts +++ b/localenv/mock-account-servicing-entity/app/routes/webhooks.ts @@ -2,44 +2,43 @@ import type { ActionFunctionArgs } from '@remix-run/node' import { json } from '@remix-run/node' import { handleLowLiquidity, - handleWalletAddressNotFound, - WebHook + handleWalletAddressNotFound } from '~/lib/webhooks.server' import { handleOutgoingPaymentCreated, handleOutgoingPaymentCompletedFailed, - handleIncomingPaymentCompletedExpired, - EventType + handleIncomingPaymentCompletedExpired } from '~/lib/webhooks.server' +import { WebhookEventType, Webhook } from 'mock-account-servicing-lib' export function parseError(e: unknown): string { return e instanceof Error && e.stack ? e.stack : String(e) } export async function action({ request }: ActionFunctionArgs) { - const wh: WebHook = await request.json() + const wh: Webhook = await request.json() console.log('received webhook: ', JSON.stringify(wh)) try { switch (wh.type) { - case EventType.OutgoingPaymentCreated: + case WebhookEventType.OutgoingPaymentCreated: await handleOutgoingPaymentCreated(wh) break - case EventType.OutgoingPaymentCompleted: - case EventType.OutgoingPaymentFailed: + case WebhookEventType.OutgoingPaymentCompleted: + case WebhookEventType.OutgoingPaymentFailed: await handleOutgoingPaymentCompletedFailed(wh) break - case EventType.IncomingPaymentCreated: + case WebhookEventType.IncomingPaymentCreated: break - case EventType.IncomingPaymentCompleted: - case EventType.IncomingPaymentExpired: + case WebhookEventType.IncomingPaymentCompleted: + case WebhookEventType.IncomingPaymentExpired: await handleIncomingPaymentCompletedExpired(wh) break - case EventType.WalletAddressNotFound: + case WebhookEventType.WalletAddressNotFound: await handleWalletAddressNotFound(wh) break - case EventType.AssetLiquidityLow: - case EventType.PeerLiquidityLow: + case WebhookEventType.AssetLiquidityLow: + case WebhookEventType.PeerLiquidityLow: await handleLowLiquidity(wh) break default: diff --git a/packages/mock-account-servicing-lib/src/WebhookEventType.ts b/packages/mock-account-servicing-lib/src/WebhookEventType.ts new file mode 100644 index 0000000000..b9d80978a9 --- /dev/null +++ b/packages/mock-account-servicing-lib/src/WebhookEventType.ts @@ -0,0 +1,11 @@ +export enum WebhookEventType { + IncomingPaymentCreated = 'incoming_payment.created', + IncomingPaymentCompleted = 'incoming_payment.completed', + IncomingPaymentExpired = 'incoming_payment.expired', + OutgoingPaymentCreated = 'outgoing_payment.created', + OutgoingPaymentCompleted = 'outgoing_payment.completed', + OutgoingPaymentFailed = 'outgoing_payment.failed', + WalletAddressNotFound = 'wallet_address.not_found', + AssetLiquidityLow = 'asset.liquidity_low', + PeerLiquidityLow = 'peer.liquidity_low' +} diff --git a/packages/mock-account-servicing-lib/src/index.ts b/packages/mock-account-servicing-lib/src/index.ts index 82e3151ea7..9e90ba355b 100644 --- a/packages/mock-account-servicing-lib/src/index.ts +++ b/packages/mock-account-servicing-lib/src/index.ts @@ -2,3 +2,4 @@ export { Peering, Account, Config } from './types' export { AccountProvider } from './AccountProvider' export { setupFromSeed } from './setupFromSeed' +export { WebhookEventType } from './WebhookEventType' diff --git a/packages/mock-account-servicing-lib/src/types.ts b/packages/mock-account-servicing-lib/src/types.ts index c2d1553375..0d390645ed 100644 --- a/packages/mock-account-servicing-lib/src/types.ts +++ b/packages/mock-account-servicing-lib/src/types.ts @@ -1,4 +1,5 @@ import type { KeyObject } from 'crypto' +import { WebhookEventType } from './WebhookEventType' interface Asset { code: string @@ -49,3 +50,8 @@ export interface Config { authServerDomain: string graphqlUrl: string } +export interface Webhook { + id: string + type: WebhookEventType + data: Record +} diff --git a/scripts/run-integration-tests.sh b/scripts/run-integration-tests.sh index 18fd251995..71267ae01c 100755 --- a/scripts/run-integration-tests.sh +++ b/scripts/run-integration-tests.sh @@ -1,12 +1,17 @@ #!/bin/bash +# Starts test env, runs tests, and stops test env. +# testenv container logs saved to file. + timeout=30 +log_file="/tmp/rafiki_integration_logs.txt" pnpm --filter integration testenv:compose down pnpm --filter integration testenv:compose up -d +pnpm --filter integration testenv:compose logs -f --tail=0 > "$log_file" 2>&1 & -# perform healthcheck until OK, or errors if timeout. -function makeRequest() { +# perform health check until OK, or errors if timeout. +function pollUrl() { local url="$1" local start_time=$(date +%s) @@ -30,6 +35,6 @@ function makeRequest() { done } -makeRequest "http://localhost:4000/healthz" - +pollUrl "http://localhost:4000/healthz" pnpm --filter integration test +pnpm --filter integration testenv:compose down diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 3a70e01c7b..c121f22e7c 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -1,5 +1,7 @@ +import { OpenPaymentsClientError } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' +import { WebhookEventType } from 'mock-account-servicing-lib' describe('Open Payments Flow', (): void => { let c9: MockASE @@ -8,11 +10,6 @@ describe('Open Payments Flow', (): void => { beforeAll(async () => { c9 = await MockASE.create(C9_CONFIG) hlb = await MockASE.create(HLB_CONFIG) - - const walletAddressGet = await c9.opClient.walletAddress.get({ - url: 'http://localhost:4000/accounts/pfry' - }) - console.log({ walletAddressGet }) }) afterAll(async () => { @@ -20,8 +17,123 @@ describe('Open Payments Flow', (): void => { hlb.shutdown() }) + test('Can Get Existing Wallet Address', async (): Promise => { + const walletAddress = await c9.opClient.walletAddress.get({ + url: 'http://localhost:4000/accounts/pfry' + }) + // TODO: better expect. + // tried jestOpenapi.toSatifyApiSpec but loading throws errors + // for invalid spec? something not right there because that works in other pkgs + expect(walletAddress).toBeTruthy() + }) + + test.skip('Get Non-Existing Wallet Address Triggers Not Found Webhook Event', async (): Promise => { + let walletAddress + + const handleWebhookEventSpy = jest.spyOn( + c9.webhookServer.webhookEventHandler, + 'handleWebhookEvent' + ) + try { + walletAddress = await c9.opClient.walletAddress.get({ + url: 'http://localhost:4000/accounts/asmith' + }) + } catch (e) { + // 404 error from client is expected - swallow it + if (!(e instanceof OpenPaymentsClientError)) throw e + } + + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.WalletAddressNotFound, + data: expect.any(Object) + }) + ) + }) + test('Grant Request Incoming Payment', async (): Promise => { - expect(true).toBe(false) + const receiverWalletAddressUrl = 'http://localhost:4000/accounts/pfry' + console.log({ receiverWalletAddressUrl }) + const walletAddress = await c9.opClient.walletAddress.get({ + url: receiverWalletAddressUrl + }) + console.log({ walletAddress }) + + // TODO: remove try catch when done debugging + // ERROR: 401, invalid signature + // - with env var: WALLET_ADDRESS_URL=https://cloud-nine-wallet-test-backend/.well-known/pay + // error happens in auth's grantInitiationHttpsigMiddleware + // ultimately, http-sig-middleware > validateSignatures > crypto.verify resolves to false + + // Also fails with "invalid client" with env var: WALLET_ADDRESS_URL=http://localhost:3000/.well-known/pay + // This is also in grantInitiationHttpsigMiddleware, but doesnt get as far (clientService.getKey doesn't find anything) + + // Make sure that the public key used for verification (publicKey) matches the private key used for signing. Ensure that the key parameters (algorithm, key type, curve, etc.) are correct. + // Verify that the data being signed (data) is identical to the data used during the signing process. Any difference in the data will cause the verification to fail. + + // explorse this more (from cat /tmp/rafiki_integration_logs.txt): + // rafiki-test-happy-life-auth-1 | entering grantInitiationHttpsigMiddleware + // rafiki-test-happy-life-auth-1 | {"level":50,"time":1707515411497,"pid":1,"hostname":"happy-life-bank-test-auth","url":"http://localhost:3001/.well-known/pay/jwks.json","msg":"Error when making Open Payments GET request: connect ECONNREFUSED 127.0.0.1:3001"} + + // here are the args passed into validateSignature(clientKey, contextToRequestLike(ctx)). + // can i unit test in http-signature-utils with this exact object? + + // { + // clientKey: { + // alg: 'EdDSA', + // kid: 'rafiki-test', + // kty: 'OKP', + // crv: 'Ed25519', + // x: 'ZK_FZg674Yr7WkXpmmX0Ms8JpHkFxIlvT49KMdZUOz4' + // }, + // 'contextToRequestLike(ctx)': { + // url: 'http://localhost:4006/', + // method: 'POST', + // headers: { + // accept: 'application/json', + // 'content-type': 'application/json', + // 'content-digest': 'sha-512=:eUzgyjzaPgekk/GPjfrUqKkpHgvtOmtk/rhASd5TlPc+LzOcLRkjFBwNEoPYdl5JxrlRe8RctRinw+o3W3RAkA==:', + // 'content-length': '169', + // signature: 'sig1=:gticfDAmsDWpS/lbF3R5SZDoOdaPLGm81POFw5BI/TFFmGkpOE3lDZRYDjVJVnZKw5jU2/X5eGFzoz3Lx2phCA==:', + // 'signature-input': 'sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1707358816;keyid="rafiki-test";alg="ed25519"', + // 'user-agent': 'axios/1.6.7', + // 'accept-encoding': 'gzip, compress, deflate, br', + // host: 'localhost:4006', + // connection: 'close' + // }, + // body: '{"access_token":{"access":[{"type":"incoming-payment","actions":["create","read","list","complete"]}]},"client":"https://cloud-nine-wallet-test-backend/.well-known/pay"}' + // } + try { + const grant = await c9.opClient.grant.request( + { + url: walletAddress.authServer + }, + { + access_token: { + access: [ + { + type: 'incoming-payment', + actions: ['create', 'read', 'list', 'complete'] + } + ] + } + // TODO: do we need this? + // interact: { + // start: ['redirect'] + // } + } + ) + + console.log({ grant }) + } catch (e) { + console.log({ e }) + throw e + } + + // if (!isPendingGrant(grant)) { + // throw new Error('Expected interactive grant') + // } + // expect(true).toBe(false) }) // test('Create Incoming Payment', async (): Promise => { diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index 72095ae3ba..f24c373565 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -14,10 +14,10 @@ export class MockASE { private apolloClient: ApolloClient public accounts: AccountProvider public opClient!: AuthenticatedClient - private webhookServer: WebhookServer + public webhookServer: WebhookServer // Use .create factory because async construction - public static async create(config: TestConfig) { + public static async create(config: TestConfig): Promise { const mase = new MockASE(config) await mase.initAsync() return mase @@ -29,7 +29,7 @@ export class MockASE { this.config = config this.apolloClient = createApolloClient(config.graphqlUrl) this.accounts = new AccountProvider() - this.webhookServer = new WebhookServer() + this.webhookServer = new WebhookServer(this.apolloClient, this.accounts) this.webhookServer.start(this.config.webhookServerPort) } diff --git a/test/integration/lib/WebhookServer.ts b/test/integration/lib/WebhookServer.ts index 95f4dd2aa1..f9d31b1fda 100644 --- a/test/integration/lib/WebhookServer.ts +++ b/test/integration/lib/WebhookServer.ts @@ -1,27 +1,40 @@ import Koa from 'koa' import bodyParser from 'koa-bodyparser' import http from 'http' +import { + AccountProvider, + WebhookEventType, + Webhook +} from 'mock-account-servicing-lib' +import { ApolloClient, NormalizedCacheObject } from '@apollo/client' export class WebhookServer { private app: Koa private server?: http.Server + public webhookEventHandler: WebhookEventHandler - constructor() { + constructor( + apolloClient: ApolloClient, + accounts: AccountProvider + ) { this.app = new Koa() this.app.use(bodyParser()) + this.webhookEventHandler = new WebhookEventHandler(apolloClient, accounts) } public start(port: number): void { this.app.use(async (ctx) => { - // if (ctx.path === '/webhook' && ctx.method === 'POST') { - // console.log('Received webhook payload:', ctx.request.body) - // ctx.status = 200 - // ctx.body = 'Webhook received successfully!' - // } - if (ctx.path === '/webhook') { - console.log('Received webhook payload:', ctx.request.body) - ctx.status = 200 - ctx.body = 'Webhook received successfully!' + if (ctx.path === '/webhooks' && ctx.method === 'POST') { + const { body } = ctx.request + + if (this.isWebhookEvent(body)) { + this.webhookEventHandler.handleWebhookEvent(body) + ctx.status = 200 + ctx.body = 'Webhook received' + } else { + ctx.status = 400 + ctx.body = 'Invalid WebhookEvent payload' + } } }) @@ -30,6 +43,15 @@ export class WebhookServer { }) } + private isWebhookEvent(body: any): body is Webhook { + return ( + typeof body === 'object' && + typeof body.id === 'string' && + typeof body.type === 'string' && + typeof body.data === 'object' + ) + } + public async close(): Promise { return new Promise((resolve, reject) => { if (!this.server) return resolve() @@ -44,3 +66,43 @@ export class WebhookServer { }) } } + +export class WebhookEventHandler { + private apolloClient: ApolloClient + private accounts: AccountProvider + + constructor( + apolloClient: ApolloClient, + accounts: AccountProvider + ) { + this.apolloClient = apolloClient + this.accounts = accounts + } + + public async handleWebhookEvent(webhookEvent: Webhook) { + switch (webhookEvent.type) { + case WebhookEventType.WalletAddressNotFound: + await this.handleWalletAddressNotFound(webhookEvent) + break + default: + console.log(`unknown event type: ${webhookEvent.type}`) + } + } + + private async handleWalletAddressNotFound(webhookEvent: Webhook) { + const walletAddressUrl = webhookEvent.data['walletAddressUrl'] + + if (!walletAddressUrl || typeof walletAddressUrl !== 'string') { + throw new Error('No walletAddressUrl found') + } + + const accountPath = new URL(walletAddressUrl).pathname.substring(1) + const account = await this.accounts.getByPath(accountPath) + + if (!account) { + throw new Error('No account found for wallet address') + } + + // TODO: create wallet address via apolloClient + } +} diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 9674ddb2fa..956e9311e5 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -26,19 +26,7 @@ services: AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 ILP_ADDRESS: test.cloud-nine-wallet-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - - # TODO: figure out right url. localhost will probably be wrong (relative to container im guessing) - # WEBHOOK_URL: http://localhost:${WEBHOOK_SERVER_PORT}/webhooks - - # Maybe this will work? WEBHOOK_URL: http://host.docker.internal:${WEBHOOK_SERVER_PORT}/webhooks - - # Or this? (set as env var soemwhere) - # WEBHOOK_URL=http://:8888/webhooks - - # Original (assumes there is some cloud-nine-wallet-test, which there isnt): - # WEBHOOK_URL: http://cloud-nine-wallet-test/webhooks - # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates REDIS_URL: redis://shared-redis:6379/0 diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index 05925cb160..4febb2548f 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -21,23 +21,13 @@ services: CONNECTOR_PORT: 3002 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://happy_life_bank_test_backend:happy_life_bank_test_backend@shared-database/happy_life_bank_test_backend - AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:3006 - AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 + AUTH_SERVER_GRANT_URL: http://localhost:4006 + AUTH_SERVER_INTROSPECTION_URL: http://localhost:4007 + # AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:3006 + # AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - - # TODO: figure out right url. localhost will probably be wrong (relative to container im guessing) - # WEBHOOK_URL: http://localhost:${WEBHOOK_SERVER_PORT}/webhooks - - # Maybe this will work? WEBHOOK_URL: http://host.docker.internal:${WEBHOOK_SERVER_PORT}/webhooks - - # Or this? (set as env var soemwhere). looks like thats what above does though. - # WEBHOOK_URL=http://:8888/webhooks - - # Original (assumes there is some cloud-nine-wallet-test, which there isnt because the server is on localhost): - # WEBHOOK_URL: http://happy-life-bank-test/webhooks - # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://happy-life-bank-test/rates REDIS_URL: redis://shared-redis:6379/1 From c9096ec3f4ef7c7b107ac6975002bf9fce7e9ede Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:20:36 -0500 Subject: [PATCH 09/53] fix: eslint errors --- test/integration/integration.test.ts | 1 + test/integration/lib/WebhookServer.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index c121f22e7c..dc5d5a0a46 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -43,6 +43,7 @@ describe('Open Payments Flow', (): void => { if (!(e instanceof OpenPaymentsClientError)) throw e } + expect(walletAddress).toBeUndefined() expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ type: WebhookEventType.WalletAddressNotFound, diff --git a/test/integration/lib/WebhookServer.ts b/test/integration/lib/WebhookServer.ts index f9d31b1fda..8a903cc1c1 100644 --- a/test/integration/lib/WebhookServer.ts +++ b/test/integration/lib/WebhookServer.ts @@ -43,6 +43,7 @@ export class WebhookServer { }) } + // eslint-disable-next-line @typescript-eslint/no-explicit-any private isWebhookEvent(body: any): body is Webhook { return ( typeof body === 'object' && From 9a654a9f9c3984139571fff7c8aa622644407623 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 13 Feb 2024 09:13:11 -0500 Subject: [PATCH 10/53] fix: docker compose env vars --- .../testenv/cloud-nine-wallet/docker-compose.yml | 14 +++++++------- .../testenv/happy-life-bank/docker-compose.yml | 12 +++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 956e9311e5..961e1b6d18 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -14,19 +14,19 @@ services: - '3002:3002' networks: - rafiki-test - # use .env file for env vars common to test config - env_file: - - .env environment: NODE_ENV: ${NODE_ENV:-development} ADMIN_PORT: 3001 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend + OPEN_PAYMENTS_URL: https://localhost:3000 + WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/.well-known/pay + KEY_ID: rafiki AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 ILP_ADDRESS: test.cloud-nine-wallet-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - WEBHOOK_URL: http://host.docker.internal:${WEBHOOK_SERVER_PORT}/webhooks + WEBHOOK_URL: http://host.docker.internal:8888/webhooks # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates REDIS_URL: redis://shared-redis:6379/0 @@ -45,11 +45,11 @@ services: ports: - '3003:3003' - '3006:3006' - # use .env file for env vars common to test config - env_file: - - .env environment: NODE_ENV: ${NODE_ENV:-development} + + AUTH_SERVER_DOMAIN: http://localhost:3006 + AUTH_DATABASE_URL: postgresql://cloud_nine_wallet_test_auth:cloud_nine_wallet_test_auth@shared-database/cloud_nine_wallet_test_auth depends_on: - shared-database \ No newline at end of file diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index 4febb2548f..d3678ab010 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -11,12 +11,11 @@ services: - "4001:3001" networks: - rafiki-test - # use .env file for env vars common to test config - env_file: - - .env environment: NODE_ENV: development LOG_LEVEL: debug + OPEN_PAYMENTS_URL: https://localhost:4000 + WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/.well-known/pay ADMIN_PORT: 3001 CONNECTOR_PORT: 3002 OPEN_PAYMENTS_PORT: 80 @@ -25,9 +24,10 @@ services: AUTH_SERVER_INTROSPECTION_URL: http://localhost:4007 # AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:3006 # AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 + KEY_ID: rafiki ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= - WEBHOOK_URL: http://host.docker.internal:${WEBHOOK_SERVER_PORT}/webhooks + WEBHOOK_URL: http://host.docker.internal:8889/webhooks # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://happy-life-bank-test/rates REDIS_URL: redis://shared-redis:6379/1 @@ -43,11 +43,9 @@ services: ports: - '4003:3003' - '4006:3006' - # use .env file for env vars common to test config - env_file: - - .env environment: NODE_ENV: development AUTH_DATABASE_URL: postgresql://happy_life_bank_test_auth:happy_life_bank_test_auth@shared-database/happy_life_bank_test_auth + AUTH_SERVER_DOMAIN: http://localhost:4006 depends_on: - cloud-nine-wallet-test-auth \ No newline at end of file From dcc156e97a53fa8576bfc675665aa6fb9f51bb58 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:57:52 -0500 Subject: [PATCH 11/53] feat: add --build arg --- scripts/run-integration-tests.sh | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/scripts/run-integration-tests.sh b/scripts/run-integration-tests.sh index 71267ae01c..8458a6d6dd 100755 --- a/scripts/run-integration-tests.sh +++ b/scripts/run-integration-tests.sh @@ -1,13 +1,31 @@ #!/bin/bash -# Starts test env, runs tests, and stops test env. -# testenv container logs saved to file. +# This script runs the integration tests. It starts the test environment, runs the tests, +# saves the container logs to a file, and stops the containers. +# Usage: +# ./script.sh # Run the script with default options +# ./script.sh --build # Re-build the docker images (-b or --build) timeout=30 log_file="/tmp/rafiki_integration_logs.txt" +build_flag="" + +# Parse cli args +while [[ $# -gt 0 ]]; do + case "$1" in + -b|--build) + build_flag="--build" + shift + ;; + *) + echo "Unknown option: $1" + exit 1 + ;; + esac +done -pnpm --filter integration testenv:compose down -pnpm --filter integration testenv:compose up -d +pnpm --filter integration testenv:compose down --volumes +pnpm --filter integration testenv:compose up -d $build_flag pnpm --filter integration testenv:compose logs -f --tail=0 > "$log_file" 2>&1 & # perform health check until OK, or errors if timeout. @@ -37,4 +55,4 @@ function pollUrl() { pollUrl "http://localhost:4000/healthz" pnpm --filter integration test -pnpm --filter integration testenv:compose down +pnpm --filter integration testenv:compose down --volumes From 83431e0ea9e3c89e70ca9e4fcfc157d1222a3191 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:08:32 -0500 Subject: [PATCH 12/53] fix: incoming-payment grant initiation request Grant request was failing with invalid signature. This was fixed by directing hte backend to use the same private key being used to create the open payments client. --- test/integration/lib/config.ts | 6 +++--- .../testenv/cloud-nine-wallet/docker-compose.yml | 3 +++ test/integration/testenv/docker-compose.yml | 1 - test/integration/testenv/happy-life-bank/docker-compose.yml | 3 +++ test/integration/testenv/happy-life-bank/private-key.pem | 3 --- .../testenv/{cloud-nine-wallet => }/private-key.pem | 0 6 files changed, 9 insertions(+), 7 deletions(-) delete mode 100644 test/integration/testenv/happy-life-bank/private-key.pem rename test/integration/testenv/{cloud-nine-wallet => }/private-key.pem (100%) diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index 84e29b6fc9..9bd9ba6266 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -1,6 +1,6 @@ import { parse } from 'yaml' import { readFileSync } from 'fs' -import { loadOrGenerateKey } from '@interledger/http-signature-utils' +import { loadKey } from '@interledger/http-signature-utils' import type { Config } from 'mock-account-servicing-lib' import { parse as envParse } from 'dotenv' @@ -51,13 +51,13 @@ type ConfigOptions = { } const createConfig = (name: string, opts: ConfigOptions): TestConfig => { - const keyPath = resolve(__dirname, `../testenv/${name}/private-key.pem`) const seedPath = resolve(__dirname, `../testenv/${name}/seed.yml`) const env = loadEnv(resolve(__dirname, `../testenv/${name}/.env`)) + const keyPath = resolve(__dirname, `../testenv/private-key.pem`) return { seed: parse(readFileSync(seedPath).toString('utf8')), - key: loadOrGenerateKey(keyPath), + key: loadKey(keyPath), publicHost: env.OPEN_PAYMENTS_URL, testnetAutoPeerUrl: '', authServerDomain: env.AUTH_SERVER_DOMAIN, diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 961e1b6d18..0f5c37cc59 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -22,6 +22,7 @@ services: OPEN_PAYMENTS_URL: https://localhost:3000 WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/.well-known/pay KEY_ID: rafiki + PRIVATE_KEY_FILE: /workspace/private-key.pem AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 ILP_ADDRESS: test.cloud-nine-wallet-test @@ -30,6 +31,8 @@ services: # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates REDIS_URL: redis://shared-redis:6379/0 + volumes: + - ../private-key.pem:/workspace/private-key.pem depends_on: - shared-database - shared-redis diff --git a/test/integration/testenv/docker-compose.yml b/test/integration/testenv/docker-compose.yml index 966b92baaf..f4ecd236c5 100644 --- a/test/integration/testenv/docker-compose.yml +++ b/test/integration/testenv/docker-compose.yml @@ -16,7 +16,6 @@ services: networks: - rafiki-test volumes: - # this path should be relative to the docker-compose file that uses shared-database - ../dbinit.sql:/docker-entrypoint-initdb.d/init.sql ports: - '5432:5432' diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index d3678ab010..632798fa9a 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -25,12 +25,15 @@ services: # AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:3006 # AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 KEY_ID: rafiki + PRIVATE_KEY_FILE: /workspace/private-key.pem ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://host.docker.internal:8889/webhooks # TODO: should point to the integration ASE, similar to webhook url EXCHANGE_RATES_URL: http://happy-life-bank-test/rates REDIS_URL: redis://shared-redis:6379/1 + volumes: + - ../private-key.pem:/workspace/private-key.pem depends_on: - cloud-nine-wallet-test-backend happy-life-auth: diff --git a/test/integration/testenv/happy-life-bank/private-key.pem b/test/integration/testenv/happy-life-bank/private-key.pem deleted file mode 100644 index 7fa97c747d..0000000000 --- a/test/integration/testenv/happy-life-bank/private-key.pem +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PRIVATE KEY----- -MC4CAQAwBQYDK2VwBCIEIEqezmcPhOE8bkwN+jQrppfRYzGIdFTVWQGTHJIKpz88 ------END PRIVATE KEY----- diff --git a/test/integration/testenv/cloud-nine-wallet/private-key.pem b/test/integration/testenv/private-key.pem similarity index 100% rename from test/integration/testenv/cloud-nine-wallet/private-key.pem rename to test/integration/testenv/private-key.pem From f02db32b44ea5e5467153a7a5ef448802a711e27 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 20 Feb 2024 13:46:00 -0500 Subject: [PATCH 13/53] fix: ts error --- .../payment-method/ilp/connector/core/utils/create-context.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts b/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts index cb8af0779f..96b52c0f96 100644 --- a/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts +++ b/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts @@ -20,7 +20,9 @@ export function createContext( options: Options = {} ): Koa.ParameterizedContext { const app = options.app || new Koa() - const req = new MockIncomingMessage(options.req || {}) + const req = new MockIncomingMessage( + options.req || {} + ) as unknown as IncomingMessage const res = new MockServerResponse( req, options.res From a12910d2d5e54407188874589e37a45d781044cf Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Wed, 28 Feb 2024 13:39:04 -0500 Subject: [PATCH 14/53] feat: implement tests through Create Quote --- scripts/fetch-schemas.sh | 2 +- test/integration/integration.test.ts | 259 +++++++++++------- ...{WebhookServer.ts => IntegrationServer.ts} | 26 +- test/integration/lib/MockASE.ts | 17 +- test/integration/lib/config.ts | 8 +- test/integration/lib/utils.ts | 3 + .../cloud-nine-wallet/docker-compose.yml | 15 +- .../testenv/cloud-nine-wallet/seed.yml | 2 +- .../happy-life-bank/docker-compose.yml | 17 +- 9 files changed, 230 insertions(+), 119 deletions(-) rename test/integration/lib/{WebhookServer.ts => IntegrationServer.ts} (79%) create mode 100644 test/integration/lib/utils.ts diff --git a/scripts/fetch-schemas.sh b/scripts/fetch-schemas.sh index cbb2c06186..48530ecf3a 100755 --- a/scripts/fetch-schemas.sh +++ b/scripts/fetch-schemas.sh @@ -1,7 +1,7 @@ #!/bin/bash REPO_ROOT=$(git rev-parse --show-toplevel) -BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.5.0}" +BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.5.1}" BASE_URL="https://raw.githubusercontent.com/interledger/open-payments/$BRANCH_OR_TAG" OUT_DIR="$REPO_ROOT/openapi" diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index dc5d5a0a46..8851cee5ba 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -1,12 +1,50 @@ -import { OpenPaymentsClientError } from '@interledger/open-payments' +import assert from 'assert' +import { + OpenPaymentsClientError, + isPendingGrant, + WalletAddress +} from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' import { WebhookEventType } from 'mock-account-servicing-lib' +import { wait } from './lib/utils' +import { resourceLimits } from 'worker_threads' + +// jest.setTimeout(20000) +// TODO: remove after fixing tests +jest.setTimeout(1_000_000) describe('Open Payments Flow', (): void => { let c9: MockASE let hlb: MockASE + // TODO: can I get this from somewhere instead? config? MockASE accounts? + // From op client responses (ie use receiverWalletAddress.resourceServer instead of receiverOpenPaymentsHost)? + const receiverWalletAddressUrl = 'http://localhost:4000/accounts/pfry' + const receiverOpenPaymentsHost = 'http://localhost:4000' + const senderOpenPaymentsAuthHost = 'http://localhost:3006' + const senderOpenPaymentsHost = 'http://localhost:3000' + const senderWalletAddressUrl = 'https://localhost:3000/accounts/gfranklin' + const receiverAssetCode = 'USD' + const receiverAssetScale = 2 + + // TODO: Figure out a better way to organize tests so that there arent many tests + // with side effects (changing this global state) which subsequent tests rely on. + // Because 🤮 + + // Assigned in test: Can Get Existing Wallet Address + let receiverWalletAddress: WalletAddress + + // Assigned initially in test: Grant Request Incoming Payment + // Then re-assigned in test: Grant Request Quote + // - could set new vars but just following whats in postman for now + let accessToken: string + let continueToken: string + let continueId: string + let tokenId: string + + let incomingPaymentId: string + beforeAll(async () => { c9 = await MockASE.create(C9_CONFIG) hlb = await MockASE.create(HLB_CONFIG) @@ -18,20 +56,22 @@ describe('Open Payments Flow', (): void => { }) test('Can Get Existing Wallet Address', async (): Promise => { - const walletAddress = await c9.opClient.walletAddress.get({ - url: 'http://localhost:4000/accounts/pfry' + receiverWalletAddress = await c9.opClient.walletAddress.get({ + url: receiverWalletAddressUrl }) + console.log({ receiverWalletAddress }) // TODO: better expect. // tried jestOpenapi.toSatifyApiSpec but loading throws errors // for invalid spec? something not right there because that works in other pkgs - expect(walletAddress).toBeTruthy() + expect(receiverWalletAddress).toBeTruthy() }) + // TODO: fix account not found error in webhook handler test.skip('Get Non-Existing Wallet Address Triggers Not Found Webhook Event', async (): Promise => { let walletAddress const handleWebhookEventSpy = jest.spyOn( - c9.webhookServer.webhookEventHandler, + c9.integrationServer.webhookEventHandler, 'handleWebhookEvent' ) try { @@ -53,105 +93,132 @@ describe('Open Payments Flow', (): void => { }) test('Grant Request Incoming Payment', async (): Promise => { - const receiverWalletAddressUrl = 'http://localhost:4000/accounts/pfry' - console.log({ receiverWalletAddressUrl }) - const walletAddress = await c9.opClient.walletAddress.get({ - url: receiverWalletAddressUrl - }) - console.log({ walletAddress }) - - // TODO: remove try catch when done debugging - // ERROR: 401, invalid signature - // - with env var: WALLET_ADDRESS_URL=https://cloud-nine-wallet-test-backend/.well-known/pay - // error happens in auth's grantInitiationHttpsigMiddleware - // ultimately, http-sig-middleware > validateSignatures > crypto.verify resolves to false - - // Also fails with "invalid client" with env var: WALLET_ADDRESS_URL=http://localhost:3000/.well-known/pay - // This is also in grantInitiationHttpsigMiddleware, but doesnt get as far (clientService.getKey doesn't find anything) - - // Make sure that the public key used for verification (publicKey) matches the private key used for signing. Ensure that the key parameters (algorithm, key type, curve, etc.) are correct. - // Verify that the data being signed (data) is identical to the data used during the signing process. Any difference in the data will cause the verification to fail. - - // explorse this more (from cat /tmp/rafiki_integration_logs.txt): - // rafiki-test-happy-life-auth-1 | entering grantInitiationHttpsigMiddleware - // rafiki-test-happy-life-auth-1 | {"level":50,"time":1707515411497,"pid":1,"hostname":"happy-life-bank-test-auth","url":"http://localhost:3001/.well-known/pay/jwks.json","msg":"Error when making Open Payments GET request: connect ECONNREFUSED 127.0.0.1:3001"} - - // here are the args passed into validateSignature(clientKey, contextToRequestLike(ctx)). - // can i unit test in http-signature-utils with this exact object? - - // { - // clientKey: { - // alg: 'EdDSA', - // kid: 'rafiki-test', - // kty: 'OKP', - // crv: 'Ed25519', - // x: 'ZK_FZg674Yr7WkXpmmX0Ms8JpHkFxIlvT49KMdZUOz4' - // }, - // 'contextToRequestLike(ctx)': { - // url: 'http://localhost:4006/', - // method: 'POST', - // headers: { - // accept: 'application/json', - // 'content-type': 'application/json', - // 'content-digest': 'sha-512=:eUzgyjzaPgekk/GPjfrUqKkpHgvtOmtk/rhASd5TlPc+LzOcLRkjFBwNEoPYdl5JxrlRe8RctRinw+o3W3RAkA==:', - // 'content-length': '169', - // signature: 'sig1=:gticfDAmsDWpS/lbF3R5SZDoOdaPLGm81POFw5BI/TFFmGkpOE3lDZRYDjVJVnZKw5jU2/X5eGFzoz3Lx2phCA==:', - // 'signature-input': 'sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1707358816;keyid="rafiki-test";alg="ed25519"', - // 'user-agent': 'axios/1.6.7', - // 'accept-encoding': 'gzip, compress, deflate, br', - // host: 'localhost:4006', - // connection: 'close' - // }, - // body: '{"access_token":{"access":[{"type":"incoming-payment","actions":["create","read","list","complete"]}]},"client":"https://cloud-nine-wallet-test-backend/.well-known/pay"}' - // } - try { - const grant = await c9.opClient.grant.request( - { - url: walletAddress.authServer - }, - { - access_token: { - access: [ - { - type: 'incoming-payment', - actions: ['create', 'read', 'list', 'complete'] - } - ] - } - // TODO: do we need this? - // interact: { - // start: ['redirect'] - // } + const grant = await c9.opClient.grant.request( + { + // url: receiverWalletAddress.authServer + url: 'http://localhost:4006' // should be receiverWalletAddress.authServer but that uses the hostname + }, + { + access_token: { + access: [ + { + type: 'incoming-payment', + actions: ['create', 'read', 'list', 'complete'] + } + ] } - ) + } + ) - console.log({ grant }) - } catch (e) { - console.log({ e }) - throw e - } + assert(!isPendingGrant(grant)) + const continueId_ = grant.continue.uri.split('/').pop() + assert(continueId_) + const tokenId_ = grant.access_token.manage.split('/').pop() + assert(tokenId_) - // if (!isPendingGrant(grant)) { - // throw new Error('Expected interactive grant') - // } - // expect(true).toBe(false) + accessToken = grant.access_token.value + continueToken = grant.continue.access_token.value + continueId = continueId_ + tokenId = tokenId_ }) - // test('Create Incoming Payment', async (): Promise => { - // expect(true).toBe(true) - // }) + test('Create Incoming Payment', async (): Promise => { + const now = new Date() + const tomorrow = new Date(now) + tomorrow.setDate(now.getDate() + 1) - // test('Grant Request Quote', async (): Promise => { - // expect(true).toBe(true) - // }) + const handleWebhookEventSpy = jest.spyOn( + hlb.integrationServer.webhookEventHandler, + 'handleWebhookEvent' + ) - // test('Grant Request Quote', async (): Promise => { - // expect(true).toBe(true) - // }) + const incomingPayment = await c9.opClient.incomingPayment.create( + { + url: receiverOpenPaymentsHost, + accessToken + }, + { + // TODO: Improve this (calling https when we use http elsewhere) + // requires https because thats whats in the DB because wallet addresses must be created as https (isValidWalletAddressUrl) + // Comes from OPEN_PAYMENTS_URL env var and seed data. + walletAddress: 'https://localhost:4000/accounts/pfry', + // walletAddress: receiverWalletAddressUrl, + incomingAmount: { + value: '100', + assetCode: receiverAssetCode, + assetScale: receiverAssetScale + }, + metadata: { description: 'Free Money!' }, + expiresAt: tomorrow.toISOString() + } + ) - // test('Grant Request Outgoing Payment', async (): Promise => { - // expect(true).toBe(true) - // }) + const incomingPaymentId_ = incomingPayment.id.split('/').pop() + assert(incomingPaymentId_) + incomingPaymentId = incomingPaymentId_ + + // Delay to ensure webhook is received + await wait(1000) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.IncomingPaymentCreated, + data: expect.any(Object) + }) + ) + }) + + test('Grant Request Quote', async (): Promise => { + const grant = await c9.opClient.grant.request( + { + url: senderOpenPaymentsAuthHost + }, + { + access_token: { + access: [ + { + type: 'quote', + actions: ['read', 'create'] + } + ] + } + } + ) + + assert(!isPendingGrant(grant)) + const continueId_ = grant.continue.uri.split('/').pop() + assert(continueId_) + const tokenId_ = grant.access_token.manage.split('/').pop() + assert(tokenId_) + + accessToken = grant.access_token.value + continueToken = grant.continue.access_token.value + continueId = continueId_ + tokenId = tokenId_ + }) + + test('Create Quote', async (): Promise => { + // TODO: Got this working with hacky stuff which needs real solutions: + // - changed receiver regex in open payments schema to icnlude http then set this in body: `http://happy-life-bank-test-backend/incoming-payments/${incomingPaymentId}` + const quote = await c9.opClient.quote.create( + { + url: senderOpenPaymentsHost, // TODO: does it need to be https? + accessToken + }, + { + // TODO: Improve this (calling https when we use http elsewhere) + // requires https because thats whats in the DB because wallet addresses must be created as https (isValidWalletAddressUrl) + // Comes from OPEN_PAYMENTS_URL env var and seed data. + walletAddress: 'https://localhost:3000/accounts/gfranklin', + receiver: `http://happy-life-bank-test-backend/incoming-payments/${incomingPaymentId}`, + method: 'ilp' + } + ) + // TODO: assertions. what to check that isnt tested by virtue of future tests passing? + }) + + test('Grant Request Outgoing Payment', async (): Promise => { + expect(true).toBe(false) + }) // test('Continuation Request', async (): Promise => { // expect(true).toBe(true) diff --git a/test/integration/lib/WebhookServer.ts b/test/integration/lib/IntegrationServer.ts similarity index 79% rename from test/integration/lib/WebhookServer.ts rename to test/integration/lib/IntegrationServer.ts index 8a903cc1c1..c68b1f121b 100644 --- a/test/integration/lib/WebhookServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -7,16 +7,20 @@ import { Webhook } from 'mock-account-servicing-lib' import { ApolloClient, NormalizedCacheObject } from '@apollo/client' +import { TestConfig } from './config' -export class WebhookServer { +export class IntegrationServer { + private config: TestConfig private app: Koa private server?: http.Server public webhookEventHandler: WebhookEventHandler constructor( + config: TestConfig, apolloClient: ApolloClient, accounts: AccountProvider ) { + this.config = config this.app = new Koa() this.app.use(bodyParser()) this.webhookEventHandler = new WebhookEventHandler(apolloClient, accounts) @@ -36,10 +40,20 @@ export class WebhookServer { ctx.body = 'Invalid WebhookEvent payload' } } + + if (ctx.path === '/rates' && ctx.method === 'GET') { + const { base } = ctx.query + ctx.body = { + base, + rates: { + ...this.config.seed.rates[base as string] + } + } + } }) this.server = this.app.listen(port, () => { - console.log(`Webhook server listening on port ${port}`) + console.log(`Integration server listening on port ${port}`) }) } @@ -85,6 +99,9 @@ export class WebhookEventHandler { case WebhookEventType.WalletAddressNotFound: await this.handleWalletAddressNotFound(webhookEvent) break + case WebhookEventType.IncomingPaymentCreated: + // await this.handleIncomingPaymentCreated(webhookEvent) + break default: console.log(`unknown event type: ${webhookEvent.type}`) } @@ -106,4 +123,9 @@ export class WebhookEventHandler { // TODO: create wallet address via apolloClient } + + // private async handleIncomingPaymentCreated(webhookEvent: Webhook) { + // console.log('handleIncomingPaymentCreated') + // console.log({ webhookEvent }) + // } } diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index f24c373565..7bb3609582 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -5,7 +5,7 @@ import { } from '@interledger/open-payments' import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' import { createApolloClient } from './apolloClient' -import { WebhookServer } from './WebhookServer' +import { IntegrationServer } from './IntegrationServer' import { TestConfig } from './config' /** Mock Account Servicing Entity */ @@ -14,7 +14,7 @@ export class MockASE { private apolloClient: ApolloClient public accounts: AccountProvider public opClient!: AuthenticatedClient - public webhookServer: WebhookServer + public integrationServer: IntegrationServer // Use .create factory because async construction public static async create(config: TestConfig): Promise { @@ -29,8 +29,12 @@ export class MockASE { this.config = config this.apolloClient = createApolloClient(config.graphqlUrl) this.accounts = new AccountProvider() - this.webhookServer = new WebhookServer(this.apolloClient, this.accounts) - this.webhookServer.start(this.config.webhookServerPort) + this.integrationServer = new IntegrationServer( + this.config, + this.apolloClient, + this.accounts + ) + this.integrationServer.start(this.config.integrationServerPort) } private async initAsync() { @@ -39,11 +43,12 @@ export class MockASE { this.opClient = await createAuthenticatedClient({ privateKey: this.config.key, keyId: this.config.keyId, - walletAddressUrl: this.config.walletAddressUrl + walletAddressUrl: this.config.walletAddressUrl, + useHttp: true }) } public async shutdown() { - await this.webhookServer.close() + await this.integrationServer.close() } } diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index 9bd9ba6266..cb41c1342a 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -7,7 +7,7 @@ import { parse as envParse } from 'dotenv' import { resolve } from 'path' export type TestConfig = Config & { - webhookServerPort: number + integrationServerPort: number walletAddressUrl: string keyId: string } @@ -15,14 +15,14 @@ export type TestConfig = Config & { type EnvConfig = { OPEN_PAYMENTS_URL: string AUTH_SERVER_DOMAIN: string - WEBHOOK_SERVER_PORT: string + INTEGRATION_SERVER_PORT: string WALLET_ADDRESS_URL: string KEY_ID: string } const REQUIRED_KEYS: (keyof EnvConfig)[] = [ 'OPEN_PAYMENTS_URL', 'AUTH_SERVER_DOMAIN', - 'WEBHOOK_SERVER_PORT', + 'INTEGRATION_SERVER_PORT', 'WALLET_ADDRESS_URL', 'KEY_ID' ] @@ -61,7 +61,7 @@ const createConfig = (name: string, opts: ConfigOptions): TestConfig => { publicHost: env.OPEN_PAYMENTS_URL, testnetAutoPeerUrl: '', authServerDomain: env.AUTH_SERVER_DOMAIN, - webhookServerPort: parseInt(env.WEBHOOK_SERVER_PORT), + integrationServerPort: parseInt(env.INTEGRATION_SERVER_PORT), walletAddressUrl: env.WALLET_ADDRESS_URL, keyId: env.KEY_ID, ...opts diff --git a/test/integration/lib/utils.ts b/test/integration/lib/utils.ts new file mode 100644 index 0000000000..26ba552b45 --- /dev/null +++ b/test/integration/lib/utils.ts @@ -0,0 +1,3 @@ +export function wait(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)) +} diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 0f5c37cc59..21e4380c79 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -15,21 +15,27 @@ services: networks: - rafiki-test environment: + LOG_LEVEL: debug NODE_ENV: ${NODE_ENV:-development} ADMIN_PORT: 3001 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend OPEN_PAYMENTS_URL: https://localhost:3000 WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/.well-known/pay + # OPEN_PAYMENTS_URL: http://localhost:3000 + # WALLET_ADDRESS_URL: http://cloud-nine-wallet-test-backend/.well-known/pay KEY_ID: rafiki PRIVATE_KEY_FILE: /workspace/private-key.pem - AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 + # AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 + AUTH_SERVER_GRANT_URL: http://localhost:3006 + # AUTH_SERVER_INTROSPECTION_URL: http://localhost:3007 ILP_ADDRESS: test.cloud-nine-wallet-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://host.docker.internal:8888/webhooks # TODO: should point to the integration ASE, similar to webhook url - EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates + # EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates + EXCHANGE_RATES_URL: http://host.docker.internal:8888/rates REDIS_URL: redis://shared-redis:6379/0 volumes: - ../private-key.pem:/workspace/private-key.pem @@ -48,11 +54,12 @@ services: ports: - '3003:3003' - '3006:3006' + - '3007:3007' environment: NODE_ENV: ${NODE_ENV:-development} - AUTH_SERVER_DOMAIN: http://localhost:3006 - + # AUTH_SERVER_DOMAIN: http://cloud-nine-wallet-test-auth:3006 AUTH_DATABASE_URL: postgresql://cloud_nine_wallet_test_auth:cloud_nine_wallet_test_auth@shared-database/cloud_nine_wallet_test_auth + INTROSPECTION_PORT: 3007 depends_on: - shared-database \ No newline at end of file diff --git a/test/integration/testenv/cloud-nine-wallet/seed.yml b/test/integration/testenv/cloud-nine-wallet/seed.yml index d79533bcd4..2de21ca382 100644 --- a/test/integration/testenv/cloud-nine-wallet/seed.yml +++ b/test/integration/testenv/cloud-nine-wallet/seed.yml @@ -19,7 +19,7 @@ peeringAsset: 'USD' peers: - initialLiquidity: '100000' peerUrl: http://happy-life-bank-test-backend:3002 - peerIlpAddress: test.happy-life-test-bank + peerIlpAddress: test.happy-life-bank-test liquidityThreshold: 10000 accounts: - name: 'Grace Franklin' diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index 632798fa9a..b0fa5dcae4 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -16,21 +16,25 @@ services: LOG_LEVEL: debug OPEN_PAYMENTS_URL: https://localhost:4000 WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/.well-known/pay + # OPEN_PAYMENTS_URL: http://localhost:4000 + # WALLET_ADDRESS_URL: http://happy-life-bank-test-backend/.well-known/pay ADMIN_PORT: 3001 CONNECTOR_PORT: 3002 OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://happy_life_bank_test_backend:happy_life_bank_test_backend@shared-database/happy_life_bank_test_backend - AUTH_SERVER_GRANT_URL: http://localhost:4006 - AUTH_SERVER_INTROSPECTION_URL: http://localhost:4007 - # AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:3006 - # AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:3007 + # AUTH_SERVER_GRANT_URL: http://localhost:4006 + AUTH_SERVER_GRANT_URL: http://happy-life-auth:3006 + # AUTH_SERVER_INTROSPECTION_URL: http://localhost:4007 + # AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:4006 + AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:4007 KEY_ID: rafiki PRIVATE_KEY_FILE: /workspace/private-key.pem ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://host.docker.internal:8889/webhooks # TODO: should point to the integration ASE, similar to webhook url - EXCHANGE_RATES_URL: http://happy-life-bank-test/rates + # EXCHANGE_RATES_URL: http://happy-life-bank-test/rates + EXCHANGE_RATES_URL: http://host.docker.internal:8889/rates REDIS_URL: redis://shared-redis:6379/1 volumes: - ../private-key.pem:/workspace/private-key.pem @@ -46,9 +50,12 @@ services: ports: - '4003:3003' - '4006:3006' + - '4007:4007' environment: NODE_ENV: development AUTH_DATABASE_URL: postgresql://happy_life_bank_test_auth:happy_life_bank_test_auth@shared-database/happy_life_bank_test_auth AUTH_SERVER_DOMAIN: http://localhost:4006 + # AUTH_SERVER_DOMAIN: http://happy-life-auth:3006 + INTROSPECTION_PORT: 4007 depends_on: - cloud-nine-wallet-test-auth \ No newline at end of file From afaa5946e771278d07b39a099fecd7f26e44a67d Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 1 Mar 2024 12:46:02 -0500 Subject: [PATCH 15/53] chore: upgrade op client --- openapi/auth-server.yaml | 2 +- openapi/schemas.yaml | 7 ++++--- pnpm-lock.yaml | 20 ++++++++++++++++++-- scripts/fetch-schemas.sh | 2 +- test/integration/package.json | 2 +- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/openapi/auth-server.yaml b/openapi/auth-server.yaml index 66129f2f4d..1f868fcea2 100644 --- a/openapi/auth-server.yaml +++ b/openapi/auth-server.yaml @@ -110,7 +110,7 @@ paths: - read identifier: 'https://ilp.rafiki.money/alice' limits: - receiver: 'https://ilp.rafiki.money/connections/45a0d0ee-26dc-4c66-89e0-01fbf93156f7' + receiver: 'https://ilp.rafiki.money/incoming-payments/45a0d0ee-26dc-4c66-89e0-01fbf93156f7' interval: 'R12/2019-08-24T14:15:22Z/P1M' debitAmount: value: '500' diff --git a/openapi/schemas.yaml b/openapi/schemas.yaml index fc0bce4435..c08ff83204 100644 --- a/openapi/schemas.yaml +++ b/openapi/schemas.yaml @@ -40,12 +40,13 @@ components: receiver: title: Receiver type: string - description: The URL of the incoming payment or ILP STREAM connection that is being paid. + description: The URL of the incoming payment that is being paid. format: uri - pattern: '^https://(.+)/(incoming-payments|connections)/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' + pattern: '^(https|http)://(.+)/incoming-payments/(.+)$' examples: - 'https://ilp.rafiki.money/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' - - 'https://ilp.rafiki.money/connections/016da9d5-c9a4-4c80-a354-86b915a04ff8' + - 'http://ilp.rafiki.money/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' + - 'https://ilp.rafiki.money/incoming-payments/1' walletAddress: title: Wallet Address type: string diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f4d2c12f31..efa41767de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -621,8 +621,8 @@ importers: specifier: 2.0.0 version: 2.0.0 '@interledger/open-payments': - specifier: ^6.5.0 - version: 6.6.0 + specifier: ^6.7.0 + version: 6.7.0 '@types/koa': specifier: 2.14.0 version: 2.14.0 @@ -3267,6 +3267,22 @@ packages: transitivePeerDependencies: - debug - supports-color + dev: false + + /@interledger/open-payments@6.7.0: + resolution: {integrity: sha512-ibIpNHNZknhYWCy/SqUNWybwDkkhaM/H9lIXruEKsBogkh5l/ouXw78DrOYuzTTIb+3T4x6LlTJk/PGBht8S8Q==} + dependencies: + '@interledger/http-signature-utils': 2.0.2 + '@interledger/openapi': 1.2.1 + axios: 1.6.7 + base64url: 3.0.1 + http-message-signatures: 0.1.2 + pino: 8.19.0 + uuid: 9.0.1 + transitivePeerDependencies: + - debug + - supports-color + dev: true /@interledger/openapi@1.2.1: resolution: {integrity: sha512-CVEMjLH94svT5ikaojplgZ3YlZAe7ml6G6bt0ZCbqkbwHszUwY1E6RexZZejiGju5QvwS/6Jl/Op5ymv/ECaLg==} diff --git a/scripts/fetch-schemas.sh b/scripts/fetch-schemas.sh index 48530ecf3a..c2b7c57426 100755 --- a/scripts/fetch-schemas.sh +++ b/scripts/fetch-schemas.sh @@ -1,7 +1,7 @@ #!/bin/bash REPO_ROOT=$(git rev-parse --show-toplevel) -BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.5.1}" +BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.7.0}" BASE_URL="https://raw.githubusercontent.com/interledger/open-payments/$BRANCH_OR_TAG" OUT_DIR="$REPO_ROOT/openapi" diff --git a/test/integration/package.json b/test/integration/package.json index 134adbb94e..e80d2b75c3 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.0", - "@interledger/open-payments": "^6.5.0", + "@interledger/open-payments": "^6.7.0", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", "dotenv": "^16.4.1", From 57f7d7faedbd65aaa183da968549032feaff105b Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 1 Mar 2024 13:12:07 -0500 Subject: [PATCH 16/53] feat: partially implemented grant request outgoing payment test --- test/integration/integration.test.ts | 56 ++++++++++++++++--- .../cloud-nine-wallet/docker-compose.yml | 3 +- .../happy-life-bank/docker-compose.yml | 3 +- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 8851cee5ba..a1a7fef352 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -2,13 +2,13 @@ import assert from 'assert' import { OpenPaymentsClientError, isPendingGrant, - WalletAddress + WalletAddress, + Quote } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' import { WebhookEventType } from 'mock-account-servicing-lib' import { wait } from './lib/utils' -import { resourceLimits } from 'worker_threads' // jest.setTimeout(20000) // TODO: remove after fixing tests @@ -24,7 +24,7 @@ describe('Open Payments Flow', (): void => { const receiverOpenPaymentsHost = 'http://localhost:4000' const senderOpenPaymentsAuthHost = 'http://localhost:3006' const senderOpenPaymentsHost = 'http://localhost:3000' - const senderWalletAddressUrl = 'https://localhost:3000/accounts/gfranklin' + const senderWalletAddressUrl = 'http://localhost:3000/accounts/gfranklin' const receiverAssetCode = 'USD' const receiverAssetScale = 2 @@ -43,8 +43,12 @@ describe('Open Payments Flow', (): void => { let continueId: string let tokenId: string + // Assigned in Create Incoming Payment let incomingPaymentId: string + // Assigned in Create Quote + let quote: Quote + beforeAll(async () => { c9 = await MockASE.create(C9_CONFIG) hlb = await MockASE.create(HLB_CONFIG) @@ -197,9 +201,7 @@ describe('Open Payments Flow', (): void => { }) test('Create Quote', async (): Promise => { - // TODO: Got this working with hacky stuff which needs real solutions: - // - changed receiver regex in open payments schema to icnlude http then set this in body: `http://happy-life-bank-test-backend/incoming-payments/${incomingPaymentId}` - const quote = await c9.opClient.quote.create( + quote = await c9.opClient.quote.create( { url: senderOpenPaymentsHost, // TODO: does it need to be https? accessToken @@ -217,7 +219,47 @@ describe('Open Payments Flow', (): void => { }) test('Grant Request Outgoing Payment', async (): Promise => { - expect(true).toBe(false) + const grant = await hlb.opClient.grant.request( + { + url: senderOpenPaymentsAuthHost + }, + { + access_token: { + access: [ + { + type: 'outgoing-payment', + actions: ['create', 'read', 'list'], + identifier: senderWalletAddressUrl, + limits: { + debitAmount: quote.debitAmount, + receiveAmount: quote.receiveAmount + } + } + ] + }, + interact: { + start: ['redirect'], + finish: { + method: 'redirect', + uri: 'https://example.com', + nonce: '456' + } + } + } + ) + + console.log({ grant }) + + assert(!isPendingGrant(grant)) + const continueId_ = grant.continue.uri.split('/').pop() + assert(continueId_) + const tokenId_ = grant.access_token.manage.split('/').pop() + assert(tokenId_) + + accessToken = grant.access_token.value + continueToken = grant.continue.access_token.value + continueId = continueId_ + tokenId = tokenId_ }) // test('Continuation Request', async (): Promise => { diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 21e4380c79..0476724240 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -21,7 +21,8 @@ services: OPEN_PAYMENTS_PORT: 80 DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend OPEN_PAYMENTS_URL: https://localhost:3000 - WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/.well-known/pay + # WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/.well-known/pay + WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/accounts/gfranklin # OPEN_PAYMENTS_URL: http://localhost:3000 # WALLET_ADDRESS_URL: http://cloud-nine-wallet-test-backend/.well-known/pay KEY_ID: rafiki diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index b0fa5dcae4..b793255ed6 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -15,7 +15,8 @@ services: NODE_ENV: development LOG_LEVEL: debug OPEN_PAYMENTS_URL: https://localhost:4000 - WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/.well-known/pay + # WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/.well-known/pay + WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/accounts/pfry # OPEN_PAYMENTS_URL: http://localhost:4000 # WALLET_ADDRESS_URL: http://happy-life-bank-test-backend/.well-known/pay ADMIN_PORT: 3001 From 52f35b965f77e1cf2caab2079389e96c874cb393 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:31:42 -0500 Subject: [PATCH 17/53] feat: rework to host.docker.internal - switches hostname to host.docker.internal to resolve url mismatch problem - finishes grant request outgoing payment test - cleans up some configuration and test variables --- test/integration/lib/config.ts | 20 ++-- ...tegration.test.ts => openPayments.test.ts} | 110 +++++++----------- .../testenv/cloud-nine-wallet/.env.example | 7 ++ .../cloud-nine-wallet/docker-compose.yml | 34 +++--- .../testenv/cloud-nine-wallet/seed.yml | 2 +- .../testenv/happy-life-bank/.env.example | 7 ++ .../happy-life-bank/docker-compose.yml | 43 ++++--- .../testenv/happy-life-bank/seed.yml | 2 +- 8 files changed, 103 insertions(+), 122 deletions(-) rename test/integration/{integration.test.ts => openPayments.test.ts} (60%) create mode 100644 test/integration/testenv/cloud-nine-wallet/.env.example create mode 100644 test/integration/testenv/happy-life-bank/.env.example diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index cb41c1342a..95abbdb116 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -17,6 +17,7 @@ type EnvConfig = { AUTH_SERVER_DOMAIN: string INTEGRATION_SERVER_PORT: string WALLET_ADDRESS_URL: string + GRAPHQL_URL: string KEY_ID: string } const REQUIRED_KEYS: (keyof EnvConfig)[] = [ @@ -24,6 +25,7 @@ const REQUIRED_KEYS: (keyof EnvConfig)[] = [ 'AUTH_SERVER_DOMAIN', 'INTEGRATION_SERVER_PORT', 'WALLET_ADDRESS_URL', + 'GRAPHQL_URL', 'KEY_ID' ] @@ -46,11 +48,7 @@ const loadEnv = (filePath: string): EnvConfig => { return envVars as EnvConfig } -type ConfigOptions = { - graphqlUrl: string -} - -const createConfig = (name: string, opts: ConfigOptions): TestConfig => { +const createConfig = (name: string): TestConfig => { const seedPath = resolve(__dirname, `../testenv/${name}/seed.yml`) const env = loadEnv(resolve(__dirname, `../testenv/${name}/.env`)) const keyPath = resolve(__dirname, `../testenv/private-key.pem`) @@ -63,14 +61,10 @@ const createConfig = (name: string, opts: ConfigOptions): TestConfig => { authServerDomain: env.AUTH_SERVER_DOMAIN, integrationServerPort: parseInt(env.INTEGRATION_SERVER_PORT), walletAddressUrl: env.WALLET_ADDRESS_URL, - keyId: env.KEY_ID, - ...opts + graphqlUrl: env.GRAPHQL_URL, + keyId: env.KEY_ID } } -export const C9_CONFIG: TestConfig = createConfig('cloud-nine-wallet', { - graphqlUrl: 'http://localhost:3001/graphql' -}) -export const HLB_CONFIG: TestConfig = createConfig('happy-life-bank', { - graphqlUrl: 'http://localhost:4001/graphql' -}) +export const C9_CONFIG: TestConfig = createConfig('cloud-nine-wallet') +export const HLB_CONFIG: TestConfig = createConfig('happy-life-bank') diff --git a/test/integration/integration.test.ts b/test/integration/openPayments.test.ts similarity index 60% rename from test/integration/integration.test.ts rename to test/integration/openPayments.test.ts index a1a7fef352..caa9516299 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/openPayments.test.ts @@ -3,6 +3,7 @@ import { OpenPaymentsClientError, isPendingGrant, WalletAddress, + IncomingPayment, Quote } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' @@ -10,45 +11,41 @@ import { MockASE } from './lib/MockASE' import { WebhookEventType } from 'mock-account-servicing-lib' import { wait } from './lib/utils' -// jest.setTimeout(20000) -// TODO: remove after fixing tests -jest.setTimeout(1_000_000) +jest.setTimeout(20000) describe('Open Payments Flow', (): void => { let c9: MockASE let hlb: MockASE - // TODO: can I get this from somewhere instead? config? MockASE accounts? - // From op client responses (ie use receiverWalletAddress.resourceServer instead of receiverOpenPaymentsHost)? - const receiverWalletAddressUrl = 'http://localhost:4000/accounts/pfry' - const receiverOpenPaymentsHost = 'http://localhost:4000' - const senderOpenPaymentsAuthHost = 'http://localhost:3006' - const senderOpenPaymentsHost = 'http://localhost:3000' - const senderWalletAddressUrl = 'http://localhost:3000/accounts/gfranklin' - const receiverAssetCode = 'USD' - const receiverAssetScale = 2 + const receiverWalletAddressUrl = + 'http://host.docker.internal:4000/accounts/pfry' + const senderWalletAddressUrl = + 'http://host.docker.internal:3000/accounts/gfranklin' - // TODO: Figure out a better way to organize tests so that there arent many tests - // with side effects (changing this global state) which subsequent tests rely on. - // Because 🤮 + // TODO: Is there a better way to organize these tests so that there arent many tests + // with side effects (changing this global state) which subsequent tests rely on? In + // some ways these tests should all be 1 since they aren't independant but I would + // prefer not to make them literally 1 test for readability of code and results and + // easier developement and debugging. // Assigned in test: Can Get Existing Wallet Address let receiverWalletAddress: WalletAddress + let senderWalletAddress: WalletAddress // Assigned initially in test: Grant Request Incoming Payment // Then re-assigned in test: Grant Request Quote // - could set new vars but just following whats in postman for now let accessToken: string - let continueToken: string - let continueId: string - let tokenId: string // Assigned in Create Incoming Payment - let incomingPaymentId: string + let incomingPayment: IncomingPayment // Assigned in Create Quote let quote: Quote + // Assigned in Grant Request Outgoing Payment + let continueId: string + beforeAll(async () => { c9 = await MockASE.create(C9_CONFIG) hlb = await MockASE.create(HLB_CONFIG) @@ -63,11 +60,15 @@ describe('Open Payments Flow', (): void => { receiverWalletAddress = await c9.opClient.walletAddress.get({ url: receiverWalletAddressUrl }) - console.log({ receiverWalletAddress }) + senderWalletAddress = await c9.opClient.walletAddress.get({ + url: senderWalletAddressUrl + }) + console.log({ receiverWalletAddress, senderWalletAddress }) // TODO: better expect. // tried jestOpenapi.toSatifyApiSpec but loading throws errors // for invalid spec? something not right there because that works in other pkgs expect(receiverWalletAddress).toBeTruthy() + expect(senderWalletAddress).toBeTruthy() }) // TODO: fix account not found error in webhook handler @@ -80,7 +81,7 @@ describe('Open Payments Flow', (): void => { ) try { walletAddress = await c9.opClient.walletAddress.get({ - url: 'http://localhost:4000/accounts/asmith' + url: 'http://host.docker.internal:4000/accounts/asmith' }) } catch (e) { // 404 error from client is expected - swallow it @@ -99,8 +100,7 @@ describe('Open Payments Flow', (): void => { test('Grant Request Incoming Payment', async (): Promise => { const grant = await c9.opClient.grant.request( { - // url: receiverWalletAddress.authServer - url: 'http://localhost:4006' // should be receiverWalletAddress.authServer but that uses the hostname + url: receiverWalletAddress.authServer }, { access_token: { @@ -114,16 +114,10 @@ describe('Open Payments Flow', (): void => { } ) - assert(!isPendingGrant(grant)) - const continueId_ = grant.continue.uri.split('/').pop() - assert(continueId_) - const tokenId_ = grant.access_token.manage.split('/').pop() - assert(tokenId_) + console.log({ grant }) + assert(!isPendingGrant(grant)) accessToken = grant.access_token.value - continueToken = grant.continue.access_token.value - continueId = continueId_ - tokenId = tokenId_ }) test('Create Incoming Payment', async (): Promise => { @@ -136,32 +130,26 @@ describe('Open Payments Flow', (): void => { 'handleWebhookEvent' ) - const incomingPayment = await c9.opClient.incomingPayment.create( + incomingPayment = await c9.opClient.incomingPayment.create( { - url: receiverOpenPaymentsHost, + url: receiverWalletAddress.resourceServer, accessToken }, { - // TODO: Improve this (calling https when we use http elsewhere) - // requires https because thats whats in the DB because wallet addresses must be created as https (isValidWalletAddressUrl) - // Comes from OPEN_PAYMENTS_URL env var and seed data. - walletAddress: 'https://localhost:4000/accounts/pfry', - // walletAddress: receiverWalletAddressUrl, + walletAddress: receiverWalletAddressUrl.replace('http', 'https'), incomingAmount: { value: '100', - assetCode: receiverAssetCode, - assetScale: receiverAssetScale + assetCode: receiverWalletAddress.assetCode, + assetScale: receiverWalletAddress.assetScale }, metadata: { description: 'Free Money!' }, expiresAt: tomorrow.toISOString() } ) - const incomingPaymentId_ = incomingPayment.id.split('/').pop() - assert(incomingPaymentId_) - incomingPaymentId = incomingPaymentId_ + console.log({ incomingPayment }) - // Delay to ensure webhook is received + // Delay gives time for webhook to be received await wait(1000) expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ @@ -174,7 +162,7 @@ describe('Open Payments Flow', (): void => { test('Grant Request Quote', async (): Promise => { const grant = await c9.opClient.grant.request( { - url: senderOpenPaymentsAuthHost + url: senderWalletAddress.authServer }, { access_token: { @@ -188,40 +176,32 @@ describe('Open Payments Flow', (): void => { } ) - assert(!isPendingGrant(grant)) - const continueId_ = grant.continue.uri.split('/').pop() - assert(continueId_) - const tokenId_ = grant.access_token.manage.split('/').pop() - assert(tokenId_) + console.log(JSON.stringify(grant, null, 2)) + assert(!isPendingGrant(grant)) accessToken = grant.access_token.value - continueToken = grant.continue.access_token.value - continueId = continueId_ - tokenId = tokenId_ }) test('Create Quote', async (): Promise => { quote = await c9.opClient.quote.create( { - url: senderOpenPaymentsHost, // TODO: does it need to be https? + url: senderWalletAddress.resourceServer, accessToken }, { - // TODO: Improve this (calling https when we use http elsewhere) - // requires https because thats whats in the DB because wallet addresses must be created as https (isValidWalletAddressUrl) - // Comes from OPEN_PAYMENTS_URL env var and seed data. - walletAddress: 'https://localhost:3000/accounts/gfranklin', - receiver: `http://happy-life-bank-test-backend/incoming-payments/${incomingPaymentId}`, + walletAddress: senderWalletAddressUrl.replace('http', 'https'), + receiver: incomingPayment.id.replace('https', 'http'), method: 'ilp' } ) - // TODO: assertions. what to check that isnt tested by virtue of future tests passing? + + console.log({ quote }) }) test('Grant Request Outgoing Payment', async (): Promise => { const grant = await hlb.opClient.grant.request( { - url: senderOpenPaymentsAuthHost + url: senderWalletAddress.authServer }, { access_token: { @@ -250,16 +230,10 @@ describe('Open Payments Flow', (): void => { console.log({ grant }) - assert(!isPendingGrant(grant)) + assert(isPendingGrant(grant)) const continueId_ = grant.continue.uri.split('/').pop() assert(continueId_) - const tokenId_ = grant.access_token.manage.split('/').pop() - assert(tokenId_) - - accessToken = grant.access_token.value - continueToken = grant.continue.access_token.value continueId = continueId_ - tokenId = tokenId_ }) // test('Continuation Request', async (): Promise => { diff --git a/test/integration/testenv/cloud-nine-wallet/.env.example b/test/integration/testenv/cloud-nine-wallet/.env.example new file mode 100644 index 0000000000..edc1fb68b0 --- /dev/null +++ b/test/integration/testenv/cloud-nine-wallet/.env.example @@ -0,0 +1,7 @@ +OPEN_PAYMENTS_URL=https://host.docker.internal:3000 +AUTH_SERVER_DOMAIN=http://host.docker.internal:3006 +INTEGRATION_SERVER_PORT=8888 +WALLET_ADDRESS_URL=https://host.docker.internal:3000/.well-known/pay +GRAPHQL_URL=http://host.docker.internal:3001/graphql +# matches pfry key id +KEY_ID=keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5 \ No newline at end of file diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index 0476724240..aa2d7ae53b 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -9,33 +9,30 @@ services: restart: always privileged: true ports: - - '3000:80' + - '3000:3000' - '3001:3001' - '3002:3002' networks: - rafiki-test + extra_hosts: + - 'host.docker.internal:host-gateway' environment: LOG_LEVEL: debug - NODE_ENV: ${NODE_ENV:-development} + NODE_ENV: development + CONNECTOR_PORT: 3002 ADMIN_PORT: 3001 - OPEN_PAYMENTS_PORT: 80 + OPEN_PAYMENTS_PORT: 3000 DATABASE_URL: postgresql://cloud_nine_wallet_test_backend:cloud_nine_wallet_test_backend@shared-database/cloud_nine_wallet_test_backend - OPEN_PAYMENTS_URL: https://localhost:3000 - # WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/.well-known/pay - WALLET_ADDRESS_URL: https://cloud-nine-wallet-test-backend/accounts/gfranklin - # OPEN_PAYMENTS_URL: http://localhost:3000 - # WALLET_ADDRESS_URL: http://cloud-nine-wallet-test-backend/.well-known/pay - KEY_ID: rafiki + OPEN_PAYMENTS_URL: https://host.docker.internal:3000 + WALLET_ADDRESS_URL: https://host.docker.internal:3000/.well-known/pay + # matches pfry key id + KEY_ID: keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5 PRIVATE_KEY_FILE: /workspace/private-key.pem - # AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3006 - AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3007 - AUTH_SERVER_GRANT_URL: http://localhost:3006 - # AUTH_SERVER_INTROSPECTION_URL: http://localhost:3007 + AUTH_SERVER_INTROSPECTION_URL: http://host.docker.internal:3007 + AUTH_SERVER_GRANT_URL: http://host.docker.internal:3006 ILP_ADDRESS: test.cloud-nine-wallet-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://host.docker.internal:8888/webhooks - # TODO: should point to the integration ASE, similar to webhook url - # EXCHANGE_RATES_URL: http://cloud-nine-wallet-test/rates EXCHANGE_RATES_URL: http://host.docker.internal:8888/rates REDIS_URL: redis://shared-redis:6379/0 volumes: @@ -56,11 +53,14 @@ services: - '3003:3003' - '3006:3006' - '3007:3007' + extra_hosts: + - 'host.docker.internal:host-gateway' environment: NODE_ENV: ${NODE_ENV:-development} - AUTH_SERVER_DOMAIN: http://localhost:3006 - # AUTH_SERVER_DOMAIN: http://cloud-nine-wallet-test-auth:3006 + AUTH_SERVER_DOMAIN: http://host.docker.internal:3006 AUTH_DATABASE_URL: postgresql://cloud_nine_wallet_test_auth:cloud_nine_wallet_test_auth@shared-database/cloud_nine_wallet_test_auth INTROSPECTION_PORT: 3007 + AUTH_PORT: 3006 + ADMIN_PORT: 3003 depends_on: - shared-database \ No newline at end of file diff --git a/test/integration/testenv/cloud-nine-wallet/seed.yml b/test/integration/testenv/cloud-nine-wallet/seed.yml index 2de21ca382..3419f16034 100644 --- a/test/integration/testenv/cloud-nine-wallet/seed.yml +++ b/test/integration/testenv/cloud-nine-wallet/seed.yml @@ -18,7 +18,7 @@ assets: peeringAsset: 'USD' peers: - initialLiquidity: '100000' - peerUrl: http://happy-life-bank-test-backend:3002 + peerUrl: http://host.docker.internal:4002 peerIlpAddress: test.happy-life-bank-test liquidityThreshold: 10000 accounts: diff --git a/test/integration/testenv/happy-life-bank/.env.example b/test/integration/testenv/happy-life-bank/.env.example new file mode 100644 index 0000000000..83cc2ecef7 --- /dev/null +++ b/test/integration/testenv/happy-life-bank/.env.example @@ -0,0 +1,7 @@ +OPEN_PAYMENTS_URL=https://host.docker.internal:4000 +AUTH_SERVER_DOMAIN=http://host.docker.internal:4006 +INTEGRATION_SERVER_PORT=8889 +WALLET_ADDRESS_URL=https://host.docker.internal:4000/accounts/pfry +GRAPHQL_URL=http://host.docker.internal:4001/graphql +# matches pfry key id +KEY_ID=keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5 \ No newline at end of file diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index b793255ed6..69fa767131 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -7,34 +7,30 @@ services: restart: always privileged: true ports: - - "4000:80" - - "4001:3001" + - "4000:4000" + - "4001:4001" + - "4002:4002" networks: - rafiki-test + extra_hosts: + - 'host.docker.internal:host-gateway' environment: NODE_ENV: development LOG_LEVEL: debug - OPEN_PAYMENTS_URL: https://localhost:4000 - # WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/.well-known/pay - WALLET_ADDRESS_URL: https://happy-life-bank-test-backend/accounts/pfry - # OPEN_PAYMENTS_URL: http://localhost:4000 - # WALLET_ADDRESS_URL: http://happy-life-bank-test-backend/.well-known/pay - ADMIN_PORT: 3001 - CONNECTOR_PORT: 3002 - OPEN_PAYMENTS_PORT: 80 + OPEN_PAYMENTS_URL: https://host.docker.internal:4000 + WALLET_ADDRESS_URL: https://host.docker.internal:4000/.well-known/pay + ADMIN_PORT: 4001 + CONNECTOR_PORT: 4002 + OPEN_PAYMENTS_PORT: 4000 DATABASE_URL: postgresql://happy_life_bank_test_backend:happy_life_bank_test_backend@shared-database/happy_life_bank_test_backend - # AUTH_SERVER_GRANT_URL: http://localhost:4006 - AUTH_SERVER_GRANT_URL: http://happy-life-auth:3006 - # AUTH_SERVER_INTROSPECTION_URL: http://localhost:4007 - # AUTH_SERVER_GRANT_URL: http://happy-life-bank-test-auth:4006 - AUTH_SERVER_INTROSPECTION_URL: http://happy-life-bank-test-auth:4007 - KEY_ID: rafiki + AUTH_SERVER_GRANT_URL: http://host.docker.internal:4006 + AUTH_SERVER_INTROSPECTION_URL: http://host.docker.internal:4007 + # matches pfry key id + KEY_ID: keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5 PRIVATE_KEY_FILE: /workspace/private-key.pem ILP_ADDRESS: test.happy-life-bank-test STREAM_SECRET: BjPXtnd00G2mRQwP/8ZpwyZASOch5sUXT5o0iR5b5wU= WEBHOOK_URL: http://host.docker.internal:8889/webhooks - # TODO: should point to the integration ASE, similar to webhook url - # EXCHANGE_RATES_URL: http://happy-life-bank-test/rates EXCHANGE_RATES_URL: http://host.docker.internal:8889/rates REDIS_URL: redis://shared-redis:6379/1 volumes: @@ -49,14 +45,17 @@ services: networks: - rafiki-test ports: - - '4003:3003' - - '4006:3006' + - '4003:4003' + - '4006:4006' - '4007:4007' + extra_hosts: + - 'host.docker.internal:host-gateway' environment: NODE_ENV: development AUTH_DATABASE_URL: postgresql://happy_life_bank_test_auth:happy_life_bank_test_auth@shared-database/happy_life_bank_test_auth - AUTH_SERVER_DOMAIN: http://localhost:4006 - # AUTH_SERVER_DOMAIN: http://happy-life-auth:3006 + AUTH_SERVER_DOMAIN: http://host.docker.internal:4006 INTROSPECTION_PORT: 4007 + ADMIN_PORT: 4003 + AUTH_PORT: 4006 depends_on: - cloud-nine-wallet-test-auth \ No newline at end of file diff --git a/test/integration/testenv/happy-life-bank/seed.yml b/test/integration/testenv/happy-life-bank/seed.yml index 9d881dbcc8..2da51e7caa 100644 --- a/test/integration/testenv/happy-life-bank/seed.yml +++ b/test/integration/testenv/happy-life-bank/seed.yml @@ -18,7 +18,7 @@ assets: peeringAsset: 'USD' peers: - initialLiquidity: '1000000000000' - peerUrl: http://cloud-nine-wallet-test-backend:3002 + peerUrl: http://host.docker.internal:3002 peerIlpAddress: test.cloud-nine-wallet-test liquidityThreshold: 100000 accounts: From 83dc970fb8c5ef7e38e206b4cfc0a16b78830dc7 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 5 Mar 2024 13:56:51 -0500 Subject: [PATCH 18/53] feat: add p2p flow test --- .../mock-account-servicing-lib/src/index.ts | 3 +- pnpm-lock.yaml | 8 +- test/integration/endToEnd.test.ts | 348 ++++++++++++++++++ test/integration/lib/IntegrationServer.ts | 118 +++++- test/integration/lib/MockASE.ts | 7 +- test/integration/lib/apolloClient.ts | 204 +++++++++- test/integration/openPayments.test.ts | 246 ------------- test/integration/package.json | 2 + 8 files changed, 676 insertions(+), 260 deletions(-) create mode 100644 test/integration/endToEnd.test.ts delete mode 100644 test/integration/openPayments.test.ts diff --git a/packages/mock-account-servicing-lib/src/index.ts b/packages/mock-account-servicing-lib/src/index.ts index 9e90ba355b..ab9486dc61 100644 --- a/packages/mock-account-servicing-lib/src/index.ts +++ b/packages/mock-account-servicing-lib/src/index.ts @@ -1,4 +1,5 @@ -export { Peering, Account, Config } from './types' +export { Peering, Account, Config, Webhook } from './types' +export * as GraphqlTypes from './generated/graphql' export { AccountProvider } from './AccountProvider' export { setupFromSeed } from './setupFromSeed' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 747d63f523..a71ac142ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -629,6 +629,9 @@ importers: '@types/koa-bodyparser': specifier: ^4.3.12 version: 4.3.12 + '@types/uuid': + specifier: ^9.0.8 + version: 9.0.8 dotenv: specifier: ^16.4.1 version: 16.4.5 @@ -641,6 +644,9 @@ importers: mock-account-servicing-lib: specifier: workspace:* version: link:../../packages/mock-account-servicing-lib + uuid: + specifier: ^9.0.1 + version: 9.0.1 yaml: specifier: ^2.3.4 version: 2.4.0 @@ -5420,7 +5426,7 @@ packages: '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) '@vanilla-extract/babel-plugin-debug-ids': 1.0.5 '@vanilla-extract/css': 1.14.1 - esbuild: 0.17.6 + esbuild: 0.19.12 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 diff --git a/test/integration/endToEnd.test.ts b/test/integration/endToEnd.test.ts new file mode 100644 index 0000000000..0b7e723fa5 --- /dev/null +++ b/test/integration/endToEnd.test.ts @@ -0,0 +1,348 @@ +import assert from 'assert' +import { + OpenPaymentsClientError, + isPendingGrant, + WalletAddress, + IncomingPayment, + Quote +} from '@interledger/open-payments' +import { C9_CONFIG, HLB_CONFIG } from './lib/config' +import { MockASE } from './lib/MockASE' +import { GraphqlTypes, WebhookEventType } from 'mock-account-servicing-lib' +import { wait } from './lib/utils' + +jest.setTimeout(20000) + +describe('End-to-end tests', (): void => { + let c9: MockASE + let hlb: MockASE + + beforeAll(async () => { + c9 = await MockASE.create(C9_CONFIG) + hlb = await MockASE.create(HLB_CONFIG) + }) + + afterAll(async () => { + c9.shutdown() + hlb.shutdown() + }) + + describe('Open Payments Flow', (): void => { + const receiverWalletAddressUrl = + 'http://host.docker.internal:4000/accounts/pfry' + const senderWalletAddressUrl = + 'http://host.docker.internal:3000/accounts/gfranklin' + + // TODO: Is there a better way to organize these tests so that there arent many tests + // with side effects (changing this global state) which subsequent tests rely on? In + // some ways these tests should all be 1 since they aren't independant but I would + // prefer not to make them literally 1 test for readability of code and results and + // easier developement and debugging. + + // Assigned in test: Can Get Existing Wallet Address + let receiverWalletAddress: WalletAddress + let senderWalletAddress: WalletAddress + + // Assigned initially in test: Grant Request Incoming Payment + // Then re-assigned in test: Grant Request Quote + // - could set new vars but just following whats in postman for now + let accessToken: string + + // Assigned in Create Incoming Payment + let incomingPayment: IncomingPayment + + // Assigned in Create Quote + let quote: Quote + + // Assigned in Grant Request Outgoing Payment + let continueId: string + + test('Can Get Existing Wallet Address', async (): Promise => { + receiverWalletAddress = await c9.opClient.walletAddress.get({ + url: receiverWalletAddressUrl + }) + senderWalletAddress = await c9.opClient.walletAddress.get({ + url: senderWalletAddressUrl + }) + console.log({ receiverWalletAddress, senderWalletAddress }) + // TODO: better expect. + // tried jestOpenapi.toSatifyApiSpec but loading throws errors + // for invalid spec? something not right there because that works in other pkgs + expect(receiverWalletAddress).toBeTruthy() + expect(senderWalletAddress).toBeTruthy() + }) + + // TODO: fix account not found error in webhook handler + test.skip('Get Non-Existing Wallet Address Triggers Not Found Webhook Event', async (): Promise => { + let walletAddress + + const handleWebhookEventSpy = jest.spyOn( + c9.integrationServer.webhookEventHandler, + 'handleWebhookEvent' + ) + try { + walletAddress = await c9.opClient.walletAddress.get({ + url: 'http://host.docker.internal:4000/accounts/asmith' + }) + } catch (e) { + // 404 error from client is expected - swallow it + if (!(e instanceof OpenPaymentsClientError)) throw e + } + + expect(walletAddress).toBeUndefined() + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.WalletAddressNotFound, + data: expect.any(Object) + }) + ) + }) + + test('Grant Request Incoming Payment', async (): Promise => { + const grant = await c9.opClient.grant.request( + { + url: receiverWalletAddress.authServer + }, + { + access_token: { + access: [ + { + type: 'incoming-payment', + actions: ['create', 'read', 'list', 'complete'] + } + ] + } + } + ) + + console.log({ grant }) + + assert(!isPendingGrant(grant)) + accessToken = grant.access_token.value + }) + + test('Create Incoming Payment', async (): Promise => { + const now = new Date() + const tomorrow = new Date(now) + tomorrow.setDate(now.getDate() + 1) + + const handleWebhookEventSpy = jest.spyOn( + hlb.integrationServer.webhookEventHandler, + 'handleWebhookEvent' + ) + + incomingPayment = await c9.opClient.incomingPayment.create( + { + url: receiverWalletAddress.resourceServer, + accessToken + }, + { + walletAddress: receiverWalletAddressUrl.replace('http', 'https'), + incomingAmount: { + value: '100', + assetCode: receiverWalletAddress.assetCode, + assetScale: receiverWalletAddress.assetScale + }, + metadata: { description: 'Free Money!' }, + expiresAt: tomorrow.toISOString() + } + ) + + console.log({ incomingPayment }) + + // Delay gives time for webhook to be received + await wait(1000) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.IncomingPaymentCreated, + data: expect.any(Object) + }) + ) + }) + + test('Grant Request Quote', async (): Promise => { + const grant = await c9.opClient.grant.request( + { + url: senderWalletAddress.authServer + }, + { + access_token: { + access: [ + { + type: 'quote', + actions: ['read', 'create'] + } + ] + } + } + ) + + console.log(JSON.stringify(grant, null, 2)) + + assert(!isPendingGrant(grant)) + accessToken = grant.access_token.value + }) + + test('Create Quote', async (): Promise => { + quote = await c9.opClient.quote.create( + { + url: senderWalletAddress.resourceServer, + accessToken + }, + { + walletAddress: senderWalletAddressUrl.replace('http', 'https'), + receiver: incomingPayment.id.replace('https', 'http'), + method: 'ilp' + } + ) + + console.log({ quote }) + }) + + test('Grant Request Outgoing Payment', async (): Promise => { + const grant = await hlb.opClient.grant.request( + { + url: senderWalletAddress.authServer + }, + { + access_token: { + access: [ + { + type: 'outgoing-payment', + actions: ['create', 'read', 'list'], + identifier: senderWalletAddressUrl, + limits: { + debitAmount: quote.debitAmount, + receiveAmount: quote.receiveAmount + } + } + ] + }, + interact: { + start: ['redirect'], + finish: { + method: 'redirect', + uri: 'https://example.com', + nonce: '456' + } + } + } + ) + + console.log({ grant }) + + assert(isPendingGrant(grant)) + const continueId_ = grant.continue.uri.split('/').pop() + assert(continueId_) + continueId = continueId_ + }) + // test('Continuation Request', async (): Promise => { + // expect(true).toBe(true) + // }) + + // test('Create Outgoing Payment', async (): Promise => { + // expect(true).toBe(true) + // }) + }) + + describe('Peer to Peer Flow', (): void => { + const receiverWalletAddressUrl = + 'https://host.docker.internal:4000/accounts/pfry' + const amountValueToSend = '500' + + let gfranklinWalletAddressId: string + let receiver: GraphqlTypes.Receiver + let quote: GraphqlTypes.Quote + let outgoingPayment: GraphqlTypes.OutgoingPayment + + beforeAll(async () => { + const gfranklinWalletAddress = await c9.accounts.getByWalletAddressUrl( + 'https://host.docker.internal:3000/accounts/gfranklin' + ) + assert(gfranklinWalletAddress?.walletAddressID) + gfranklinWalletAddressId = gfranklinWalletAddress.walletAddressID + }) + + test('Create Receiver (remote Incoming Payment)', async (): Promise => { + const handleWebhookEventSpy = jest.spyOn( + hlb.integrationServer.webhookEventHandler, + 'handleWebhookEvent' + ) + const response = await c9.adminClient.createReceiver({ + metadata: { + description: 'For lunch!' + }, + incomingAmount: { + assetCode: 'USD', + assetScale: 2, + value: amountValueToSend as unknown as bigint + }, + walletAddressUrl: receiverWalletAddressUrl + }) + + expect(response.code).toBe('200') + assert(response.receiver) + + receiver = response.receiver + + // Delay gives time for webhook to be received + await wait(1000) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.IncomingPaymentCreated, + data: expect.any(Object) + }) + ) + }) + test('Create Quote', async (): Promise => { + const response = await c9.adminClient.createQuote({ + walletAddressId: gfranklinWalletAddressId, + receiver: receiver.id + }) + + expect(response.code).toBe('200') + assert(response.quote) + + quote = response.quote + }) + test('Create Outgoing Payment', async (): Promise => { + const handleWebhookEventSpy = jest.spyOn( + c9.integrationServer.webhookEventHandler, + 'handleWebhookEvent' + ) + + const response = await c9.adminClient.createOutgoingPayment({ + walletAddressId: gfranklinWalletAddressId, + quoteId: quote.id + }) + + expect(response.code).toBe('200') + assert(response.payment) + + outgoingPayment = response.payment + + // Delay gives time for payment to complete and for webhooks to be received + await wait(1000) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.OutgoingPaymentCreated, + data: expect.any(Object) + }) + ) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.OutgoingPaymentCompleted, + data: expect.any(Object) + }) + ) + }) + test('Get Outgoing Payment', async (): Promise => { + const payment = await c9.adminClient.getOutgoingPayment( + outgoingPayment.id + ) + expect(payment.state).toBe(GraphqlTypes.OutgoingPaymentState.Completed) + expect(payment.receiveAmount.value).toBe(amountValueToSend) + expect(payment.sentAmount.value).toBe(amountValueToSend) + }) + }) +}) diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index c68b1f121b..63f83a7db8 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -1,13 +1,14 @@ import Koa from 'koa' import bodyParser from 'koa-bodyparser' import http from 'http' +import { v4 as uuid } from 'uuid' import { AccountProvider, WebhookEventType, Webhook } from 'mock-account-servicing-lib' -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { TestConfig } from './config' +import { AdminClient } from './apolloClient' export class IntegrationServer { private config: TestConfig @@ -17,13 +18,13 @@ export class IntegrationServer { constructor( config: TestConfig, - apolloClient: ApolloClient, + adminClient: AdminClient, accounts: AccountProvider ) { this.config = config this.app = new Koa() this.app.use(bodyParser()) - this.webhookEventHandler = new WebhookEventHandler(apolloClient, accounts) + this.webhookEventHandler = new WebhookEventHandler(adminClient, accounts) } public start(port: number): void { @@ -83,25 +84,35 @@ export class IntegrationServer { } export class WebhookEventHandler { - private apolloClient: ApolloClient + private adminClient: AdminClient private accounts: AccountProvider - constructor( - apolloClient: ApolloClient, - accounts: AccountProvider - ) { - this.apolloClient = apolloClient + constructor(adminClient: AdminClient, accounts: AccountProvider) { + this.adminClient = adminClient this.accounts = accounts } public async handleWebhookEvent(webhookEvent: Webhook) { + console.log('handling webhook') + console.log((await this.accounts.listAll())[0].walletAddress) switch (webhookEvent.type) { case WebhookEventType.WalletAddressNotFound: await this.handleWalletAddressNotFound(webhookEvent) break case WebhookEventType.IncomingPaymentCreated: + console.log('incoming payment created') // await this.handleIncomingPaymentCreated(webhookEvent) break + case WebhookEventType.IncomingPaymentCompleted: + console.log('incoming payemnt completed') + break + case WebhookEventType.OutgoingPaymentCreated: + console.log('outgoing payemnt created') + await this.handleOutgoingPaymentCreated(webhookEvent) + break + case WebhookEventType.OutgoingPaymentCompleted: + console.log('outgoing payemnt completed') + break default: console.log(`unknown event type: ${webhookEvent.type}`) } @@ -124,6 +135,95 @@ export class WebhookEventHandler { // TODO: create wallet address via apolloClient } + private async handleOutgoingPaymentCreated(webhookEvent: Webhook) { + if (webhookEvent.type !== WebhookEventType.OutgoingPaymentCreated) { + throw new Error( + 'Invalid event type when handling outgoing payment webhook' + ) + } + + const payment = webhookEvent.data + const walletAddressId = payment['walletAddressId'] as string + const account = await this.accounts.getByWalletAddressId(walletAddressId) + + if (!account) { + throw new Error('No account found for wallet address') + } + + if (typeof payment.id !== 'string' || !payment.id) { + throw new Error('No payment id found') + } + + let amount: bigint + try { + amount = BigInt((payment.debitAmount as { value: string }).value) + } catch (err) { + throw new Error('Invalid debitAmount on payment') + } + + await this.accounts.pendingDebit(account.id, amount) + + const response = await this.adminClient.depositOutgoingPaymentLiquidity({ + outgoingPaymentId: payment.id, + idempotencyKey: uuid() + }) + + if (response.code !== '200') { + const msg = 'Deposit outgoing payment liquidity failed' + console.log(msg, { response }) + throw new Error(msg) + } + + // TODO: remove this debug log + console.log({ response }) + + return + } + + // private async handleOutgoingPaymentCompletedFailed(webhookEvent: Webhook) { + // const payment = webhookEvent.data + // const walletAddressId = payment.walletAddressId + // if (typeof walletAddressId !== 'string') { + // throw new Error('No walletAddressId found') + // } + // const account = await this.accounts.getByWalletAddressId(walletAddressId) + + // if (!account) { + // throw new Error( + // `No account found for walletAddressId: ${walletAddressId}` + // ) + // } + + // console.log({ + // 'payment.sentAmount': payment.sentAmount, + // 'payment.debitAmount': payment.debitAmount + // }) + + // // 'payment.sentAmount': { value: '0', assetCode: 'USD', assetScale: 2 }, + // // 'payment.debitAmount': { value: '617', assetCode: 'USD', assetScale: 2 } + + // let sentAmount: bigint + // let debitAmount: bigint + + // try { + // sentAmount = BigInt((payment.sentAmount as any).value) + // debitAmount = BigInt((payment.debitAmount as any).value) + // } catch (err) { + // throw new Error('Invalid sentAmount or debitAmount') + // } + + // const toVoid = debitAmount - sentAmount + + // await this.accounts.debit(account.id, sentAmount, true) + // if (toVoid > 0) { + // await this.accounts.voidPendingDebit(account.id, toVoid) + // } + + // // TODO: withdraw remaining liquidity + + // return + // } + // private async handleIncomingPaymentCreated(webhookEvent: Webhook) { // console.log('handleIncomingPaymentCreated') // console.log({ webhookEvent }) diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index 7bb3609582..a52db28567 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -4,7 +4,7 @@ import { createAuthenticatedClient } from '@interledger/open-payments' import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' -import { createApolloClient } from './apolloClient' +import { AdminClient, createApolloClient } from './apolloClient' import { IntegrationServer } from './IntegrationServer' import { TestConfig } from './config' @@ -12,6 +12,8 @@ import { TestConfig } from './config' export class MockASE { private config: TestConfig private apolloClient: ApolloClient + + public adminClient: AdminClient public accounts: AccountProvider public opClient!: AuthenticatedClient public integrationServer: IntegrationServer @@ -28,10 +30,11 @@ export class MockASE { private constructor(config: TestConfig) { this.config = config this.apolloClient = createApolloClient(config.graphqlUrl) + this.adminClient = new AdminClient(this.apolloClient) this.accounts = new AccountProvider() this.integrationServer = new IntegrationServer( this.config, - this.apolloClient, + this.adminClient, this.accounts ) this.integrationServer.start(this.config.integrationServerPort) diff --git a/test/integration/lib/apolloClient.ts b/test/integration/lib/apolloClient.ts index 6ef4647bd8..f6cd728053 100644 --- a/test/integration/lib/apolloClient.ts +++ b/test/integration/lib/apolloClient.ts @@ -1,5 +1,6 @@ import type { NormalizedCacheObject } from '@apollo/client' -import { ApolloClient, InMemoryCache } from '@apollo/client' +import { ApolloClient, InMemoryCache, gql } from '@apollo/client' +import { GraphqlTypes } from 'mock-account-servicing-lib' export function createApolloClient( graphqlUrl: string @@ -20,3 +21,204 @@ export function createApolloClient( } }) } + +export class AdminClient { + private apolloClient: ApolloClient + + constructor(apolloClient: ApolloClient) { + this.apolloClient = apolloClient + } + + async createReceiver( + input: GraphqlTypes.CreateReceiverInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateReceiver($input: CreateReceiverInput!) { + createReceiver(input: $input) { + code + message + receiver { + completed + createdAt + expiresAt + metadata + id + incomingAmount { + assetCode + assetScale + value + } + walletAddressUrl + receivedAmount { + assetCode + assetScale + value + } + updatedAt + } + success + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.CreateReceiverResponse => { + return data.createReceiver + }) + } + + async createQuote( + input: GraphqlTypes.CreateQuoteInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateQuote($input: CreateQuoteInput!) { + createQuote(input: $input) { + code + message + quote { + createdAt + expiresAt + highEstimatedExchangeRate + id + lowEstimatedExchangeRate + maxPacketAmount + minExchangeRate + walletAddressId + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + } + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.QuoteResponse => { + return data.createQuote + }) + } + + async createOutgoingPayment( + input: GraphqlTypes.CreateOutgoingPaymentInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateOutgoingPayment($input: CreateOutgoingPaymentInput!) { + createOutgoingPayment(input: $input) { + code + message + payment { + createdAt + error + metadata + id + walletAddressId + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + sentAmount { + assetCode + assetScale + value + } + state + stateAttempts + } + success + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.OutgoingPaymentResponse => { + return data.createOutgoingPayment + }) + } + + async getOutgoingPayment(id: string): Promise { + return await this.apolloClient + .query({ + query: gql` + query GetOutgoingPayment($id: String!) { + outgoingPayment(id: $id) { + createdAt + error + metadata + id + walletAddressId + quote { + id + } + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + sentAmount { + assetCode + assetScale + value + } + state + stateAttempts + } + } + `, + variables: { id } + }) + .then((response): GraphqlTypes.OutgoingPayment => { + return response.data.outgoingPayment + }) + } + + async depositOutgoingPaymentLiquidity( + input: GraphqlTypes.DepositOutgoingPaymentLiquidityInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation DepositOutgoingPaymentLiquidity( + $input: DepositOutgoingPaymentLiquidityInput! + ) { + depositOutgoingPaymentLiquidity(input: $input) { + code + success + message + error + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.LiquidityMutationResponse => { + return data.depositOutgoingPaymentLiquidity + }) + } +} diff --git a/test/integration/openPayments.test.ts b/test/integration/openPayments.test.ts deleted file mode 100644 index caa9516299..0000000000 --- a/test/integration/openPayments.test.ts +++ /dev/null @@ -1,246 +0,0 @@ -import assert from 'assert' -import { - OpenPaymentsClientError, - isPendingGrant, - WalletAddress, - IncomingPayment, - Quote -} from '@interledger/open-payments' -import { C9_CONFIG, HLB_CONFIG } from './lib/config' -import { MockASE } from './lib/MockASE' -import { WebhookEventType } from 'mock-account-servicing-lib' -import { wait } from './lib/utils' - -jest.setTimeout(20000) - -describe('Open Payments Flow', (): void => { - let c9: MockASE - let hlb: MockASE - - const receiverWalletAddressUrl = - 'http://host.docker.internal:4000/accounts/pfry' - const senderWalletAddressUrl = - 'http://host.docker.internal:3000/accounts/gfranklin' - - // TODO: Is there a better way to organize these tests so that there arent many tests - // with side effects (changing this global state) which subsequent tests rely on? In - // some ways these tests should all be 1 since they aren't independant but I would - // prefer not to make them literally 1 test for readability of code and results and - // easier developement and debugging. - - // Assigned in test: Can Get Existing Wallet Address - let receiverWalletAddress: WalletAddress - let senderWalletAddress: WalletAddress - - // Assigned initially in test: Grant Request Incoming Payment - // Then re-assigned in test: Grant Request Quote - // - could set new vars but just following whats in postman for now - let accessToken: string - - // Assigned in Create Incoming Payment - let incomingPayment: IncomingPayment - - // Assigned in Create Quote - let quote: Quote - - // Assigned in Grant Request Outgoing Payment - let continueId: string - - beforeAll(async () => { - c9 = await MockASE.create(C9_CONFIG) - hlb = await MockASE.create(HLB_CONFIG) - }) - - afterAll(async () => { - c9.shutdown() - hlb.shutdown() - }) - - test('Can Get Existing Wallet Address', async (): Promise => { - receiverWalletAddress = await c9.opClient.walletAddress.get({ - url: receiverWalletAddressUrl - }) - senderWalletAddress = await c9.opClient.walletAddress.get({ - url: senderWalletAddressUrl - }) - console.log({ receiverWalletAddress, senderWalletAddress }) - // TODO: better expect. - // tried jestOpenapi.toSatifyApiSpec but loading throws errors - // for invalid spec? something not right there because that works in other pkgs - expect(receiverWalletAddress).toBeTruthy() - expect(senderWalletAddress).toBeTruthy() - }) - - // TODO: fix account not found error in webhook handler - test.skip('Get Non-Existing Wallet Address Triggers Not Found Webhook Event', async (): Promise => { - let walletAddress - - const handleWebhookEventSpy = jest.spyOn( - c9.integrationServer.webhookEventHandler, - 'handleWebhookEvent' - ) - try { - walletAddress = await c9.opClient.walletAddress.get({ - url: 'http://host.docker.internal:4000/accounts/asmith' - }) - } catch (e) { - // 404 error from client is expected - swallow it - if (!(e instanceof OpenPaymentsClientError)) throw e - } - - expect(walletAddress).toBeUndefined() - expect(handleWebhookEventSpy).toHaveBeenCalledWith( - expect.objectContaining({ - type: WebhookEventType.WalletAddressNotFound, - data: expect.any(Object) - }) - ) - }) - - test('Grant Request Incoming Payment', async (): Promise => { - const grant = await c9.opClient.grant.request( - { - url: receiverWalletAddress.authServer - }, - { - access_token: { - access: [ - { - type: 'incoming-payment', - actions: ['create', 'read', 'list', 'complete'] - } - ] - } - } - ) - - console.log({ grant }) - - assert(!isPendingGrant(grant)) - accessToken = grant.access_token.value - }) - - test('Create Incoming Payment', async (): Promise => { - const now = new Date() - const tomorrow = new Date(now) - tomorrow.setDate(now.getDate() + 1) - - const handleWebhookEventSpy = jest.spyOn( - hlb.integrationServer.webhookEventHandler, - 'handleWebhookEvent' - ) - - incomingPayment = await c9.opClient.incomingPayment.create( - { - url: receiverWalletAddress.resourceServer, - accessToken - }, - { - walletAddress: receiverWalletAddressUrl.replace('http', 'https'), - incomingAmount: { - value: '100', - assetCode: receiverWalletAddress.assetCode, - assetScale: receiverWalletAddress.assetScale - }, - metadata: { description: 'Free Money!' }, - expiresAt: tomorrow.toISOString() - } - ) - - console.log({ incomingPayment }) - - // Delay gives time for webhook to be received - await wait(1000) - expect(handleWebhookEventSpy).toHaveBeenCalledWith( - expect.objectContaining({ - type: WebhookEventType.IncomingPaymentCreated, - data: expect.any(Object) - }) - ) - }) - - test('Grant Request Quote', async (): Promise => { - const grant = await c9.opClient.grant.request( - { - url: senderWalletAddress.authServer - }, - { - access_token: { - access: [ - { - type: 'quote', - actions: ['read', 'create'] - } - ] - } - } - ) - - console.log(JSON.stringify(grant, null, 2)) - - assert(!isPendingGrant(grant)) - accessToken = grant.access_token.value - }) - - test('Create Quote', async (): Promise => { - quote = await c9.opClient.quote.create( - { - url: senderWalletAddress.resourceServer, - accessToken - }, - { - walletAddress: senderWalletAddressUrl.replace('http', 'https'), - receiver: incomingPayment.id.replace('https', 'http'), - method: 'ilp' - } - ) - - console.log({ quote }) - }) - - test('Grant Request Outgoing Payment', async (): Promise => { - const grant = await hlb.opClient.grant.request( - { - url: senderWalletAddress.authServer - }, - { - access_token: { - access: [ - { - type: 'outgoing-payment', - actions: ['create', 'read', 'list'], - identifier: senderWalletAddressUrl, - limits: { - debitAmount: quote.debitAmount, - receiveAmount: quote.receiveAmount - } - } - ] - }, - interact: { - start: ['redirect'], - finish: { - method: 'redirect', - uri: 'https://example.com', - nonce: '456' - } - } - } - ) - - console.log({ grant }) - - assert(isPendingGrant(grant)) - const continueId_ = grant.continue.uri.split('/').pop() - assert(continueId_) - continueId = continueId_ - }) - - // test('Continuation Request', async (): Promise => { - // expect(true).toBe(true) - // }) - - // test('Create Outgoing Payment', async (): Promise => { - // expect(true).toBe(true) - // }) -}) diff --git a/test/integration/package.json b/test/integration/package.json index e80d2b75c3..fc23542691 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -16,10 +16,12 @@ "@interledger/open-payments": "^6.7.0", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", + "@types/uuid": "^9.0.8", "dotenv": "^16.4.1", "koa": "^2.15.0", "koa-bodyparser": "^4.4.1", "mock-account-servicing-lib": "workspace:*", + "uuid": "^9.0.1", "yaml": "^2.3.4" } } From cc939824bd12ba7cca1d27ecca9a0949e948a1e2 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 7 Mar 2024 16:10:08 -0500 Subject: [PATCH 19/53] feat: add continuation step with consent mocking --- .../{endToEnd.test.ts => integration.test.ts} | 150 ++++++++++++++++-- test/integration/lib/utils.ts | 40 +++++ 2 files changed, 178 insertions(+), 12 deletions(-) rename test/integration/{endToEnd.test.ts => integration.test.ts} (70%) diff --git a/test/integration/endToEnd.test.ts b/test/integration/integration.test.ts similarity index 70% rename from test/integration/endToEnd.test.ts rename to test/integration/integration.test.ts index 0b7e723fa5..7f28ddaf42 100644 --- a/test/integration/endToEnd.test.ts +++ b/test/integration/integration.test.ts @@ -4,16 +4,18 @@ import { isPendingGrant, WalletAddress, IncomingPayment, - Quote + Quote, + PendingGrant } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' import { GraphqlTypes, WebhookEventType } from 'mock-account-servicing-lib' -import { wait } from './lib/utils' +import { parseCookies, poll, wait } from './lib/utils' +import { get } from 'http' jest.setTimeout(20000) -describe('End-to-end tests', (): void => { +describe('Integration tests', (): void => { let c9: MockASE let hlb: MockASE @@ -44,7 +46,7 @@ describe('End-to-end tests', (): void => { let senderWalletAddress: WalletAddress // Assigned initially in test: Grant Request Incoming Payment - // Then re-assigned in test: Grant Request Quote + // Then re-assigned in test: Grant Request Quote and Grant Request Outgoing Payment // - could set new vars but just following whats in postman for now let accessToken: string @@ -55,7 +57,8 @@ describe('End-to-end tests', (): void => { let quote: Quote // Assigned in Grant Request Outgoing Payment - let continueId: string + // let continueId: string + let outgoingPaymentGrant: PendingGrant test('Can Get Existing Wallet Address', async (): Promise => { receiverWalletAddress = await c9.opClient.walletAddress.get({ @@ -232,20 +235,143 @@ describe('End-to-end tests', (): void => { console.log({ grant }) assert(isPendingGrant(grant)) - const continueId_ = grant.continue.uri.split('/').pop() - assert(continueId_) - continueId = continueId_ + outgoingPaymentGrant = grant }) - // test('Continuation Request', async (): Promise => { - // expect(true).toBe(true) - // }) + + test('Continuation Request', async (): Promise => { + // Extract interact ID from the redirect URL + const { redirect: startInteractionUrl } = outgoingPaymentGrant.interact + const tokens = startInteractionUrl.split('/interact/') + const interactId = tokens[1] ? tokens[1].split('/')[0] : null + const nonce = outgoingPaymentGrant.interact.finish + assert(interactId) + + // Start interaction + const interactResponse = await fetch(startInteractionUrl, { + redirect: 'manual' // dont follow redirects + }) + expect(interactResponse.status).toBe(302) + + const cookie = parseCookies(interactResponse) + + // Accept + const acceptResponse = await fetch( + `${senderWalletAddress.authServer}/grant/${interactId}/${nonce}/accept`, + { + method: 'POST', + headers: { + 'x-idp-secret': 'replace-me', + cookie + } + } + ) + expect(acceptResponse.status).toBe(202) + + // Finish interaction + const finishResponse = await fetch( + `${senderWalletAddress.authServer}/interact/${interactId}/${nonce}/finish`, + { + method: 'GET', + headers: { + 'x-idp-secret': 'replace-me', + cookie + }, + redirect: 'manual' // dont follow redirects + } + ) + expect(finishResponse.status).toBe(302) + + const redirectURI = finishResponse.headers.get('location') + assert(redirectURI) + + const url = new URL(redirectURI) + const interact_ref = url.searchParams.get('interact_ref') + assert(interact_ref) + + const { access_token, uri } = outgoingPaymentGrant.continue + + await wait((outgoingPaymentGrant.continue.wait ?? 5) * 1000) + + const grantContinue = await c9.opClient.grant.continue( + { + accessToken: access_token.value, + url: uri + }, + { interact_ref } + ) + console.log({ grantContinue }) + }) + + // ---------------------------------------------------------- + // Grant Continuation via Polling. + // Alternative to getting the redirect url with interact_ref. + test.skip('Grant Request Outgoing Payment', async (): Promise => { + const grant = await hlb.opClient.grant.request( + { + url: senderWalletAddress.authServer + }, + { + access_token: { + access: [ + { + type: 'outgoing-payment', + actions: ['create', 'read', 'list'], + identifier: senderWalletAddressUrl, + limits: { + debitAmount: quote.debitAmount, + receiveAmount: quote.receiveAmount + } + } + ] + }, + interact: { + start: ['redirect'] + // finish: { + // method: 'redirect', + // uri: 'https://example.com', + // nonce: '456' + // } + } + } + ) + + console.log({ grant }) + + assert(isPendingGrant(grant)) + outgoingPaymentGrant = grant + }) + + test.skip('Continuation Request', async (): Promise => { + const { access_token, uri } = outgoingPaymentGrant.continue + const grantContinue = await poll( + async () => + c9.opClient.grant.continue( + { + accessToken: access_token.value, + url: uri + }, + { + interact_ref: '' // TODO: update OP spec/client to not need body/interact_ref here + } + ), + (responseData) => 'accessToken' in responseData, + 10, + 2 + ) + console.log({ grantContinue }) + expect(true).toBe(true) + }) + // ^^^ + // Grant Continuation via Polling. + // Alternative to getting the redirect url with interact_ref. + // ---------------------------------------------------------- // test('Create Outgoing Payment', async (): Promise => { // expect(true).toBe(true) // }) }) - describe('Peer to Peer Flow', (): void => { + describe.skip('Peer to Peer Flow', (): void => { const receiverWalletAddressUrl = 'https://host.docker.internal:4000/accounts/pfry' const amountValueToSend = '500' diff --git a/test/integration/lib/utils.ts b/test/integration/lib/utils.ts index 26ba552b45..1d07f82d7d 100644 --- a/test/integration/lib/utils.ts +++ b/test/integration/lib/utils.ts @@ -1,3 +1,43 @@ export function wait(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)) } + +export async function poll( + requestFn: () => Promise, + successCondition: (responseData: T) => boolean, + pollingDurationSeconds: number, + pollingIntervalSeconds: number +): Promise { + const startTime = Date.now() + let responseData + + while (Date.now() - startTime < pollingDurationSeconds * 1000) { + try { + responseData = await requestFn() + + if (successCondition(responseData)) { + console.log({ responseData }) + return responseData + } + } catch (error) { + console.error('Error during polling:', error) + } + + await new Promise((resolve) => + setTimeout(resolve, pollingIntervalSeconds * 1000) + ) + } + + throw new Error('Poll completed without success') +} + +export function parseCookies(response: Response) { + return response.headers + .getSetCookie() + .map((header) => { + const parts = header.split(';') + const cookiePart = parts[0] + return cookiePart + }) + .join(';') +} From 9e1e2152151dda6915188c9a0dd28ed83b4e9446 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 7 Mar 2024 20:28:27 -0500 Subject: [PATCH 20/53] fix: rm obsolete type cast to any and comment --- packages/auth/src/app.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/auth/src/app.ts b/packages/auth/src/app.ts index bdea89da8d..4587c61b42 100644 --- a/packages/auth/src/app.ts +++ b/packages/auth/src/app.ts @@ -322,9 +322,7 @@ export class App { maxAge: 60 * 1000, signed: true }, - // Only accepts Middleware for some reason, this.koa is Middleware - // eslint-disable-next-line @typescript-eslint/no-explicit-any - koa as any + koa ) ) From 51fc3255333b33170143d76d01bb462f6224acbd Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 8 Mar 2024 12:49:57 -0500 Subject: [PATCH 21/53] feat: add create ougoing payment test --- test/integration/integration.test.ts | 71 ++++++++++++++++++++--- test/integration/lib/IntegrationServer.ts | 6 -- 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 7f28ddaf42..cd6ec71de9 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -1,17 +1,20 @@ import assert from 'assert' +import { validate as isUuid } from 'uuid' import { OpenPaymentsClientError, isPendingGrant, + isFinalizedGrant, WalletAddress, IncomingPayment, Quote, - PendingGrant + PendingGrant, + Grant, + OutgoingPayment } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' import { GraphqlTypes, WebhookEventType } from 'mock-account-servicing-lib' import { parseCookies, poll, wait } from './lib/utils' -import { get } from 'http' jest.setTimeout(20000) @@ -60,6 +63,12 @@ describe('Integration tests', (): void => { // let continueId: string let outgoingPaymentGrant: PendingGrant + // set in Continuation Request + let grantContinue: Grant + + // set in Create Outgoing Payment + let outgoingPayment: OutgoingPayment + test('Can Get Existing Wallet Address', async (): Promise => { receiverWalletAddress = await c9.opClient.walletAddress.get({ url: receiverWalletAddressUrl @@ -213,7 +222,7 @@ describe('Integration tests', (): void => { { type: 'outgoing-payment', actions: ['create', 'read', 'list'], - identifier: senderWalletAddressUrl, + identifier: senderWalletAddressUrl.replace('http', 'https'), limits: { debitAmount: quote.debitAmount, receiveAmount: quote.receiveAmount @@ -292,14 +301,16 @@ describe('Integration tests', (): void => { await wait((outgoingPaymentGrant.continue.wait ?? 5) * 1000) - const grantContinue = await c9.opClient.grant.continue( + const grantContinue_ = await c9.opClient.grant.continue( { accessToken: access_token.value, url: uri }, { interact_ref } ) - console.log({ grantContinue }) + console.log(JSON.stringify(grantContinue_, null, 2)) + assert(isFinalizedGrant(grantContinue_)) + grantContinue = grantContinue_ }) // ---------------------------------------------------------- @@ -366,12 +377,54 @@ describe('Integration tests', (): void => { // Alternative to getting the redirect url with interact_ref. // ---------------------------------------------------------- - // test('Create Outgoing Payment', async (): Promise => { - // expect(true).toBe(true) - // }) + test('Create Outgoing Payment', async (): Promise => { + const handleWebhookEventSpy = jest.spyOn( + c9.integrationServer.webhookEventHandler, + 'handleWebhookEvent' + ) + + outgoingPayment = await c9.opClient.outgoingPayment.create( + { + url: senderWalletAddress.resourceServer, + accessToken: grantContinue.access_token.value + }, + { + walletAddress: senderWalletAddressUrl.replace('http', 'https'), + metadata: {}, + quoteId: quote.id + } + ) + console.log({ outgoingPayment }) + // Delay gives time for webhooks to be received + await wait(1000) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.OutgoingPaymentCreated, + data: expect.any(Object) + }) + ) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( + expect.objectContaining({ + type: WebhookEventType.OutgoingPaymentCompleted, + data: expect.any(Object) + }) + ) + }) + + test('Get Outgoing Payment', async (): Promise => { + const id = outgoingPayment.id.split('/').pop() + assert(id) + expect(isUuid(id)).toBe(true) + + const outgoingPayment_ = await c9.opClient.outgoingPayment.get({ + url: `${senderWalletAddress.resourceServer}/outgoing-payments/${id}`, + accessToken: grantContinue.access_token.value + }) + console.log({ outgoingPayment_ }) + }) }) - describe.skip('Peer to Peer Flow', (): void => { + describe('Peer to Peer Flow', (): void => { const receiverWalletAddressUrl = 'https://host.docker.internal:4000/accounts/pfry' const amountValueToSend = '500' diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index 63f83a7db8..55956bdb14 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -136,12 +136,6 @@ export class WebhookEventHandler { } private async handleOutgoingPaymentCreated(webhookEvent: Webhook) { - if (webhookEvent.type !== WebhookEventType.OutgoingPaymentCreated) { - throw new Error( - 'Invalid event type when handling outgoing payment webhook' - ) - } - const payment = webhookEvent.data const walletAddressId = payment['walletAddressId'] as string const account = await this.accounts.getByWalletAddressId(walletAddressId) From 09e1314e25c04c73ce761edd39b39bc9797c19a3 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 8 Mar 2024 13:26:49 -0500 Subject: [PATCH 22/53] fix: bad pnpm-lock merge --- pnpm-lock.yaml | 6246 ++++++++++++++++++++++++++---------------------- 1 file changed, 3408 insertions(+), 2838 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d33accc009..7c3da2c691 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 29.6.3 '@swc/jest': specifier: ^0.2.36 - version: 0.2.36(@swc/core@1.4.6) + version: 0.2.36(@swc/core@1.4.2) '@types/jest': specifier: ^29.5.12 version: 29.5.12 @@ -64,16 +64,16 @@ importers: version: 2.0.2 '@remix-run/node': specifier: ^2.6.0 - version: 2.8.1(typescript@5.4.2) + version: 2.6.0(typescript@5.4.2) '@remix-run/react': specifier: ^2.6.0 - version: 2.8.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2) + version: 2.6.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2) '@remix-run/serve': specifier: ^2.6.0 - version: 2.8.1(typescript@5.4.2) + version: 2.6.0(typescript@5.4.2) '@types/node': specifier: ^18.7.12 - version: 18.19.22 + version: 18.11.9 '@types/uuid': specifier: ^9.0.8 version: 9.0.8 @@ -101,7 +101,7 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.6.0 - version: 2.8.1(@remix-run/serve@2.8.1)(@types/node@18.19.22)(typescript@5.4.2) + version: 2.6.0(@remix-run/serve@2.6.0)(@types/node@18.11.9)(typescript@5.4.2) '@types/react': specifier: ^18.2.64 version: 18.2.64 @@ -143,7 +143,7 @@ importers: version: 5.0.0 '@koa/router': specifier: ^12.0.0 - version: 12.0.1 + version: 12.0.0 ajv: specifier: ^8.12.0 version: 8.12.0 @@ -195,7 +195,7 @@ importers: version: 8.4.1 '@graphql-codegen/cli': specifier: 5.0.2 - version: 5.0.2(graphql@16.8.1)(typescript@5.4.2) + version: 5.0.2(@babel/core@7.23.9)(@types/node@18.19.19)(graphql@16.8.1) '@graphql-codegen/introspection': specifier: 4.0.3 version: 4.0.3(graphql@16.8.1) @@ -288,19 +288,19 @@ importers: version: 5.0.0 '@koa/router': specifier: ^12.0.0 - version: 12.0.1 + version: 12.0.0 '@opentelemetry/api': specifier: ^1.7.0 - version: 1.8.0 + version: 1.7.0 '@opentelemetry/exporter-metrics-otlp-grpc': specifier: ^0.48.0 - version: 0.48.0(@opentelemetry/api@1.8.0) + version: 0.48.0(@opentelemetry/api@1.7.0) '@opentelemetry/resources': specifier: ^1.21.0 - version: 1.22.0(@opentelemetry/api@1.8.0) + version: 1.21.0(@opentelemetry/api@1.7.0) '@opentelemetry/sdk-metrics': specifier: ^1.21.0 - version: 1.22.0(@opentelemetry/api@1.8.0) + version: 1.21.0(@opentelemetry/api@1.7.0) ajv: specifier: ^8.12.0 version: 8.12.0 @@ -375,7 +375,7 @@ importers: version: 2.5.2 tigerbeetle-node: specifier: ^0.14.176 - version: 0.14.183 + version: 0.14.176 token-introspection: specifier: workspace:* version: link:../token-introspection @@ -388,7 +388,7 @@ importers: version: 3.9.6(@types/react@18.2.64)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@graphql-codegen/cli': specifier: 5.0.2 - version: 5.0.2(graphql@16.8.1)(typescript@5.4.2) + version: 5.0.2(@babel/core@7.23.9)(@types/node@18.19.19)(graphql@16.8.1) '@graphql-codegen/introspection': specifier: 4.0.3 version: 4.0.3(graphql@16.8.1) @@ -499,13 +499,13 @@ importers: version: 1.7.18(react-dom@18.2.0)(react@18.2.0) '@remix-run/node': specifier: ^2.6.0 - version: 2.8.1(typescript@5.4.2) + version: 2.6.0(typescript@5.4.2) '@remix-run/react': specifier: ^2.6.0 - version: 2.8.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2) + version: 2.6.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2) '@remix-run/serve': specifier: ^2.6.0 - version: 2.8.1(typescript@5.4.2) + version: 2.6.0(typescript@5.4.2) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -533,10 +533,10 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.6.0 - version: 2.8.1(@remix-run/serve@2.8.1)(@types/node@18.19.22)(typescript@5.4.2) + version: 2.6.0(@remix-run/serve@2.6.0)(@types/node@18.11.9)(typescript@5.4.2) '@remix-run/eslint-config': specifier: ^2.6.0 - version: 2.8.1(eslint@8.57.0)(jest@29.7.0)(react@18.2.0)(typescript@5.4.2) + version: 2.6.0(eslint@8.57.0)(jest@29.7.0)(react@18.2.0)(typescript@5.4.2) '@tailwindcss/forms': specifier: ^0.5.7 version: 0.5.7(tailwindcss@3.4.1) @@ -585,7 +585,7 @@ importers: version: 3.9.6(@types/react@18.2.64)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@types/node': specifier: ^18.7.12 - version: 18.19.22 + version: 18.19.19 '@types/uuid': specifier: ^9.0.8 version: 9.0.8 @@ -604,7 +604,7 @@ importers: devDependencies: '@types/node': specifier: ^18.7.12 - version: 18.19.22 + version: 18.11.9 nock: specifier: ^13.5.4 version: 13.5.4 @@ -669,20 +669,20 @@ packages: engines: {node: '>=10'} dev: true - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 /@apidevtools/json-schema-ref-parser@10.1.0: resolution: {integrity: sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA==} engines: {node: '>= 16'} dependencies: '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.15 - '@types/lodash.clonedeep': 4.5.9 + '@types/json-schema': 7.0.12 + '@types/lodash.clonedeep': 4.5.7 js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 @@ -714,7 +714,7 @@ packages: dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@wry/caches': 1.0.1 - '@wry/equality': 0.5.7 + '@wry/equality': 0.5.6 '@wry/trie': 0.5.0 graphql: 16.8.1 graphql-tag: 2.12.6(graphql@16.8.1) @@ -786,7 +786,7 @@ packages: '@types/node-fetch': 2.6.11 async-retry: 1.3.3 cors: 2.8.5 - express: 4.18.3 + express: 4.18.2 graphql: 16.8.1 loglevel: 1.9.1 lru-cache: 7.18.3 @@ -909,16 +909,16 @@ packages: peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/generator': 7.23.6 - '@babel/parser': 7.24.0 - '@babel/runtime': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.24.0) + '@babel/parser': 7.23.9 + '@babel/runtime': 7.23.2 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + babel-preset-fbjs: 3.4.0(@babel/core@7.23.9) chalk: 4.1.2 - fb-watchman: 2.0.2 - fbjs: 3.0.5 + fb-watchman: 2.0.1 + fbjs: 3.0.4 glob: 7.2.3 graphql: 16.8.1 immutable: 3.7.6 @@ -951,22 +951,38 @@ packages: koa: 2.15.0 dev: false - /@asamuzakjp/dom-selector@2.0.2: - resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} - dependencies: - bidi-js: 1.0.3 - css-tree: 2.3.1 - is-potential-custom-element-name: 1.0.1 - dev: false - - /@astrojs/compiler@2.7.0: - resolution: {integrity: sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==} + /@astrojs/compiler@2.3.2: + resolution: {integrity: sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==} dev: false /@astrojs/internal-helpers@0.2.1: resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} dev: false + /@astrojs/markdown-remark@3.2.0(astro@3.6.5): + resolution: {integrity: sha512-jigyLfefUZPKgVmmraCkVpdUuFH1R3SrpgQO13axsgwLDBgkggaQpNR5Ag4O9PDualeBtbdt30aYSfvnBKx9Hg==} + peerDependencies: + astro: ^3.1.0 + dependencies: + '@astrojs/prism': 3.0.0 + astro: 3.6.5(typescript@5.4.2) + github-slugger: 2.0.0 + import-meta-resolve: 3.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 6.1.1 + rehype-stringify: 9.0.4 + remark-gfm: 3.0.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + remark-smartypants: 2.0.0 + shiki: 0.14.5 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + /@astrojs/markdown-remark@3.5.0(astro@3.6.5): resolution: {integrity: sha512-q7vdIqzYhxpsfghg2YmkmSXCfp4w7lBTYP+SSHw89wVhC5Riltr3u8w2otBRxNLSByNi+ht/gGkFC23Shetytw==} peerDependencies: @@ -975,15 +991,15 @@ packages: '@astrojs/prism': 3.0.0 astro: 3.6.5(typescript@5.4.2) github-slugger: 2.0.0 - import-meta-resolve: 3.1.1 + import-meta-resolve: 3.0.0 mdast-util-definitions: 6.0.0 rehype-raw: 6.1.1 rehype-stringify: 9.0.4 remark-gfm: 3.0.1 remark-parse: 10.0.2 remark-rehype: 10.1.0 - remark-smartypants: 2.1.0 - shikiji: 0.6.13 + remark-smartypants: 2.0.0 + shikiji: 0.6.10 unified: 10.1.2 unist-util-visit: 4.1.2 vfile: 5.3.7 @@ -991,15 +1007,15 @@ packages: - supports-color dev: false - /@astrojs/mdx@1.1.5(astro@3.6.5): - resolution: {integrity: sha512-4bveyB1Lb1vWo2kdHJjQYoCytWlrIjAxHATHUTuYnBPmdPjsfy9wuCnb9rozwyyarDABx87CzG5gotBNYd+dVA==} + /@astrojs/mdx@1.1.0(astro@3.6.5): + resolution: {integrity: sha512-rmLZBw3CUCkp+5blBJloV2EqJGRaJTraJygWMfCvrLcCA3vzhwzACnVQKdUDlts8EEr6V6+HXYVqi46AVEfobg==} engines: {node: '>=18.14.1'} peerDependencies: - astro: ^3.0.0 + astro: ^3.1.0 dependencies: - '@astrojs/markdown-remark': 3.5.0(astro@3.6.5) + '@astrojs/markdown-remark': 3.2.0(astro@3.6.5) '@mdx-js/mdx': 2.3.0 - acorn: 8.11.3 + acorn: 8.10.0 astro: 3.6.5(typescript@5.4.2) es-module-lexer: 1.4.1 estree-util-visit: 1.2.1 @@ -1009,7 +1025,7 @@ packages: kleur: 4.1.5 rehype-raw: 6.1.1 remark-gfm: 3.0.1 - remark-smartypants: 2.1.0 + remark-smartypants: 2.0.0 source-map: 0.7.4 unist-util-visit: 4.1.2 vfile: 5.3.7 @@ -1024,8 +1040,8 @@ packages: prismjs: 1.29.0 dev: false - /@astrojs/sitemap@3.1.1: - resolution: {integrity: sha512-qPgdBIcDUaea98mTtLfi5z9oXZpzSjEn/kes70/Ex8FOZZ+DIHVKRYOLOtvy8p+FTXr/9oc7BjmIbTYmYLLJVg==} + /@astrojs/sitemap@3.0.3: + resolution: {integrity: sha512-+GRKp1yho9dpHBcMcU6JpbL41k0yYZghOkNsMRb8QIRflbGHvd787tdv9oIZ5NJj0SqAuOlqp2UpqLkJXuAe2A==} dependencies: sitemap: 7.1.1 zod: 3.22.4 @@ -1036,17 +1052,17 @@ packages: peerDependencies: astro: ^3.2.0 dependencies: - '@astrojs/mdx': 1.1.5(astro@3.6.5) - '@astrojs/sitemap': 3.1.1 - '@pagefind/default-ui': 1.0.4 - '@types/mdast': 3.0.15 + '@astrojs/mdx': 1.1.0(astro@3.6.5) + '@astrojs/sitemap': 3.0.3 + '@pagefind/default-ui': 1.0.3 + '@types/mdast': 3.0.12 astro: 3.6.5(typescript@5.4.2) - astro-expressive-code: 0.29.4(astro@3.6.5) + astro-expressive-code: 0.29.2(astro@3.6.5) bcp-47: 2.1.0 execa: 8.0.1 hast-util-select: 5.0.5 hastscript: 7.2.0 - pagefind: 1.0.4 + pagefind: 1.0.3 rehype: 12.0.1 remark-directive: 2.0.1 unified: 10.1.2 @@ -1061,17 +1077,25 @@ packages: resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} engines: {node: '>=18.14.1'} dependencies: - ci-info: 3.9.0 + ci-info: 3.8.0 debug: 4.3.4(supports-color@9.4.0) dlv: 1.1.3 dset: 3.1.3 is-docker: 3.0.0 - is-wsl: 3.1.0 + is-wsl: 3.0.0 which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color dev: false + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + /@babel/code-frame@7.23.5: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -1079,24 +1103,52 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.9 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@9.4.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@9.4.0) gensync: 1.0.0-beta.2 @@ -1105,34 +1157,55 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.23.10(@babel/core@7.24.0)(eslint@8.57.0): - resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==} + /@babel/eslint-parser@7.21.8(@babel/core@7.23.2)(eslint@8.57.0): + resolution: {integrity: sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: - '@babel/core': ^7.11.0 + '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: true + /@babel/generator@7.23.6: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} @@ -1144,22 +1217,44 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==} + /@babel/helper-create-class-features-plugin@7.21.8(@babel/core@7.23.2): + resolution: {integrity: sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.21.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin@7.21.8(@babel/core@7.23.9): + resolution: {integrity: sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.21.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-environment-visitor@7.22.20: @@ -1170,82 +1265,117 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + /@babel/helper-member-expression-to-functions@7.21.5: + resolution: {integrity: sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.2): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 dev: true - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-replace-supers@7.22.20(@babel/core@7.24.0): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + /@babel/helper-replace-supers@7.21.5: + resolution: {integrity: sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.21.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -1255,19 +1385,44 @@ packages: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.24.0: - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} @@ -1277,26 +1432,36 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.0): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.0): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. @@ -1304,470 +1469,561 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.23.9) dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-MXW3pQCu9gUiVGzqkGqsgiINDVYXoAnrY8FYF/rmb+OfufNF0zHMpHPN4ulRrinxYT8Vk/aZJxYqOKsDECjKAw==} + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} + /@babel/plugin-syntax-flow@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.23.9): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.23.2): + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.23.9): + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.23.9): + resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-classes@7.23.8(@babel/core@7.24.0): - resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.23.9): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.23.9): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.21.5 '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.23.9): + resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/template': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.23.9 dev: true - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.23.9): + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} + /@babel/plugin-transform-flow-strip-types@7.18.9(@babel/core@7.23.9): + resolution: {integrity: sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.24.0): - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + /@babel/plugin-transform-for-of@7.21.5(@babel/core@7.23.9): + resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.23.9): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.23.9): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.23.2): + resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.23.9): + resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.23.9): + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.0): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/types': 7.24.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/types': 7.23.9 + dev: true - /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/types': 7.23.9 + + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.23.9): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.23.9): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.23.9): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.0): - resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.23.2): + resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/preset-react@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + /@babel/preset-react@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.0) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.23.2) dev: true - /@babel/preset-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + /@babel/preset-typescript@7.21.5(@babel/core@7.23.2): + resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.0) + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.1 + regenerator-runtime: 0.14.0 dev: true - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + debug: 4.3.4(supports-color@9.4.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true - /@babel/traverse@7.24.0: - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 @@ -1776,15 +2032,24 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4(supports-color@9.4.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 @@ -1808,18 +2073,10 @@ packages: engines: {node: '>=10'} dev: false - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + /@emotion/hash@0.9.0: + resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} dev: true - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - optional: true - /@esbuild/android-arm64@0.17.6: resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} engines: {node: '>=12'} @@ -1835,15 +2092,15 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + /@esbuild/android-arm64@0.19.3: + resolution: {integrity: sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-arm@0.17.6: @@ -1861,15 +2118,15 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false optional: true - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + /@esbuild/android-arm@0.19.3: + resolution: {integrity: sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-x64@0.17.6: @@ -1887,15 +2144,15 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false optional: true - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + /@esbuild/android-x64@0.19.3: + resolution: {integrity: sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/darwin-arm64@0.17.6: @@ -1913,15 +2170,15 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + /@esbuild/darwin-arm64@0.19.3: + resolution: {integrity: sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@esbuild/darwin-x64@0.17.6: @@ -1939,15 +2196,15 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + /@esbuild/darwin-x64@0.19.3: + resolution: {integrity: sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true /@esbuild/freebsd-arm64@0.17.6: @@ -1965,15 +2222,15 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false optional: true - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + /@esbuild/freebsd-arm64@0.19.3: + resolution: {integrity: sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true + dev: false optional: true /@esbuild/freebsd-x64@0.17.6: @@ -1991,15 +2248,15 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false optional: true - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + /@esbuild/freebsd-x64@0.19.3: + resolution: {integrity: sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true + dev: false optional: true /@esbuild/linux-arm64@0.17.6: @@ -2017,15 +2274,15 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + /@esbuild/linux-arm64@0.19.3: + resolution: {integrity: sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-arm@0.17.6: @@ -2043,15 +2300,15 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + /@esbuild/linux-arm@0.19.3: + resolution: {integrity: sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-ia32@0.17.6: @@ -2069,15 +2326,15 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + /@esbuild/linux-ia32@0.19.3: + resolution: {integrity: sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-loong64@0.17.6: @@ -2095,15 +2352,15 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + /@esbuild/linux-loong64@0.19.3: + resolution: {integrity: sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-mips64el@0.17.6: @@ -2121,15 +2378,15 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + /@esbuild/linux-mips64el@0.19.3: + resolution: {integrity: sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-ppc64@0.17.6: @@ -2147,15 +2404,15 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + /@esbuild/linux-ppc64@0.19.3: + resolution: {integrity: sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-riscv64@0.17.6: @@ -2173,15 +2430,15 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + /@esbuild/linux-riscv64@0.19.3: + resolution: {integrity: sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-s390x@0.17.6: @@ -2199,15 +2456,15 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + /@esbuild/linux-s390x@0.19.3: + resolution: {integrity: sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-x64@0.17.6: @@ -2225,15 +2482,15 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + /@esbuild/linux-x64@0.19.3: + resolution: {integrity: sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/netbsd-x64@0.17.6: @@ -2251,15 +2508,15 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + /@esbuild/netbsd-x64@0.19.3: + resolution: {integrity: sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true + dev: false optional: true /@esbuild/openbsd-x64@0.17.6: @@ -2277,15 +2534,15 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + /@esbuild/openbsd-x64@0.19.3: + resolution: {integrity: sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true + dev: false optional: true /@esbuild/sunos-x64@0.17.6: @@ -2303,15 +2560,15 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + /@esbuild/sunos-x64@0.19.3: + resolution: {integrity: sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true + dev: false optional: true /@esbuild/win32-arm64@0.17.6: @@ -2329,15 +2586,15 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + /@esbuild/win32-arm64@0.19.3: + resolution: {integrity: sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-ia32@0.17.6: @@ -2355,15 +2612,15 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + /@esbuild/win32-ia32@0.19.3: + resolution: {integrity: sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-x64@0.17.6: @@ -2381,15 +2638,15 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + /@esbuild/win32-x64@0.19.3: + resolution: {integrity: sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): @@ -2402,8 +2659,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -2414,8 +2671,8 @@ packages: ajv: 6.12.6 debug: 4.3.4(supports-color@9.4.0) espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 + globals: 13.19.0 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2429,8 +2686,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@expressive-code/core@0.29.4: - resolution: {integrity: sha512-XBdMPO4BBgPxE+txtNdjkDmLwGxJpU+QqLQ/WrHWPcj1lTXcoFQTUqFO4Eav+hv/Yn+lEjiv792RrcUe2o0anA==} + /@expressive-code/core@0.29.2: + resolution: {integrity: sha512-QJv5rDqSpx8WcAE4cZE+9GE31NtkN3i1zdr0KmdgwcIAEixhgxCFfngMoHWYYcLQnBMCIsFCyHnS39SAL4ub0Q==} dependencies: '@ctrl/tinycolor': 3.6.1 hast-util-to-html: 8.0.4 @@ -2439,24 +2696,24 @@ packages: postcss-nested: 6.0.1(postcss@8.4.35) dev: false - /@expressive-code/plugin-frames@0.29.4: - resolution: {integrity: sha512-GE3sB7JTqjhTz7LrCm+mL9x+bIdud76AVqJa/brJgqpYFcl5aJcHtyR0PSZQqTXHL3sBIj8w0wbh+ieVM43JnQ==} + /@expressive-code/plugin-frames@0.29.2: + resolution: {integrity: sha512-qQoDHB3iW7+Jb38omXGcaMNCbcBnGOijREDU5VW8TkFKzwx63gxcia8EYzzuCK15A2Pa8/5YqgE+0RrwKTGXHA==} dependencies: - '@expressive-code/core': 0.29.4 + '@expressive-code/core': 0.29.2 hastscript: 7.2.0 dev: false - /@expressive-code/plugin-shiki@0.29.4: - resolution: {integrity: sha512-vOM2JFVEClg3EAWHVd+ma8y/EsINqzCrQP1PS9sZgn2KASE3C6JBkNRXzUXKGkjDn0dsWJVYYvIsH+4xNpygZA==} + /@expressive-code/plugin-shiki@0.29.2: + resolution: {integrity: sha512-ZRcG0Rh7S98XzHqTVlZd4pMcXehv6bjSzdM0r0LT2LpCl5oAbzx5DBYCy6BFKu2Qc4UkhTm04obXZSWoAtSaGw==} dependencies: - '@expressive-code/core': 0.29.4 - shiki: 0.14.7 + '@expressive-code/core': 0.29.2 + shiki: 0.14.5 dev: false - /@expressive-code/plugin-text-markers@0.29.4: - resolution: {integrity: sha512-U8rouNRrLzAo11Ihoi4iqEH7FD+VEUb6Pe7xJxlFJ7HRhgaFIcuHyYyn6jA1WmGP5k9BFLhYBk53+oKvlmEkKw==} + /@expressive-code/plugin-text-markers@0.29.2: + resolution: {integrity: sha512-2jhmKIUIizTTnkasFQMmonNNMKmKQxfIIIZcsCLZ0ZaJdBkU0OueAVfQbk0amsrsiPL2ihJ3iDh0JZE0Ztz0AA==} dependencies: - '@expressive-code/core': 0.29.4 + '@expressive-code/core': 0.29.2 hastscript: 7.2.0 unist-util-visit-parents: 5.1.3 dev: false @@ -2465,8 +2722,8 @@ packages: resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + /@fastify/busboy@2.0.0: + resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} engines: {node: '>=14'} dev: true @@ -2480,7 +2737,7 @@ packages: tslib: 2.6.2 dev: true - /@graphql-codegen/cli@5.0.2(graphql@16.8.1)(typescript@5.4.2): + /@graphql-codegen/cli@5.0.2(@babel/core@7.23.9)(@types/node@18.19.19)(graphql@16.8.1): resolution: {integrity: sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==} hasBin: true peerDependencies: @@ -2490,67 +2747,67 @@ packages: '@parcel/watcher': optional: true dependencies: - '@babel/generator': 7.23.6 - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - '@graphql-codegen/client-preset': 4.2.4(graphql@16.8.1) + '@babel/generator': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + '@graphql-codegen/client-preset': 4.2.2(graphql@16.8.1) '@graphql-codegen/core': 4.0.2(graphql@16.8.1) '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) - '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.8.1) - '@graphql-tools/code-file-loader': 8.1.1(graphql@16.8.1) - '@graphql-tools/git-loader': 8.0.5(graphql@16.8.1) - '@graphql-tools/github-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/apollo-engine-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/code-file-loader': 8.0.1(@babel/core@7.23.9)(graphql@16.8.1) + '@graphql-tools/git-loader': 8.0.1(@babel/core@7.23.9)(graphql@16.8.1) + '@graphql-tools/github-loader': 8.0.0(@babel/core@7.23.9)(@types/node@18.19.19)(graphql@16.8.1) '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.8.1) - '@graphql-tools/json-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) '@graphql-tools/load': 8.0.2(graphql@16.8.1) - '@graphql-tools/prisma-loader': 8.0.3(graphql@16.8.1) - '@graphql-tools/url-loader': 8.0.2(graphql@16.8.1) - '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@whatwg-node/fetch': 0.8.8 + '@graphql-tools/prisma-loader': 8.0.1(@types/node@18.19.19)(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.19.19)(graphql@16.8.1) + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) + '@whatwg-node/fetch': 0.8.1(@types/node@18.19.19) chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.4.2) + cosmiconfig: 8.1.3 debounce: 1.2.1 detect-indent: 6.1.0 graphql: 16.8.1 - graphql-config: 5.0.3(graphql@16.8.1)(typescript@5.4.2) - inquirer: 8.2.6 + graphql-config: 5.0.2(@types/node@18.19.19)(graphql@16.8.1) + inquirer: 8.2.4 is-glob: 4.0.3 - jiti: 1.21.0 + jiti: 1.20.0 json-to-pretty-yaml: 1.2.2 listr2: 4.0.5 log-symbols: 4.1.0 micromatch: 4.0.5 - shell-quote: 1.8.1 + shell-quote: 1.8.0 string-env-interpolation: 1.0.1 ts-log: 2.2.5 - tslib: 2.6.2 + tslib: 2.5.0 yaml: 2.4.1 - yargs: 17.7.2 + yargs: 17.7.1 transitivePeerDependencies: + - '@babel/core' - '@types/node' - bufferutil - cosmiconfig-toml-loader - encoding - enquirer - supports-color - - typescript - utf-8-validate dev: true - /@graphql-codegen/client-preset@4.2.4(graphql@16.8.1): - resolution: {integrity: sha512-k1c8v2YxJhhITGQGxViG9asLAoop9m7X9duU7Zztqjc98ooxsUzXICfvAWsH3mLAUibXAx4Ax6BPzKsTtQmBPg==} + /@graphql-codegen/client-preset@4.2.2(graphql@16.8.1): + resolution: {integrity: sha512-DF9pNWj3TEdA90E9FH5SsUIqiZfr872vqaQOspLVuVXGsaDx8F/JLLzaN+7ucmoo0ff/bLW8munVXYXTmgwwEA==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@babel/helper-plugin-utils': 7.24.0 - '@babel/template': 7.24.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 '@graphql-codegen/add': 5.0.2(graphql@16.8.1) - '@graphql-codegen/gql-tag-operations': 4.0.6(graphql@16.8.1) + '@graphql-codegen/gql-tag-operations': 4.0.4(graphql@16.8.1) '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) - '@graphql-codegen/typed-document-node': 5.0.6(graphql@16.8.1) + '@graphql-codegen/typed-document-node': 5.0.4(graphql@16.8.1) '@graphql-codegen/typescript': 4.0.6(graphql@16.8.1) '@graphql-codegen/typescript-operations': 4.2.0(graphql@16.8.1) - '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.1.2(graphql@16.8.1) '@graphql-tools/documents': 1.0.0(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) @@ -2573,13 +2830,13 @@ packages: tslib: 2.6.2 dev: true - /@graphql-codegen/gql-tag-operations@4.0.6(graphql@16.8.1): - resolution: {integrity: sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA==} + /@graphql-codegen/gql-tag-operations@4.0.4(graphql@16.8.1): + resolution: {integrity: sha512-dypul0iDLjb07yv+/cRb6qPbn42cFPcwlsJertVl9G6qkS4+3V4806WwSfUht4QVMWnvGfgDkJJqG0yUVKOHwA==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) - '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.1.2(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) auto-bind: 4.0.0 graphql: 16.8.1 @@ -2628,13 +2885,13 @@ packages: tslib: 2.6.2 dev: true - /@graphql-codegen/typed-document-node@5.0.6(graphql@16.8.1): - resolution: {integrity: sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA==} + /@graphql-codegen/typed-document-node@5.0.4(graphql@16.8.1): + resolution: {integrity: sha512-t66Z6erQ4Dh1j6f9pRZmc8uYtHoUI3A49tLmJAlg9/3IV0kCmwrWKJut/G8SeOefDLG8cXBTVtI/YuZOe1Te+w==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) - '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.1.2(graphql@16.8.1) auto-bind: 4.0.0 change-case-all: 1.0.15 graphql: 16.8.1 @@ -2693,6 +2950,27 @@ packages: - supports-color dev: true + /@graphql-codegen/visitor-plugin-common@4.1.2(graphql@16.8.1): + resolution: {integrity: sha512-yk7iEAL1kYZ2Gi/pvVjdsZhul5WsYEM4Zcgh2Ev15VicMdJmPHsMhNUsZWyVJV0CaQCYpNOFlGD/11Ea3pn4GA==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-tools/optimize': 2.0.0(graphql@16.8.1) + '@graphql-tools/relay-operation-optimizer': 7.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.1.0(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + dependency-graph: 0.11.0 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + parse-filepath: 1.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/visitor-plugin-common@5.1.0(graphql@16.8.1): resolution: {integrity: sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg==} peerDependencies: @@ -2700,7 +2978,7 @@ packages: dependencies: '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) '@graphql-tools/optimize': 2.0.0(graphql@16.8.1) - '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@16.8.1) + '@graphql-tools/relay-operation-optimizer': 7.0.0(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) auto-bind: 4.0.0 change-case-all: 1.0.15 @@ -2714,15 +2992,15 @@ packages: - supports-color dev: true - /@graphql-tools/apollo-engine-loader@8.0.1(graphql@16.8.1): - resolution: {integrity: sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==} + /@graphql-tools/apollo-engine-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.17 + '@whatwg-node/fetch': 0.9.8 graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: @@ -2737,12 +3015,12 @@ packages: '@graphql-tools/utils': 8.9.0(graphql@16.8.1) dataloader: 2.1.0 graphql: 16.8.1 - tslib: 2.4.1 + tslib: 2.6.2 value-or-promise: 1.0.11 dev: false - /@graphql-tools/batch-execute@9.0.4(graphql@16.8.1): - resolution: {integrity: sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==} + /@graphql-tools/batch-execute@9.0.0(graphql@16.8.1): + resolution: {integrity: sha512-lT9/1XmPSYzBcEybXPLsuA6C5E0t8438PVUELABcqdvwHgZ3VOOx29MLBEqhr2oewOlDChH6PXNkfxoOoAuzRg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -2753,35 +3031,37 @@ packages: tslib: 2.6.2 value-or-promise: 1.0.12 - /@graphql-tools/code-file-loader@8.1.1(graphql@16.8.1): - resolution: {integrity: sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ==} + /@graphql-tools/code-file-loader@8.0.1(@babel/core@7.23.9)(graphql@16.8.1): + resolution: {integrity: sha512-pmg81lsIXGW3uW+nFSCIG0lFQIxWVbgDjeBkSWlnP8CZsrHTQEkB53DT7t4BHLryoxDS4G4cPxM52yNINDSL8w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.0(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 8.0.1(@babel/core@7.23.9)(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) globby: 11.1.0 graphql: 16.8.1 tslib: 2.6.2 unixify: 1.0.0 transitivePeerDependencies: + - '@babel/core' - supports-color dev: true - /@graphql-tools/delegate@10.0.4(graphql@16.8.1): - resolution: {integrity: sha512-WswZRbQZMh/ebhc8zSomK9DIh6Pd5KbuiMsyiKkKz37TWTrlCOe+4C/fyrBFez30ksq6oFyCeSKMwfrCbeGo0Q==} + /@graphql-tools/delegate@10.0.0(graphql@16.8.1): + resolution: {integrity: sha512-ZW5/7Q0JqUM+guwn8/cM/1Hz16Zvj6WR6r3gnOwoPO7a9bCbe8QTCk4itT/EO+RiGT8RLUPYaunWR9jxfNqqOA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/batch-execute': 9.0.4(graphql@16.8.1) - '@graphql-tools/executor': 1.2.1(graphql@16.8.1) + '@graphql-tools/batch-execute': 9.0.0(graphql@16.8.1) + '@graphql-tools/executor': 1.1.0(graphql@16.8.1) '@graphql-tools/schema': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.2 + value-or-promise: 1.0.12 /@graphql-tools/delegate@8.8.1(graphql@16.8.1): resolution: {integrity: sha512-NDcg3GEQmdEHlnF7QS8b4lM1PSF+DKeFcIlLEfZFBvVq84791UtJcDj8734sIHLukmyuAxXMfA1qLd2l4lZqzA==} @@ -2808,76 +3088,76 @@ packages: tslib: 2.6.2 dev: true - /@graphql-tools/executor-graphql-ws@1.1.2(graphql@16.8.1): - resolution: {integrity: sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg==} + /@graphql-tools/executor-graphql-ws@1.1.0(graphql@16.8.1): + resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@types/ws': 8.5.10 + '@types/ws': 8.5.3 graphql: 16.8.1 - graphql-ws: 5.15.0(graphql@16.8.1) - isomorphic-ws: 5.0.0(ws@8.16.0) + graphql-ws: 5.14.0(graphql@16.8.1) + isomorphic-ws: 5.0.0(ws@8.15.1) tslib: 2.6.2 - ws: 8.16.0 + ws: 8.15.1 transitivePeerDependencies: - bufferutil - utf-8-validate - /@graphql-tools/executor-http@1.0.9(graphql@16.8.1): - resolution: {integrity: sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q==} + /@graphql-tools/executor-http@1.0.1(@types/node@18.19.19)(graphql@16.8.1): + resolution: {integrity: sha512-36D2oxVuv7NboFdPPS9MDOICvsg08P1K9xkqcQTB4UQogkUn58ZFfWM+4cZ9rwfNCIPTIzH4quoj7Xo09xbzmw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@repeaterjs/repeater': 3.0.5 - '@whatwg-node/fetch': 0.9.17 + '@repeaterjs/repeater': 3.0.4 + '@whatwg-node/fetch': 0.9.8 extract-files: 11.0.0 graphql: 16.8.1 - meros: 1.3.0 + meros: 1.2.1(@types/node@18.19.19) tslib: 2.6.2 value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' - /@graphql-tools/executor-legacy-ws@1.0.6(graphql@16.8.1): - resolution: {integrity: sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg==} + /@graphql-tools/executor-legacy-ws@1.0.1(graphql@16.8.1): + resolution: {integrity: sha512-PQrTJ+ncHMEQspBARc2lhwiQFfRAX/z/CsOdZTFjIljOHgRWGAA1DAx7pEN0j6PflbLCfZ3NensNq2jCBwF46w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@types/ws': 8.5.10 + '@types/ws': 8.5.3 graphql: 16.8.1 - isomorphic-ws: 5.0.0(ws@8.16.0) + isomorphic-ws: 5.0.0(ws@8.13.0) tslib: 2.6.2 - ws: 8.16.0 + ws: 8.13.0 transitivePeerDependencies: - bufferutil - utf-8-validate - /@graphql-tools/executor@1.2.1(graphql@16.8.1): - resolution: {integrity: sha512-BP5UI1etbNOXmTSt7q4NL1+zsURFgh2pG+Hyt9K/xO0LlsfbSx59L5dHLerqZP7Js0xI6GYqrUQ4m29rUwUHJg==} + /@graphql-tools/executor@1.1.0(graphql@16.8.1): + resolution: {integrity: sha512-+1wmnaUHETSYxiK/ELsT60x584Rw3QKBB7F/7fJ83HKPnLifmE2Dm/K9Eyt6L0Ppekf1jNUbWBpmBGb8P5hAeg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/utils': 10.1.0(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@repeaterjs/repeater': 3.0.5 + '@repeaterjs/repeater': 3.0.4 graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 - /@graphql-tools/git-loader@8.0.5(graphql@16.8.1): - resolution: {integrity: sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA==} + /@graphql-tools/git-loader@8.0.1(@babel/core@7.23.9)(graphql@16.8.1): + resolution: {integrity: sha512-ivNtxD+iEfpPONYKip0kbpZMRdMCNR3HrIui8NCURmUdvBYGaGcbB3VrGMhxwZuzc+ybhs2ralPt1F8Oxq2jLA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.0(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 8.0.1(@babel/core@7.23.9)(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) graphql: 16.8.1 is-glob: 4.0.3 @@ -2885,24 +3165,26 @@ packages: tslib: 2.6.2 unixify: 1.0.0 transitivePeerDependencies: + - '@babel/core' - supports-color dev: true - /@graphql-tools/github-loader@8.0.1(graphql@16.8.1): - resolution: {integrity: sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==} + /@graphql-tools/github-loader@8.0.0(@babel/core@7.23.9)(@types/node@18.19.19)(graphql@16.8.1): + resolution: {integrity: sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/executor-http': 1.0.9(graphql@16.8.1) - '@graphql-tools/graphql-tag-pluck': 8.3.0(graphql@16.8.1) + '@graphql-tools/executor-http': 1.0.1(@types/node@18.19.19)(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 8.0.1(@babel/core@7.23.9)(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@whatwg-node/fetch': 0.9.17 + '@whatwg-node/fetch': 0.9.8 graphql: 16.8.1 tslib: 2.6.2 value-or-promise: 1.0.12 transitivePeerDependencies: + - '@babel/core' - '@types/node' - encoding - supports-color @@ -2921,21 +3203,21 @@ packages: tslib: 2.6.2 unixify: 1.0.0 - /@graphql-tools/graphql-tag-pluck@8.3.0(graphql@16.8.1): - resolution: {integrity: sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw==} + /@graphql-tools/graphql-tag-pluck@8.0.1(@babel/core@7.23.9)(graphql@16.8.1): + resolution: {integrity: sha512-4sfBJSoXxVB4rRCCp2GTFhAYsUJgAPSKxSV+E3Voc600mK52JO+KsHCCTnPgCeyJFMNR9l94J6+tqxVKmlqKvw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.24.0) - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.23.9) + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@graphql-tools/utils': 10.1.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 transitivePeerDependencies: + - '@babel/core' - supports-color dev: true @@ -2950,8 +3232,8 @@ packages: resolve-from: 5.0.0 tslib: 2.6.2 - /@graphql-tools/json-file-loader@8.0.1(graphql@16.8.1): - resolution: {integrity: sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==} + /@graphql-tools/json-file-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3014,27 +3296,27 @@ packages: tslib: 2.6.2 dev: true - /@graphql-tools/prisma-loader@8.0.3(graphql@16.8.1): - resolution: {integrity: sha512-oZhxnMr3Jw2WAW1h9FIhF27xWzIB7bXWM8olz4W12oII4NiZl7VRkFw9IT50zME2Bqi9LGh9pkmMWkjvbOpl+Q==} + /@graphql-tools/prisma-loader@8.0.1(@types/node@18.19.19)(graphql@16.8.1): + resolution: {integrity: sha512-bl6e5sAYe35Z6fEbgKXNrqRhXlCJYeWKBkarohgYA338/SD9eEhXtg3Cedj7fut3WyRLoQFpHzfiwxKs7XrgXg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/url-loader': 8.0.2(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.19.19)(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@types/js-yaml': 4.0.9 - '@types/json-stable-stringify': 1.0.36 - '@whatwg-node/fetch': 0.9.17 + '@types/js-yaml': 4.0.5 + '@types/json-stable-stringify': 1.0.34 + '@whatwg-node/fetch': 0.9.8 chalk: 4.1.2 debug: 4.3.4(supports-color@9.4.0) dotenv: 16.4.5 graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - jose: 5.2.3 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + jose: 4.13.1 js-yaml: 4.1.0 - json-stable-stringify: 1.1.1 + json-stable-stringify: 1.0.1 lodash: 4.17.21 scuid: 1.1.0 tslib: 2.6.2 @@ -3047,8 +3329,8 @@ packages: - utf-8-validate dev: true - /@graphql-tools/relay-operation-optimizer@7.0.1(graphql@16.8.1): - resolution: {integrity: sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==} + /@graphql-tools/relay-operation-optimizer@7.0.0(graphql@16.8.1): + resolution: {integrity: sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3098,32 +3380,45 @@ packages: value-or-promise: 1.0.12 dev: false - /@graphql-tools/url-loader@8.0.2(graphql@16.8.1): - resolution: {integrity: sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==} + /@graphql-tools/url-loader@8.0.0(@types/node@18.19.19)(graphql@16.8.1): + resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/delegate': 10.0.4(graphql@16.8.1) - '@graphql-tools/executor-graphql-ws': 1.1.2(graphql@16.8.1) - '@graphql-tools/executor-http': 1.0.9(graphql@16.8.1) - '@graphql-tools/executor-legacy-ws': 1.0.6(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.0(graphql@16.8.1) + '@graphql-tools/executor-graphql-ws': 1.1.0(graphql@16.8.1) + '@graphql-tools/executor-http': 1.0.1(@types/node@18.19.19)(graphql@16.8.1) + '@graphql-tools/executor-legacy-ws': 1.0.1(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - '@graphql-tools/wrap': 10.0.2(graphql@16.8.1) - '@types/ws': 8.5.10 - '@whatwg-node/fetch': 0.9.17 + '@graphql-tools/wrap': 10.0.0(graphql@16.8.1) + '@types/ws': 8.5.3 + '@whatwg-node/fetch': 0.9.8 graphql: 16.8.1 - isomorphic-ws: 5.0.0(ws@8.16.0) + isomorphic-ws: 5.0.0(ws@8.15.1) tslib: 2.6.2 value-or-promise: 1.0.12 - ws: 8.16.0 + ws: 8.15.1 transitivePeerDependencies: - '@types/node' - bufferutil - encoding - utf-8-validate + /@graphql-tools/utils@10.0.11(graphql@16.8.1): + resolution: {integrity: sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-inspect: 1.0.0 + dset: 3.1.3 + graphql: 16.8.1 + tslib: 2.6.2 + dev: true + /@graphql-tools/utils@10.1.0(graphql@16.8.1): resolution: {integrity: sha512-wLPqhgeZ9BZJPRoaQbsDN/CtJDPd/L4qmmtPkjI3NuYJ39x+Eqz1Sh34EAGMuDh+xlOHqBwHczkZUpoK9tvzjw==} engines: {node: '>=16.0.0'} @@ -3142,7 +3437,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 16.8.1 - tslib: 2.4.1 + tslib: 2.6.2 dev: false /@graphql-tools/utils@9.2.1(graphql@16.8.1): @@ -3155,13 +3450,13 @@ packages: tslib: 2.6.2 dev: false - /@graphql-tools/wrap@10.0.2(graphql@16.8.1): - resolution: {integrity: sha512-nb/YjBcyF02KBCy3hiyw0nBKIC+qkiDY/tGMCcIe4pM6BPEcnreaPhXA28Rdge7lKtySF4Mhbc86XafFH5bIkQ==} + /@graphql-tools/wrap@10.0.0(graphql@16.8.1): + resolution: {integrity: sha512-HDOeUUh6UhpiH0WPJUQl44ODt1x5pnMUbOJZ7GjTdGQ7LK0AgVt3ftaAQ9duxLkiAtYJmu5YkULirfZGj4HzDg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/delegate': 10.0.4(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.0(graphql@16.8.1) '@graphql-tools/schema': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) graphql: 16.8.1 @@ -3180,7 +3475,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: false /@grpc/proto-loader@0.7.10: @@ -3201,7 +3496,7 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 dependencies: - '@tanstack/react-virtual': 3.1.3(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-virtual': 3.0.1(react-dom@18.2.0)(react@18.2.0) client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3240,7 +3535,7 @@ packages: dependencies: http-message-signatures: 0.1.2 httpbis-digest-headers: 1.0.0 - jose: 4.15.5 + jose: 4.13.1 uuid: 9.0.1 /@interledger/http-signature-utils@2.0.2: @@ -3248,7 +3543,7 @@ packages: dependencies: http-message-signatures: 1.0.4 httpbis-digest-headers: 1.0.0 - jose: 4.15.5 + jose: 4.13.1 uuid: 9.0.1 /@interledger/open-payments@6.7.0: @@ -3288,7 +3583,7 @@ packages: ilp-packet: 3.1.4-alpha.2 ilp-protocol-stream: 2.7.2-alpha.2 long: 4.0.0 - node-fetch: 2.7.0 + node-fetch: 2.6.7 transitivePeerDependencies: - encoding - supports-color @@ -3344,7 +3639,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -3365,14 +3660,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 3.8.0 exit: 0.1.2 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.22) + jest-config: 29.7.0(@types/node@18.19.19) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -3407,7 +3702,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 jest-mock: 29.7.0 dev: true @@ -3433,8 +3728,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.22 + '@sinonjs/fake-timers': 10.0.2 + '@types/node': 18.19.19 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -3466,25 +3761,25 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.22 + '@jridgewell/trace-mapping': 0.3.23 + '@types/node': 18.19.19 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-report: 3.0.1 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 6.0.0 + istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.1.5 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.0.1 transitivePeerDependencies: - supports-color dev: true @@ -3500,9 +3795,9 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.23 callsites: 3.1.0 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 dev: true /@jest/test-result@29.7.0: @@ -3511,8 +3806,8 @@ packages: dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 dev: true /@jest/test-sequencer@29.7.0: @@ -3520,7 +3815,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-haste-map: 29.7.0 slash: 3.0.0 dev: true @@ -3529,19 +3824,19 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.23 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 micromatch: 4.0.5 - pirates: 4.0.6 + pirates: 4.0.5 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: @@ -3552,10 +3847,10 @@ packages: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.22 - '@types/yargs': 15.0.19 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.19.19 + '@types/yargs': 15.0.14 chalk: 4.1.2 dev: true @@ -3564,10 +3859,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.22 - '@types/yargs': 17.0.32 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.19.19 + '@types/yargs': 17.0.11 chalk: 4.1.2 dev: true @@ -3575,27 +3870,48 @@ packages: resolution: {integrity: sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==} dev: false - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.2.1 + '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.23 + dev: true + + /@jridgewell/gen-mapping@0.3.4: + resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.23 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.23: + resolution: {integrity: sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 @@ -3607,9 +3923,6 @@ packages: resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} dev: true - /@kamilkisiela/fast-url-parser@1.1.4: - resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} - /@koa/cors@5.0.0: resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} @@ -3617,37 +3930,34 @@ packages: vary: 1.1.2 dev: false - /@koa/router@12.0.1: - resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==} + /@koa/router@12.0.0: + resolution: {integrity: sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==} engines: {node: '>= 12'} dependencies: - debug: 4.3.4(supports-color@9.4.0) http-errors: 2.0.0 koa-compose: 4.1.0 methods: 1.1.2 path-to-regexp: 6.2.1 - transitivePeerDependencies: - - supports-color dev: false /@mdx-js/mdx@2.3.0: resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/mdx': 2.0.11 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.7 + estree-util-build-jsx: 2.2.0 + estree-util-is-identifier-name: 2.0.1 estree-util-to-js: 1.2.0 estree-walker: 3.0.3 - hast-util-to-estree: 2.3.3 + hast-util-to-estree: 2.1.0 markdown-extensions: 1.1.1 - periscopic: 3.1.0 + periscopic: 3.0.4 remark-mdx: 2.3.0 remark-parse: 10.0.2 remark-rehype: 10.1.0 unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 + unist-util-position-from-estree: 1.1.1 + unist-util-stringify-position: 3.0.2 unist-util-visit: 4.1.2 vfile: 5.3.7 transitivePeerDependencies: @@ -3675,13 +3985,13 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.13.0 /@npmcli/fs@3.1.0: resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.6.0 + semver: 7.5.4 dev: true /@npmcli/git@4.1.0: @@ -3694,7 +4004,7 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.6.0 + semver: 7.5.4 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -3710,7 +4020,7 @@ packages: json-parse-even-better-errors: 3.0.1 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.5.4 transitivePeerDependencies: - bluebird dev: true @@ -3726,170 +4036,137 @@ packages: resolution: {integrity: sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==} engines: {node: '>=14'} dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.7.0 dev: false - /@opentelemetry/api@1.8.0: - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + /@opentelemetry/api@1.7.0: + resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} engines: {node: '>=8.0.0'} dev: false - /@opentelemetry/core@1.21.0(@opentelemetry/api@1.8.0): + /@opentelemetry/core@1.21.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.7.0 '@opentelemetry/semantic-conventions': 1.21.0 dev: false - /@opentelemetry/core@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/semantic-conventions': 1.22.0 - dev: false - - /@opentelemetry/exporter-metrics-otlp-grpc@0.48.0(@opentelemetry/api@1.8.0): + /@opentelemetry/exporter-metrics-otlp-grpc@0.48.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-DcACDP4keD6hiWI4uMgIo1dFQpxuH9zAwTceB8P8NdZVeOMtP4KyevcwM7FFMZZPd4ha9agsaPFwHk7eCTBcAA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 dependencies: '@grpc/grpc-js': 1.10.1 - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.48.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.48.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.48.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.48.0(@opentelemetry/api@1.7.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.48.0(@opentelemetry/api@1.7.0) + '@opentelemetry/otlp-transformer': 0.48.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-metrics': 1.21.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/exporter-metrics-otlp-http@0.48.0(@opentelemetry/api@1.8.0): + /@opentelemetry/exporter-metrics-otlp-http@0.48.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-lZ0gah/WjPpUBVR2Qml8GHraLznsXEpmIS897vdL2IXCxJzGev7sCb9IwAiq89+MgHkuGUWhTWFB2frKrqX1sA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.48.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.48.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/otlp-exporter-base': 0.48.0(@opentelemetry/api@1.7.0) + '@opentelemetry/otlp-transformer': 0.48.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-metrics': 1.21.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/otlp-exporter-base@0.48.0(@opentelemetry/api@1.8.0): + /@opentelemetry/otlp-exporter-base@0.48.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/otlp-grpc-exporter-base@0.48.0(@opentelemetry/api@1.8.0): + /@opentelemetry/otlp-grpc-exporter-base@0.48.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-Vdp56RK9OU+Oeoy3YQC/UMOWglKQ9qvgGr49FgF4r8vk5DlcTUgVS0m3KG8pykmRPA+5ZKaDuqwPw5aTvWmHFw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: '@grpc/grpc-js': 1.10.1 - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.48.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/otlp-exporter-base': 0.48.0(@opentelemetry/api@1.7.0) protobufjs: 7.2.6 dev: false - /@opentelemetry/otlp-transformer@0.48.0(@opentelemetry/api@1.8.0): + /@opentelemetry/otlp-transformer@0.48.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.7.0 '@opentelemetry/api-logs': 0.48.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-logs': 0.48.0(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-logs': 0.48.0(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-metrics': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-trace-base': 1.21.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/resources@1.21.0(@opentelemetry/api@1.8.0): + /@opentelemetry/resources@1.21.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.21.0 dev: false - /@opentelemetry/resources@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.22.0 - dev: false - - /@opentelemetry/sdk-logs@0.48.0(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.8.0): + /@opentelemetry/sdk-logs@0.48.0(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.8.0' '@opentelemetry/api-logs': '>=0.39.1' dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.7.0 '@opentelemetry/api-logs': 0.48.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/sdk-metrics@1.21.0(@opentelemetry/api@1.8.0): + /@opentelemetry/sdk-metrics@1.21.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) lodash.merge: 4.6.2 dev: false - /@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - lodash.merge: 4.6.2 - dev: false - - /@opentelemetry/sdk-trace-base@1.21.0(@opentelemetry/api@1.8.0): + /@opentelemetry/sdk-trace-base@1.21.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.21.0 dev: false @@ -3898,60 +4175,55 @@ packages: engines: {node: '>=14'} dev: false - /@opentelemetry/semantic-conventions@1.22.0: - resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==} - engines: {node: '>=14'} - dev: false - - /@pagefind/darwin-arm64@1.0.4: - resolution: {integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==} + /@pagefind/darwin-arm64@1.0.3: + resolution: {integrity: sha512-vsHDtvao3W4iFCxVc4S0BVhpj3E2MAoIVM7RmuQfGp1Ng22nGLRaMP6FguLO8TMabRJdvp4SVr227hL4WGKOHA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /@pagefind/darwin-x64@1.0.4: - resolution: {integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==} + /@pagefind/darwin-x64@1.0.3: + resolution: {integrity: sha512-NhEXHHYmB/hT6lx5rCcmnVTxH+uIkMAd43bzEqMwHQosqTZEIQfwihmV39H+m8yo7jFvz3zRbJNzhAh7G4PiwA==} cpu: [x64] os: [darwin] requiresBuild: true dev: false optional: true - /@pagefind/default-ui@1.0.4: - resolution: {integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==} + /@pagefind/default-ui@1.0.3: + resolution: {integrity: sha512-WieFJXvezyvjZh49I8j7a7Kz3LsXYY2Uep3IWvG5NG05mmiurURXjXc+KyrpIp/iAycSnjrC1TDJ8CdES/ee3A==} dev: false - /@pagefind/linux-arm64@1.0.4: - resolution: {integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==} + /@pagefind/linux-arm64@1.0.3: + resolution: {integrity: sha512-RGsMt4AmGT8WxCSeP09arU7Za6Vf/We4TWHVSbY7vDMuwWql9Ngoib/q1cP9dIAIMdkXh9ePG/S3mGnJYsdzuQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@pagefind/linux-x64@1.0.4: - resolution: {integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==} + /@pagefind/linux-x64@1.0.3: + resolution: {integrity: sha512-o+VCKaqImL42scSH1n5gUfppYSNyu3BuGTvtKKgWHmycbL+A3fkFH+ZOFbaLeN7LVTvJqJIOYbk4j2yaq9784Q==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@pagefind/windows-x64@1.0.4: - resolution: {integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==} + /@pagefind/windows-x64@1.0.3: + resolution: {integrity: sha512-S+Yq4FyvXJm4F+iN/wRiLvEEF8Xs9lTKGtQGaRHXJslQyl65dytDDPIULXJXIadrDbnMrnTt4C2YHmEUIyUIHg==} cpu: [x64] os: [win32] requiresBuild: true dev: false optional: true - /@peculiar/asn1-schema@2.3.8: - resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} + /@peculiar/asn1-schema@2.3.0: + resolution: {integrity: sha512-DtNLAG4vmDrdSJFPe7rypkcj597chNQL7u+2dBtYo5mh7VW2+im6ke+O0NVr8W1f4re4C3F71LhoMb0Yxqa48Q==} dependencies: asn1js: 3.0.5 - pvtsutils: 1.3.5 + pvtsutils: 1.3.2 tslib: 2.6.2 dev: true @@ -3962,15 +4234,15 @@ packages: tslib: 2.6.2 dev: true - /@peculiar/webcrypto@1.4.5: - resolution: {integrity: sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==} + /@peculiar/webcrypto@1.4.0: + resolution: {integrity: sha512-U58N44b2m3OuTgpmKgf0LPDOmP3bhwNz01vAnj1mBwxBASRhptWYK+M3zG+HBkDqGQM+bFsoIihTW8MdmPXEqg==} engines: {node: '>=10.12.0'} dependencies: - '@peculiar/asn1-schema': 2.3.8 + '@peculiar/asn1-schema': 2.3.0 '@peculiar/json-schema': 1.1.12 - pvtsutils: 1.3.5 + pvtsutils: 1.3.2 tslib: 2.6.2 - webcrypto-core: 1.7.8 + webcrypto-core: 1.7.5 dev: true /@pkgjs/parseargs@0.11.0: @@ -3980,6 +4252,18 @@ packages: dev: true optional: true + /@pkgr/utils@2.3.1: + resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + is-glob: 4.0.3 + open: 8.4.0 + picocolors: 1.0.0 + tiny-glob: 0.2.9 + tslib: 2.6.2 + dev: true + /@poppinss/file-generator@1.0.2: resolution: {integrity: sha512-rRob//4jLbUVbDSsNRihloKGgpyVsWdFQWUmONxX/gyv4koT1OlVoc3ccWgk7Y/sEa2cFxj3zrFs+wdT09iXWw==} dependencies: @@ -3990,12 +4274,12 @@ packages: resolution: {integrity: sha512-6LS3mofSVB9IQZqofA4rX6KVVcCpdwUQuNe4efHqOTzgD/Q5HTVvDP0vKg1m994QlzJs4aLW1JwXVcNCThEh4g==} dependencies: '@poppinss/file-generator': 1.0.2 - '@types/bytes': 3.1.4 - '@types/he': 1.2.3 + '@types/bytes': 3.1.1 + '@types/he': 1.1.2 bytes: 3.1.2 change-case: 4.1.2 cuid: 2.1.8 - flattie: 1.1.1 + flattie: 1.1.0 fs-readdir-recursive: 1.1.0 he: 1.2.0 kind-of: 6.0.3 @@ -4004,7 +4288,7 @@ packages: pluralize: 8.0.0 require-all: 3.0.0 resolve-from: 5.0.0 - slugify: 1.6.6 + slugify: 1.6.5 truncatise: 0.0.8 dev: false @@ -4051,15 +4335,15 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@remix-run/dev@2.8.1(@remix-run/serve@2.8.1)(@types/node@18.19.22)(typescript@5.4.2): - resolution: {integrity: sha512-qFt4jAsAJeIOyg6ngeSnTG/9Z5N9QJfeThP/8wRHc1crqYgTiEtcI3DZ8WlAXjVSF5emgn/ZZKqzLAI02OgMfQ==} + /@remix-run/dev@2.6.0(@remix-run/serve@2.6.0)(@types/node@18.11.9)(typescript@5.4.2): + resolution: {integrity: sha512-wf5DoKxBwz3/84FNyFM6NKvQIOEv+Ukwj9DjXrDs6YLI6oSqw2XsJCxWN4lAbOxXuK37pBt1WAE8LzEMuyowsw==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@remix-run/serve': ^2.8.1 + '@remix-run/serve': ^2.6.0 typescript: ^5.1.0 - vite: ^5.1.0 - wrangler: ^3.28.2 + vite: ^5.0.0 + wrangler: ^3.24.0 peerDependenciesMeta: '@remix-run/serve': optional: true @@ -4070,34 +4354,34 @@ packages: wrangler: optional: true dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/parser': 7.24.0 - '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.24.0) - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/preset-typescript': 7.23.3(@babel/core@7.24.0) - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/preset-typescript': 7.21.5(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.8.1(typescript@5.4.2) - '@remix-run/router': 1.15.3-pre.0 - '@remix-run/serve': 2.8.1(typescript@5.4.2) - '@remix-run/server-runtime': 2.8.1(typescript@5.4.2) - '@types/mdx': 2.0.11 - '@vanilla-extract/integration': 6.5.0(@types/node@18.19.22) + '@remix-run/node': 2.6.0(typescript@5.4.2) + '@remix-run/router': 1.15.0 + '@remix-run/serve': 2.6.0(typescript@5.4.2) + '@remix-run/server-runtime': 2.6.0(typescript@5.4.2) + '@types/mdx': 2.0.7 + '@vanilla-extract/integration': 6.2.1(@types/node@18.11.9) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 - chokidar: 3.6.0 + chokidar: 3.5.3 cross-spawn: 7.0.3 - dotenv: 16.4.5 + dotenv: 16.4.1 es-module-lexer: 1.4.1 esbuild: 0.17.6 - esbuild-plugins-node-modules-polyfill: 1.6.3(esbuild@0.17.6) + esbuild-plugins-node-modules-polyfill: 1.6.1(esbuild@0.17.6) execa: 5.1.1 exit-hook: 2.2.1 - express: 4.18.3 + express: 4.18.1 fs-extra: 10.1.0 get-port: 5.1.1 gunzip-maybe: 1.4.2 @@ -4110,19 +4394,19 @@ packages: picocolors: 1.0.0 picomatch: 2.3.1 pidtree: 0.6.0 - postcss: 8.4.35 - postcss-discard-duplicates: 5.1.0(postcss@8.4.35) - postcss-load-config: 4.0.2(postcss@8.4.35) - postcss-modules: 6.0.0(postcss@8.4.35) + postcss: 8.4.30 + postcss-discard-duplicates: 5.1.0(postcss@8.4.30) + postcss-load-config: 4.0.1(postcss@8.4.30) + postcss-modules: 6.0.0(postcss@8.4.30) prettier: 2.8.8 pretty-ms: 7.0.1 react-refresh: 0.14.0 remark-frontmatter: 4.0.1 remark-mdx-frontmatter: 1.1.1 - semver: 7.6.0 + semver: 7.5.4 set-cookie-parser: 2.6.0 tar-fs: 2.1.1 - tsconfig-paths: 4.2.0 + tsconfig-paths: 4.1.0 typescript: 5.4.2 ws: 7.5.9 transitivePeerDependencies: @@ -4140,8 +4424,8 @@ packages: - utf-8-validate dev: true - /@remix-run/eslint-config@2.8.1(eslint@8.57.0)(jest@29.7.0)(react@18.2.0)(typescript@5.4.2): - resolution: {integrity: sha512-lH5/H8oznYk0pVhrNTBt7+++U+guEKOYFwK1aO3zoeyrBtSc7OdX1KWWFlJw0IdGVMSKDqnW3U0n1VbIa4sX/g==} + /@remix-run/eslint-config@2.6.0(eslint@8.57.0)(jest@29.7.0)(react@18.2.0)(typescript@5.4.2): + resolution: {integrity: sha512-WIYyCl8qHNDyZy05ggzl/x3wbnLtmHWOaeSqvtshYbvBsKpyLT0xVQNWyj0XEzk6hWWk+93b0yQ5ihumjM4Y1Q==} engines: {node: '>=18.0.0'} peerDependencies: eslint: ^8.0.0 @@ -4151,23 +4435,23 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.24.0 - '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@8.57.0) - '@babel/preset-react': 7.23.3(@babel/core@7.24.0) - '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@babel/core': 7.23.2 + '@babel/eslint-parser': 7.21.8(@babel/core@7.23.2)(eslint@8.57.0) + '@babel/preset-react': 7.18.6(@babel/core@7.23.2) + '@rushstack/eslint-patch': 1.2.0 + '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 5.60.1(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@29.7.0)(typescript@5.4.2) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.57.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.60.1)(eslint@8.57.0)(jest@29.7.0)(typescript@5.4.2) eslint-plugin-jest-dom: 4.0.3(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-node: 11.1.0(eslint@8.57.0) eslint-plugin-react: 7.34.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.4.2) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.4.2) react: 18.2.0 typescript: 5.4.2 transitivePeerDependencies: @@ -4176,8 +4460,8 @@ packages: - supports-color dev: true - /@remix-run/express@2.8.1(express@4.18.3)(typescript@5.4.2): - resolution: {integrity: sha512-p1eo8uwZk8uLihSDpUnPOPsTDfghWikVPQfa+e0ZMk6tnJCjcpHAyENKDFtn9vDh9h7YNUg6A7+19CStHgxd7Q==} + /@remix-run/express@2.6.0(express@4.18.1)(typescript@5.4.2): + resolution: {integrity: sha512-sAb0eoMwqP4yhDCnT5H6Db0svfzBuRbuPuPSbQCtuLRWkEGmIhWN7vKA0IqaxsUA09qKwQQiKQdupra55KfCyA==} engines: {node: '>=18.0.0'} peerDependencies: express: ^4.17.1 @@ -4186,12 +4470,12 @@ packages: typescript: optional: true dependencies: - '@remix-run/node': 2.8.1(typescript@5.4.2) - express: 4.18.3 + '@remix-run/node': 2.6.0(typescript@5.4.2) + express: 4.18.1 typescript: 5.4.2 - /@remix-run/node@2.8.1(typescript@5.4.2): - resolution: {integrity: sha512-ddCwBVlfLvRxTQJHPcaM1lhfMjsFYG3EGmYpWJIWnnzDX5EbX9pUNHBWisMuH1eA0c7pbw0PbW0UtCttKYx2qg==} + /@remix-run/node@2.6.0(typescript@5.4.2): + resolution: {integrity: sha512-bWemy3g258Kdqi+4OxIEZ7QS64T96jNK6a7NdlPXGJZqeLpxM5NmlCl/slSdx52oTi9r5Xoz1Tm4uR37nD1/Xw==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -4199,18 +4483,18 @@ packages: typescript: optional: true dependencies: - '@remix-run/server-runtime': 2.8.1(typescript@5.4.2) + '@remix-run/server-runtime': 2.6.0(typescript@5.4.2) '@remix-run/web-fetch': 4.4.2 '@remix-run/web-file': 3.1.0 '@remix-run/web-stream': 1.1.0 '@web3-storage/multipart-parser': 1.0.0 - cookie-signature: 1.2.1 + cookie-signature: 1.2.0 source-map-support: 0.5.21 stream-slice: 0.1.2 typescript: 5.4.2 - /@remix-run/react@2.8.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): - resolution: {integrity: sha512-HTPm1U8+xz2jPaVjZnssrckfmFMA8sUZUdaWnoF5lmLWdReqcQv+XlBhIrQQ3jO9L8iYYdnzaSZZcRFYSdpTYg==} + /@remix-run/react@2.6.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): + resolution: {integrity: sha512-m/Ph6bryny7wrmrQyXQMvIiW+cBLrU/MepcLGFPvTVVwvfeiGBgXRiYZJ6yPNsfrmHFaS83d+Ja/Mx4N4zUWcg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0.0 @@ -4220,34 +4504,29 @@ packages: typescript: optional: true dependencies: - '@remix-run/router': 1.15.3 - '@remix-run/server-runtime': 2.8.1(typescript@5.4.2) + '@remix-run/router': 1.15.0 + '@remix-run/server-runtime': 2.6.0(typescript@5.4.2) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.22.3(react@18.2.0) - react-router-dom: 6.22.3(react-dom@18.2.0)(react@18.2.0) + react-router: 6.22.0(react@18.2.0) + react-router-dom: 6.22.0(react-dom@18.2.0)(react@18.2.0) typescript: 5.4.2 dev: false - /@remix-run/router@1.15.3: - resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} - engines: {node: '>=14.0.0'} - - /@remix-run/router@1.15.3-pre.0: - resolution: {integrity: sha512-JUQb6sztqJpRbsdKpx3D4+6eaGmHU4Yb/QeKrES/ZbLuijlZMOmZ+gV0ohX5vrRDnJHJmcQPq3Tpk0GGPNM9gg==} + /@remix-run/router@1.15.0: + resolution: {integrity: sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==} engines: {node: '>=14.0.0'} - dev: true - /@remix-run/serve@2.8.1(typescript@5.4.2): - resolution: {integrity: sha512-PyCV7IMnRshwfFw7JJ2hZJppX88VAhZyYjeTAmYb6PK7IDtdmqUf5eOrYDi8gCu914C+aZRu6blxpLRlpyCY8Q==} + /@remix-run/serve@2.6.0(typescript@5.4.2): + resolution: {integrity: sha512-OIvGWaruFLCMLpemovitE8WnxRD/4TBPDTsgC/pSxcjDfuXv3nZk0nhAcmfklPSnxBCCct50cbtEN1xcrPqeyw==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@remix-run/express': 2.8.1(express@4.18.3)(typescript@5.4.2) - '@remix-run/node': 2.8.1(typescript@5.4.2) - chokidar: 3.6.0 + '@remix-run/express': 2.6.0(express@4.18.1)(typescript@5.4.2) + '@remix-run/node': 2.6.0(typescript@5.4.2) + chokidar: 3.5.3 compression: 1.7.4 - express: 4.18.3 + express: 4.18.1 get-port: 5.1.1 morgan: 1.10.0 source-map-support: 0.5.21 @@ -4255,8 +4534,8 @@ packages: - supports-color - typescript - /@remix-run/server-runtime@2.8.1(typescript@5.4.2): - resolution: {integrity: sha512-fh4SOEoONrN73Kvzc0gMDCmYpVRVbvoj9j3BUXHAcn0An8iX+HD/22gU7nTkIBzExM/F9xgEcwTewOnWqLw0Bg==} + /@remix-run/server-runtime@2.6.0(typescript@5.4.2): + resolution: {integrity: sha512-qFXDl4pK55njBLuvyRn5AkI/hu8fEU3t1XFKv0Syivx0nmUVpWMW25Uzi1pkX/chF1VIxCVrZ8KuQ1rcrKj+DQ==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -4264,7 +4543,7 @@ packages: typescript: optional: true dependencies: - '@remix-run/router': 1.15.3 + '@remix-run/router': 1.15.0 '@types/cookie': 0.6.0 '@web3-storage/multipart-parser': 1.0.0 cookie: 0.6.0 @@ -4294,147 +4573,43 @@ packages: /@remix-run/web-file@3.1.0: resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} dependencies: - '@remix-run/web-blob': 3.1.0 - - /@remix-run/web-form-data@3.1.0: - resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} - dependencies: - web-encoding: 1.1.5 - - /@remix-run/web-stream@1.1.0: - resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} - dependencies: - web-streams-polyfill: 3.3.3 - - /@repeaterjs/repeater@3.0.5: - resolution: {integrity: sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==} - - /@rollup/rollup-android-arm-eabi@4.12.1: - resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.12.1: - resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.12.1: - resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.12.1: - resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.12.1: - resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.12.1: - resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.12.1: - resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.12.1: - resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.12.1: - resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.12.1: - resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.12.1: - resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@remix-run/web-blob': 3.1.0 - /@rollup/rollup-win32-ia32-msvc@4.12.1: - resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + /@remix-run/web-form-data@3.1.0: + resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} + dependencies: + web-encoding: 1.1.5 - /@rollup/rollup-win32-x64-msvc@4.12.1: - resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + /@remix-run/web-stream@1.1.0: + resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + dependencies: + web-streams-polyfill: 3.2.1 - /@rushstack/eslint-patch@1.7.2: - resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + /@repeaterjs/repeater@3.0.4: + resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} + + /@rushstack/eslint-patch@1.2.0: + resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + /@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + /@sinonjs/fake-timers@10.0.2: + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} dependencies: - '@sinonjs/commons': 3.0.1 + '@sinonjs/commons': 2.0.0 dev: true - /@swc/core-darwin-arm64@1.4.6: - resolution: {integrity: sha512-bpggpx/BfLFyy48aUKq1PsNUxb7J6CINlpAUk0V4yXfmGnpZH80Gp1pM3GkFDQyCfq7L7IpjPrIjWQwCrL4hYw==} + /@swc/core-darwin-arm64@1.4.2: + resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -4442,8 +4617,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.4.6: - resolution: {integrity: sha512-vJn+/ZuBTg+vtNkcmgZdH6FQpa0hFVdnB9bAeqYwKkyqP15zaPe6jfC+qL2y/cIeC7ASvHXEKrnCZgBLxfVQ9w==} + /@swc/core-darwin-x64@1.4.2: + resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -4451,8 +4626,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.4.6: - resolution: {integrity: sha512-hEmYcB/9XBAl02MtuVHszhNjQpjBzhk/NFulnU33tBMbNZpy2TN5yTsitezMq090QXdDz8sKIALApDyg07ZR8g==} + /@swc/core-linux-arm-gnueabihf@1.4.2: + resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -4460,8 +4635,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.4.6: - resolution: {integrity: sha512-/UCYIVoGpm2YVvGHZM2QOA3dexa28BjcpLAIYnoCbgH5f7ulDhE8FAIO/9pasj+kixDBsdqewHfsNXFYlgGJjQ==} + /@swc/core-linux-arm64-gnu@1.4.2: + resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4469,8 +4644,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.4.6: - resolution: {integrity: sha512-LGQsKJ8MA9zZ8xHCkbGkcPSmpkZL2O7drvwsGKynyCttHhpwVjj9lguhD4DWU3+FWIsjvho5Vu0Ggei8OYi/Lw==} + /@swc/core-linux-arm64-musl@1.4.2: + resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4478,8 +4653,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.4.6: - resolution: {integrity: sha512-10JL2nLIreMQDKvq2TECnQe5fCuoqBHu1yW8aChqgHUyg9d7gfZX/kppUsuimqcgRBnS0AjTDAA+JF6UsG/2Yg==} + /@swc/core-linux-x64-gnu@1.4.2: + resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4487,8 +4662,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.4.6: - resolution: {integrity: sha512-EGyjFVzVY6Do89x8sfah7I3cuP4MwtwzmA6OlfD/KASqfCFf5eIaEBMbajgR41bVfMV7lK72lwAIea5xEyq1AQ==} + /@swc/core-linux-x64-musl@1.4.2: + resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4496,8 +4671,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.4.6: - resolution: {integrity: sha512-gfW9AuXvwSyK07Vb8Y8E9m2oJZk21WqcD+X4BZhkbKB0TCZK0zk1j/HpS2UFlr1JB2zPKPpSWLU3ll0GEHRG2A==} + /@swc/core-win32-arm64-msvc@1.4.2: + resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -4505,8 +4680,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.4.6: - resolution: {integrity: sha512-ZuQm81FhhvNVYtVb9GfZ+Du6e7fZlkisWvuCeBeRiyseNt1tcrQ8J3V67jD2nxje8CVXrwG3oUIbPcybv2rxfQ==} + /@swc/core-win32-ia32-msvc@1.4.2: + resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -4514,8 +4689,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.4.6: - resolution: {integrity: sha512-UagPb7w5V0uzWSjrXwOavGa7s9iv3wrVdEgWy+/inm0OwY4lj3zpK9qDnMWAwYLuFwkI3UG4Q3dH8wD+CUUcjw==} + /@swc/core-win32-x64-msvc@1.4.2: + resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -4523,8 +4698,8 @@ packages: dev: true optional: true - /@swc/core@1.4.6: - resolution: {integrity: sha512-A7iK9+1qzTCIuc3IYcS8gPHCm9bZVKUJrfNnwveZYyo6OFp3jLno4WOM2yBy5uqedgYATEiWgBYHKq37KrU6IA==} + /@swc/core@1.4.2: + resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -4536,32 +4711,32 @@ packages: '@swc/counter': 0.1.3 '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.6 - '@swc/core-darwin-x64': 1.4.6 - '@swc/core-linux-arm-gnueabihf': 1.4.6 - '@swc/core-linux-arm64-gnu': 1.4.6 - '@swc/core-linux-arm64-musl': 1.4.6 - '@swc/core-linux-x64-gnu': 1.4.6 - '@swc/core-linux-x64-musl': 1.4.6 - '@swc/core-win32-arm64-msvc': 1.4.6 - '@swc/core-win32-ia32-msvc': 1.4.6 - '@swc/core-win32-x64-msvc': 1.4.6 + '@swc/core-darwin-arm64': 1.4.2 + '@swc/core-darwin-x64': 1.4.2 + '@swc/core-linux-arm-gnueabihf': 1.4.2 + '@swc/core-linux-arm64-gnu': 1.4.2 + '@swc/core-linux-arm64-musl': 1.4.2 + '@swc/core-linux-x64-gnu': 1.4.2 + '@swc/core-linux-x64-musl': 1.4.2 + '@swc/core-win32-arm64-msvc': 1.4.2 + '@swc/core-win32-ia32-msvc': 1.4.2 + '@swc/core-win32-x64-msvc': 1.4.2 dev: true /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@swc/jest@0.2.36(@swc/core@1.4.6): + /@swc/jest@0.2.36(@swc/core@1.4.2): resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.4.6 + '@swc/core': 1.4.2 '@swc/counter': 0.1.3 - jsonc-parser: 3.2.1 + jsonc-parser: 3.2.0 dev: true /@swc/types@0.1.5: @@ -4577,170 +4752,170 @@ packages: tailwindcss: 3.4.1 dev: true - /@tanstack/react-virtual@3.1.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA==} + /@tanstack/react-virtual@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IFOFuRUTaiM/yibty9qQ9BfycQnYXIDHGP2+cU+0LrFFGNhVxCXSQnaY6wkX8uJVteFEBjUondX0Hmpp7TNcag==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@tanstack/virtual-core': 3.1.3 + '@tanstack/virtual-core': 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@tanstack/virtual-core@3.1.3: - resolution: {integrity: sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==} + /@tanstack/virtual-core@3.0.0: + resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} dev: false - /@testing-library/dom@8.20.1: - resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} + /@testing-library/dom@8.17.1: + resolution: {integrity: sha512-KnH2MnJUzmFNPW6RIKfd+zf2Wue8mEKX0M3cpX6aKl5ZXrJM1/c/Pc8c2xDNYQCnJO48Sm5ITbMXgqTr3h4jxQ==} engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.24.0 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + '@babel/runtime': 7.23.2 + '@types/aria-query': 4.2.2 + aria-query: 5.3.0 chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 + dom-accessibility-api: 0.5.14 + lz-string: 1.4.4 pretty-format: 27.5.1 dev: true - /@types/accepts@1.3.7: - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + /@types/accepts@1.3.5: + resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: true /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.0 - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + /@types/aria-query@4.2.2: + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.0 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + /@types/babel__traverse@7.18.0: + resolution: {integrity: sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.22 + '@types/node': 18.19.19 - /@types/bytes@3.1.4: - resolution: {integrity: sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==} + /@types/bytes@3.1.1: + resolution: {integrity: sha512-lOGyCnw+2JVPKU3wIV0srU0NyALwTBJlVSx5DfMQOFuuohA8y9S8orImpuIQikZ0uIQ8gehrRjxgQC1rLRi11w==} dev: false - /@types/caseless@0.12.5: - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + /@types/caseless@0.12.2: + resolution: {integrity: sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==} dev: true /@types/commander@2.12.2: resolution: {integrity: sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==} deprecated: This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed! dependencies: - commander: 5.1.0 + commander: 10.0.1 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 - /@types/content-disposition@0.5.8: - resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + /@types/content-disposition@0.5.5: + resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - /@types/cookiejar@2.1.5: - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + /@types/cookiejar@2.1.2: + resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} dev: true - /@types/cookies@0.9.0: - resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + /@types/cookies@0.7.7: + resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.38 '@types/express': 4.17.21 - '@types/keygrip': 1.0.6 - '@types/node': 18.19.22 + '@types/keygrip': 1.0.2 + '@types/node': 18.19.19 dev: true - /@types/d3-scale-chromatic@3.0.3: - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + /@types/d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} dev: false - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + /@types/d3-scale@4.0.5: + resolution: {integrity: sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==} dependencies: - '@types/d3-time': 3.0.3 + '@types/d3-time': 3.0.1 dev: false - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + /@types/d3-time@3.0.1: + resolution: {integrity: sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==} dev: false - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + /@types/debug@4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: - '@types/ms': 0.7.34 + '@types/ms': 0.7.31 - /@types/deep-equal@1.0.4: - resolution: {integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==} + /@types/deep-equal@1.0.3: + resolution: {integrity: sha512-xP1pB67eLrRdMLKpXUXhYN/3uiJN1gNalcVOSY5kdJbxhGuZTTE8awSWOD9LCJDzQZVsuZZcnMMLRrbf+nOUSQ==} dev: true /@types/docker-modem@3.0.6: resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} dependencies: - '@types/node': 18.19.22 - '@types/ssh2': 1.11.19 + '@types/node': 18.19.19 + '@types/ssh2': 0.5.52 dev: true - /@types/dockerode@3.3.26: - resolution: {integrity: sha512-/K+I9bGhRO2SvyIHisGeOsy/ypxnWLz8+Rde9S2tNNEKa3r91e0XMYIEq2D+kb7srm7xrmpAR0CDKfXoZOr4OA==} + /@types/dockerode@3.3.24: + resolution: {integrity: sha512-679y69OYusf7Fr2HtdjXPUF6hnHxSA9K4EsuagsMuPno/XpJHjXxCOy2I5YL8POnWbzjsQAi0pyKIYM9HSpQog==} dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: true - /@types/estree-jsx@1.0.5: - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.0 - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/estree@1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 '@types/qs': 6.9.12 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -4753,52 +4928,52 @@ packages: '@types/qs': 6.9.12 '@types/serve-static': 1.15.5 - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + /@types/graceful-fs@4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: true - /@types/hast@2.3.10: - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + /@types/hast@2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.0 - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + /@types/hast@3.0.1: + resolution: {integrity: sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 dev: false - /@types/he@1.2.3: - resolution: {integrity: sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==} + /@types/he@1.1.2: + resolution: {integrity: sha512-kSJPcLO1x+oolc0R89pUl2kozldQ/fVQ1C1p5mp8fPoLdF/ZcBvckaTC2M8xXh3GYendXvCpy5m/a2eSbfgNgw==} dev: false - /@types/http-assert@1.5.5: - resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + /@types/http-assert@1.5.3: + resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - /@types/is-number@7.0.5: - resolution: {integrity: sha512-NGmRpXeZg9qDX+AlmBeq4Xk9ruTMj0KfzspDCxTLAcpbts2EjojAvY6A1eumKHInMwGY4xHM8ILA9CHRHfUUWA==} + /@types/is-number@7.0.4: + resolution: {integrity: sha512-kGuOYjSH9tUWwWByvRNQI7OsE6h2Ub21VImBUnMA+HYgPFL9x6+65KrEofexMUmhK9y/PuZEa2kYEcABn3A0jQ==} dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: - '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: - '@types/istanbul-lib-report': 3.0.3 + '@types/istanbul-lib-report': 3.0.0 dev: true /@types/jest@29.5.12: @@ -4808,27 +4983,27 @@ packages: pretty-format: 29.7.0 dev: true - /@types/js-yaml@4.0.9: - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + /@types/js-yaml@4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - /@types/json-stable-stringify@1.0.36: - resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==} + /@types/json-stable-stringify@1.0.34: + resolution: {integrity: sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==} dev: true /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/katex@0.16.7: - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + /@types/katex@0.16.2: + resolution: {integrity: sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A==} dev: false - /@types/keygrip@1.0.6: - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + /@types/keygrip@1.0.2: + resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true /@types/koa-bodyparser@4.3.12: @@ -4837,8 +5012,8 @@ packages: '@types/koa': 2.15.0 dev: true - /@types/koa-compose@3.2.8: - resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + /@types/koa-compose@3.2.5: + resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.15.0 dev: true @@ -4846,34 +5021,34 @@ packages: /@types/koa-session@6.4.5: resolution: {integrity: sha512-Vc6+fslnPuMH2v9y80WYeo39UMo8mweuNNthKCwYU2ZE6l5vnRrzRU3BRvexKwsoI5sxsRl5CxDsBlLI8kY/XA==} dependencies: - '@types/cookies': 0.9.0 + '@types/cookies': 0.7.7 '@types/koa': 2.15.0 dev: true /@types/koa@2.14.0: resolution: {integrity: sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==} dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.8 - '@types/cookies': 0.9.0 - '@types/http-assert': 1.5.5 + '@types/accepts': 1.3.5 + '@types/content-disposition': 0.5.5 + '@types/cookies': 0.7.7 + '@types/http-assert': 1.5.3 '@types/http-errors': 2.0.4 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.8 - '@types/node': 18.19.22 + '@types/keygrip': 1.0.2 + '@types/koa-compose': 3.2.5 + '@types/node': 18.19.19 dev: true /@types/koa@2.15.0: resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.8 - '@types/cookies': 0.9.0 - '@types/http-assert': 1.5.5 + '@types/accepts': 1.3.5 + '@types/content-disposition': 0.5.5 + '@types/cookies': 0.7.7 + '@types/http-assert': 1.5.3 '@types/http-errors': 2.0.4 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.8 - '@types/node': 18.19.22 + '@types/keygrip': 1.0.2 + '@types/koa-compose': 3.2.5 + '@types/node': 18.19.19 dev: true /@types/koa__cors@5.0.0: @@ -4888,8 +5063,8 @@ packages: '@types/koa': 2.15.0 dev: true - /@types/lodash.clonedeep@4.5.9: - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} + /@types/lodash.clonedeep@4.5.7: + resolution: {integrity: sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==} dependencies: '@types/lodash': 4.14.202 @@ -4907,19 +5082,19 @@ packages: resolution: {integrity: sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==} dev: false - /@types/mdast@3.0.15: - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + /@types/mdast@4.0.0: + resolution: {integrity: sha512-YLeG8CujC9adtj/kuDzq1N4tCDYKoZ5l/bnjq8d74+t/3q/tHquJOJKUQXJrLCflOHpKjXgcI/a929gpmLOEng==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 dev: false - /@types/mdx@2.0.11: - resolution: {integrity: sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==} + /@types/mdx@2.0.7: + resolution: {integrity: sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==} /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -4927,44 +5102,59 @@ packages: /@types/mime@3.0.4: resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - /@types/nlcst@1.0.4: - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + /@types/nlcst@1.0.1: + resolution: {integrity: sha512-aVIyXt6pZiiMOtVByE4Y0gf+BLm1Cxc4ZLSK8VRHn1CgkO+kXbQwN/EBhQmhPdBMjFJCMBKtmNW2zWQuFywz8Q==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 dev: false /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 form-data: 4.0.0 + dev: false - /@types/node-localstorage@1.3.3: - resolution: {integrity: sha512-Wkn5g4eM5x10UNV9Xvl9K6y6m0zorocuJy4WjB5muUdyMZuPbZpSJG3hlhjGHe1HGxbOQO7RcB+jlHcNwkh+Jw==} + /@types/node-fetch@2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 + form-data: 3.0.1 dev: true - /@types/node-persist@3.1.8: - resolution: {integrity: sha512-QLidg6/SadZYPrTKxtxL1A85XBoQlG40bhoMdhu6DH6+eNCMr2j+RGfFZ9I9+IY8W/PDwQonJ+iBWD62jZjMfg==} + /@types/node-localstorage@1.3.2: + resolution: {integrity: sha512-i3KDc7Y5xQgR395Gw9nn0H/HbY0VC131pqfF2PYMbvNpvDugJ95xpSseudiJV4vcQxnj2g24yys83eMEB+Ewgw==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 + dev: true + + /@types/node-persist@3.1.5: + resolution: {integrity: sha512-etovBJhoENhCxgmxf1gEnu4Wsq/JQy2lTaXVypuA85KkY0A7/pGbgwELtXTgwj2DVgRUb6IAhG8GHEqLPCogVA==} + dependencies: + '@types/node': 18.19.19 dev: true /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.19.22: - resolution: {integrity: sha512-p3pDIfuMg/aXBmhkyanPshdfJuX5c5+bQjYLIikPLXAUycEogij/c50n/C+8XOA5L93cU4ZRXtn+dNQGi0IZqQ==} + /@types/node@18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + + /@types/node@18.18.5: + resolution: {integrity: sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==} + dev: true + + /@types/node@18.19.19: + resolution: {integrity: sha512-qqV6hSy9zACEhQUy5CEGeuXAZN0fNjqLWRIvOXOwdFYhFoKBiY08VKR5kgchr90+TitLVhpUEb54hk4bYaArUw==} dependencies: undici-types: 5.26.5 - /@types/node@20.11.25: - resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} + /@types/node@20.10.6: + resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} dependencies: undici-types: 5.26.5 dev: true @@ -4977,8 +5167,8 @@ packages: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: false - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} /@types/qs@6.9.12: resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} @@ -4995,16 +5185,16 @@ packages: /@types/react@18.2.64: resolution: {integrity: sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==} dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.0 - /@types/request@2.48.12: - resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + /@types/request@2.48.8: + resolution: {integrity: sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==} dependencies: - '@types/caseless': 0.12.5 - '@types/node': 18.19.22 - '@types/tough-cookie': 4.0.5 + '@types/caseless': 0.12.2 + '@types/node': 18.19.19 + '@types/tough-cookie': 4.0.2 form-data: 2.5.1 dev: true @@ -5012,119 +5202,112 @@ packages: resolution: {integrity: sha512-t3ZEJ4xIE5CaJnsWcU+nY8R7rhvIEfX2xHNpvK6mA+CwUyvYJJ7SdU+pIodqTv0w4I0cBCWuJ4wzmwZOsjZdOg==} dev: true - /@types/sax@1.2.7: - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + /@types/sax@1.2.4: + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: false - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + /@types/scheduler@0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.22 + '@types/node': 18.19.19 /@types/serve-static@1.15.5: resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 18.19.22 + '@types/node': 18.19.19 - /@types/source-map-support@0.5.10: - resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} + /@types/source-map-support@0.5.9: + resolution: {integrity: sha512-91Jf4LyPAObBTFbpW3bSDK1ncdwXohvlBmzffSj7/44SY+1mD/HhesdfspCMxPIJwllgN2G4eVFatGs4Zw/lnw==} dependencies: source-map: 0.6.1 dev: true - /@types/ssh2-streams@0.1.12: - resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} + /@types/ssh2-streams@0.1.9: + resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 18.19.22 - '@types/ssh2-streams': 0.1.12 - dev: true - - /@types/ssh2@1.11.19: - resolution: {integrity: sha512-ydbQAqEcdNVy2t1w7dMh6eWMr+iOgtEkqM/3K9RMijMaok/ER7L8GW6PwsOypHCN++M+c8S/UR9SgMqNIFstbA==} - dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 + '@types/ssh2-streams': 0.1.9 dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/superagent@4.1.24: - resolution: {integrity: sha512-mEafCgyKiMFin24SDzWN7yAADt4gt6YawFiNMp0QS5ZPboORfyxFt0s3VzJKhTaKg9py/4FUmrHLTNfJKt9Rbw==} + /@types/superagent@4.1.15: + resolution: {integrity: sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==} dependencies: - '@types/cookiejar': 2.1.5 - '@types/node': 18.19.22 + '@types/cookiejar': 2.1.2 + '@types/node': 18.19.19 dev: true /@types/tmp@0.2.6: resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} dev: true - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + /@types/tough-cookie@4.0.2: + resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + /@types/unist@2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: false + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} /@types/uuid@9.0.8: resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - /@types/validator@13.11.9: - resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + /@types/validator@13.11.5: + resolution: {integrity: sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==} dev: true /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 dev: true - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + /@types/ws@8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + /@types/yargs@15.0.14: + resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} dependencies: - '@types/yargs-parser': 21.0.3 + '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + /@types/yargs@17.0.11: + resolution: {integrity: sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==} dependencies: - '@types/yargs-parser': 21.0.3 + '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + /@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -5134,17 +5317,17 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.60.1(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/scope-manager': 5.60.1 + '@typescript-eslint/type-utils': 5.60.1(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 5.60.1(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4(supports-color@9.4.0) eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 natural-compare-lite: 1.4.0 - semver: 7.6.0 + semver: 7.5.4 tsutils: 3.21.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: @@ -5162,7 +5345,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.6.2 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) @@ -5171,17 +5354,17 @@ packages: debug: 4.3.4(supports-color@9.4.0) eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.2.4 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + /@typescript-eslint/parser@5.60.1(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5190,9 +5373,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) + '@typescript-eslint/scope-manager': 5.60.1 + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.4.2) debug: 4.3.4(supports-color@9.4.0) eslint: 8.57.0 typescript: 5.4.2 @@ -5221,6 +5404,14 @@ packages: - supports-color dev: true + /@typescript-eslint/scope-manager@5.60.1: + resolution: {integrity: sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/visitor-keys': 5.60.1 + dev: true + /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5237,8 +5428,8 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + /@typescript-eslint/type-utils@5.60.1(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -5247,8 +5438,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.4.2) + '@typescript-eslint/utils': 5.60.1(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4(supports-color@9.4.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.4.2) @@ -5271,12 +5462,17 @@ packages: '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4(supports-color@9.4.0) eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + ts-api-utils: 1.0.1(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/types@5.60.1: + resolution: {integrity: sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5287,6 +5483,27 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/typescript-estree@5.60.1(typescript@5.4.2): + resolution: {integrity: sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/visitor-keys': 5.60.1 + debug: 4.3.4(supports-color@9.4.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5301,7 +5518,7 @@ packages: debug: 4.3.4(supports-color@9.4.0) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 + semver: 7.5.4 tsutils: 3.21.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: @@ -5323,13 +5540,33 @@ packages: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/utils@5.60.1(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.60.1 + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.4.2) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5337,14 +5574,14 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.6.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -5357,18 +5594,26 @@ packages: eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) eslint: 8.57.0 - semver: 7.6.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true + /@typescript-eslint/visitor-keys@5.60.1: + resolution: {integrity: sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.1 + eslint-visitor-keys: 3.4.3 + dev: true + /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5388,46 +5633,46 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vanilla-extract/babel-plugin-debug-ids@1.0.5: - resolution: {integrity: sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==} + /@vanilla-extract/babel-plugin-debug-ids@1.0.2: + resolution: {integrity: sha512-LjnbQWGeMwaydmovx8jWUR8BxLtLiPyq0xz5C8G5OvFhsuJxvavLdrBHNNizvr1dq7/3qZGlPv0znsvU4P44YA==} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 transitivePeerDependencies: - supports-color dev: true - /@vanilla-extract/css@1.14.1: - resolution: {integrity: sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==} + /@vanilla-extract/css@1.11.0: + resolution: {integrity: sha512-uohj+8cGWbnrVzTfrjlJeXqdGjH3d3TcscdQxKe3h5bb5QQXTpPSq+c+SeWADIGiZybzcW0CBvZV8jsy1ywY9w==} dependencies: - '@emotion/hash': 0.9.1 + '@emotion/hash': 0.9.0 '@vanilla-extract/private': 1.0.3 + ahocorasick: 1.0.2 chalk: 4.1.2 - css-what: 6.1.0 + css-what: 5.1.0 cssesc: 3.0.0 - csstype: 3.1.3 + csstype: 3.1.0 deep-object-diff: 1.1.9 - deepmerge: 4.3.1 + deepmerge: 4.2.2 media-query-parser: 2.0.2 - modern-ahocorasick: 1.0.1 outdent: 0.8.0 dev: true - /@vanilla-extract/integration@6.5.0(@types/node@18.19.22): - resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==} + /@vanilla-extract/integration@6.2.1(@types/node@18.11.9): + resolution: {integrity: sha512-+xYJz07G7TFAMZGrOqArOsURG+xcYvqctujEkANjw2McCBvGEK505RxQqOuNiA9Mi9hgGdNp2JedSa94f3eoLg==} dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) - '@vanilla-extract/babel-plugin-debug-ids': 1.0.5 - '@vanilla-extract/css': 1.14.1 + '@babel/core': 7.23.9 + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.23.9) + '@vanilla-extract/babel-plugin-debug-ids': 1.0.2 + '@vanilla-extract/css': 1.11.0 esbuild: 0.17.6 - eval: 0.1.8 + eval: 0.1.6 find-up: 5.0.0 javascript-stringify: 2.1.0 lodash: 4.17.21 - mlly: 1.6.1 + mlly: 1.2.0 outdent: 0.8.0 - vite: 5.1.5(@types/node@18.19.22) - vite-node: 1.3.1(@types/node@18.19.22) + vite: 4.4.9(@types/node@18.11.9) + vite-node: 0.28.5(@types/node@18.11.9) transitivePeerDependencies: - '@types/node' - less @@ -5446,49 +5691,54 @@ packages: /@web3-storage/multipart-parser@1.0.0: resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - /@whatwg-node/events@0.0.3: - resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} + /@whatwg-node/events@0.0.2: + resolution: {integrity: sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==} dev: true /@whatwg-node/events@0.1.1: resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} engines: {node: '>=16.0.0'} - /@whatwg-node/fetch@0.8.8: - resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} + /@whatwg-node/fetch@0.8.1(@types/node@18.19.19): + resolution: {integrity: sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==} dependencies: - '@peculiar/webcrypto': 1.4.5 - '@whatwg-node/node-fetch': 0.3.6 + '@peculiar/webcrypto': 1.4.0 + '@whatwg-node/node-fetch': 0.3.0(@types/node@18.19.19) busboy: 1.6.0 - urlpattern-polyfill: 8.0.2 - web-streams-polyfill: 3.3.3 + urlpattern-polyfill: 6.0.2 + web-streams-polyfill: 3.2.1 + transitivePeerDependencies: + - '@types/node' dev: true - /@whatwg-node/fetch@0.9.17: - resolution: {integrity: sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==} + /@whatwg-node/fetch@0.9.8: + resolution: {integrity: sha512-PA7pIw22WYtMladTEVCq2EObUI9yFFLqgLHp4dK6w7iEVr5VRE6S2V+8XKFPdTxR8UowK8rYqrkzfuXxTOn23A==} engines: {node: '>=16.0.0'} dependencies: - '@whatwg-node/node-fetch': 0.5.7 - urlpattern-polyfill: 10.0.0 + '@whatwg-node/node-fetch': 0.4.7 + urlpattern-polyfill: 9.0.0 - /@whatwg-node/node-fetch@0.3.6: - resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} + /@whatwg-node/node-fetch@0.3.0(@types/node@18.19.19): + resolution: {integrity: sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==} + peerDependencies: + '@types/node': ^18.0.6 dependencies: - '@whatwg-node/events': 0.0.3 + '@types/node': 18.19.19 + '@whatwg-node/events': 0.0.2 busboy: 1.6.0 - fast-querystring: 1.1.2 + fast-querystring: 1.1.1 fast-url-parser: 1.1.3 tslib: 2.6.2 dev: true - /@whatwg-node/node-fetch@0.5.7: - resolution: {integrity: sha512-YZA+N3JcW1eh2QRi7o/ij+M07M0dqID73ltgsOEMRyEc2UYVDbyomaih+CWCEZqBIDHw4KMDveXvv4SBZ4TLIw==} + /@whatwg-node/node-fetch@0.4.7: + resolution: {integrity: sha512-hoH1HrLkMi5EFd+R8NqmAFHDj2v8731vnz9A+Brn3RSBDGpJxJrqa0LLHlBaZciAIdf+9z+wfErOKfa+s/EdgA==} engines: {node: '>=16.0.0'} dependencies: - '@kamilkisiela/fast-url-parser': 1.1.4 '@whatwg-node/events': 0.1.1 busboy: 1.6.0 - fast-querystring: 1.1.2 + fast-querystring: 1.1.1 + fast-url-parser: 1.1.3 tslib: 2.6.2 /@wry/caches@1.0.1: @@ -5497,14 +5747,14 @@ packages: dependencies: tslib: 2.6.2 - /@wry/context@0.7.4: - resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + /@wry/context@0.7.3: + resolution: {integrity: sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA==} engines: {node: '>=8'} dependencies: tslib: 2.6.2 - /@wry/equality@0.5.7: - resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + /@wry/equality@0.5.6: + resolution: {integrity: sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA==} engines: {node: '>=8'} dependencies: tslib: 2.6.2 @@ -5539,15 +5789,15 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.10.0 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true @@ -5567,6 +5817,10 @@ packages: indent-string: 4.0.0 dev: true + /ahocorasick@1.0.2: + resolution: {integrity: sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==} + dev: true + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -5649,8 +5903,8 @@ packages: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + /anymatch@3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 @@ -5665,23 +5919,7 @@ packages: engines: {node: '>= 6'} dependencies: glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - dev: true - - /archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 lazystream: 1.0.1 lodash.defaults: 4.2.0 lodash.difference: 4.5.0 @@ -5689,7 +5927,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.union: 4.6.0 normalize-path: 3.0.0 - readable-stream: 3.6.2 + readable-stream: 2.3.7 dev: true /archiver@5.3.2: @@ -5697,12 +5935,12 @@ packages: engines: {node: '>= 10'} dependencies: archiver-utils: 2.1.0 - async: 3.2.5 + async: 3.2.4 buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 + readable-stream: 3.6.0 + readdir-glob: 1.1.2 tar-stream: 2.2.0 - zip-stream: 4.1.1 + zip-stream: 4.1.0 dev: true /arg@5.0.2: @@ -5716,18 +5954,19 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 dev: true + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.2 + dev: true + /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -5745,7 +5984,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.1 get-intrinsic: 1.2.4 is-string: 1.0.7 dev: true @@ -5758,17 +5997,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - /array.prototype.findlast@1.2.4: resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} engines: {node: '>= 0.4'} @@ -5780,25 +6008,14 @@ packages: es-shim-unscopables: 1.0.2 dev: true - /array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 dev: true /array.prototype.flatmap@1.3.2: @@ -5807,8 +6024,8 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 dev: true /array.prototype.toreversed@1.1.2: @@ -5816,8 +6033,8 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 dev: true /array.prototype.tosorted@1.1.3: @@ -5830,6 +6047,18 @@ packages: es-shim-unscopables: 1.0.2 dev: true + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + /arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} @@ -5858,7 +6087,7 @@ packages: resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} engines: {node: '>=12.0.0'} dependencies: - pvtsutils: 1.3.5 + pvtsutils: 1.3.2 pvutils: 1.1.3 tslib: 2.6.2 dev: true @@ -5872,27 +6101,27 @@ packages: engines: {node: '>=8'} dev: true - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + /astring@1.8.3: + resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==} hasBin: true - /astro-expressive-code@0.29.4(astro@3.6.5): - resolution: {integrity: sha512-FoOp0gq+BOss92Tqm1tmUJwVsmCE9odEfura/an27l2tc6LU9Ki2NX3N6TWpvl95NLKQZeFpBl26ZB2yhjrt2Q==} + /astro-expressive-code@0.29.2(astro@3.6.5): + resolution: {integrity: sha512-fVslVRplAQGaZyVkAFOM1csHqWDkhPzBhXEMEKfjHCzk8CMnl5VPD9yljx48GizwbB0EId68uIc6xO2hoVK9rQ==} peerDependencies: - astro: ^3.0.0-beta || ^4.0.0-beta + astro: ^3.0.0-beta dependencies: astro: 3.6.5(typescript@5.4.2) - remark-expressive-code: 0.29.4 + remark-expressive-code: 0.29.2 dev: false /astro-graphql-plugin@0.1.0(graphql@16.8.1): resolution: {integrity: sha512-lBrd/9PW90MlODsFktn8V1CeZ63ELUp6O272RYdZNtcXiGFQq0h7dX4wEbH+oGsn90Zs5cBmPflIXxynYBCNqw==} dependencies: '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.8.1) - '@graphql-tools/json-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) '@graphql-tools/load': 8.0.2(graphql@16.8.1) - '@graphql-tools/url-loader': 8.0.2(graphql@16.8.1) - fs-extra: 11.2.0 + '@graphql-tools/url-loader': 8.0.0(@types/node@18.19.19)(graphql@16.8.1) + fs-extra: 11.1.1 marked: 2.0.3 transitivePeerDependencies: - '@types/node' @@ -5907,30 +6136,30 @@ packages: engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true dependencies: - '@astrojs/compiler': 2.7.0 + '@astrojs/compiler': 2.3.2 '@astrojs/internal-helpers': 0.2.1 '@astrojs/markdown-remark': 3.5.0(astro@3.6.5) '@astrojs/telemetry': 3.0.4 - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/generator': 7.23.6 - '@babel/parser': 7.24.0 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 - '@types/babel__core': 7.20.5 - acorn: 8.11.3 + '@babel/parser': 7.23.9 + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__core': 7.20.1 + acorn: 8.10.0 boxen: 7.1.1 - chokidar: 3.6.0 - ci-info: 3.9.0 - clsx: 2.1.0 + chokidar: 3.5.3 + ci-info: 3.8.0 + clsx: 2.0.0 common-ancestor-path: 1.0.1 cookie: 0.5.0 debug: 4.3.4(supports-color@9.4.0) deterministic-object-hash: 1.3.1 devalue: 4.3.2 - diff: 5.2.0 + diff: 5.1.0 es-module-lexer: 1.4.1 - esbuild: 0.19.12 + esbuild: 0.19.3 estree-walker: 3.0.3 execa: 8.0.1 fast-glob: 3.3.2 @@ -5940,28 +6169,28 @@ packages: http-cache-semantics: 4.1.1 js-yaml: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.8 + magic-string: 0.30.3 mdast-util-to-hast: 12.3.0 mime: 3.0.0 ora: 7.0.1 p-limit: 4.0.0 p-queue: 7.4.1 path-to-regexp: 6.2.1 - preferred-pm: 3.1.3 + preferred-pm: 3.1.2 probe-image-size: 7.2.3 prompts: 2.4.2 rehype: 12.0.1 - resolve: 1.22.8 - semver: 7.6.0 + resolve: 1.22.6 + semver: 7.5.4 server-destroy: 1.0.1 - shikiji: 0.6.13 + shikiji: 0.6.10 string-width: 6.1.0 strip-ansi: 7.1.0 - tsconfck: 3.0.3(typescript@5.4.2) + tsconfck: 3.0.0(typescript@5.4.2) unist-util-visit: 4.1.2 vfile: 5.3.7 - vite: 4.5.2 - vitefu: 0.2.5(vite@4.5.2) + vite: 4.4.9(@types/node@18.11.9) + vitefu: 0.2.4(vite@4.4.9) which-pm: 2.1.1 yargs-parser: 21.1.1 zod: 3.22.4 @@ -5989,8 +6218,8 @@ packages: retry: 0.13.1 dev: false - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true /asynciterator.prototype@1.0.0: @@ -6024,7 +6253,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001596 + caniuse-lite: 1.0.30001591 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -6032,11 +6261,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} dependencies: possible-typed-array-names: 1.0.0 + dev: true /axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} @@ -6046,7 +6280,7 @@ packages: /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.4 transitivePeerDependencies: - debug dev: true @@ -6054,7 +6288,7 @@ packages: /axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.4 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -6066,22 +6300,22 @@ packages: dequal: 2.0.3 dev: true - /b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - /babel-jest@29.7.0(@babel/core@7.24.0): + /babel-jest@29.7.0(@babel/core@7.23.9): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 + '@types/babel__core': 7.20.1 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.0) + babel-preset-jest: 29.6.3(@babel/core@7.23.9) chalk: 4.1.2 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 slash: 3.0.0 transitivePeerDependencies: - supports-color @@ -6091,10 +6325,10 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-instrument: 5.2.0 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color @@ -6104,80 +6338,82 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.18.0 dev: true /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) - dev: true - - /babel-preset-fbjs@3.4.0(@babel/core@7.24.0): + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + dev: true + + /babel-preset-fbjs@3.4.0(@babel/core@7.23.9): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.0) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.24.0) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.24.0) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.23.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.21.5(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.21.5(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.23.9) + '@babel/plugin-transform-flow-strip-types': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.21.5(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.23.9) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + transitivePeerDependencies: + - supports-color dev: true - /babel-preset-jest@29.6.3(@babel/core@7.24.0): + /babel-preset-jest@29.6.3(@babel/core@7.23.9): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) dev: true /bail@2.0.2: @@ -6187,19 +6423,19 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /bare-events@2.2.1: - resolution: {integrity: sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==} + /bare-events@2.2.0: + resolution: {integrity: sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==} requiresBuild: true optional: true - /bare-fs@2.2.1: - resolution: {integrity: sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg==} + /bare-fs@2.2.0: + resolution: {integrity: sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw==} requiresBuild: true dependencies: - bare-events: 2.2.1 + bare-events: 2.2.0 bare-os: 2.2.0 bare-path: 2.1.0 - streamx: 2.16.1 + streamx: 2.15.0 optional: true /bare-os@2.2.0: @@ -6245,12 +6481,6 @@ packages: tweetnacl: 0.14.5 dev: true - /bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - dependencies: - require-from-string: 2.0.2 - dev: false - /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -6260,18 +6490,37 @@ packages: dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.2 + readable-stream: 3.6.0 /bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} dependencies: buffer: 6.0.3 inherits: 2.0.4 - readable-stream: 3.6.2 + readable-stream: 3.6.0 dev: false - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + /body-parser@1.20.0: + resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -6283,11 +6532,12 @@ packages: iconv-lite: 0.4.24 on-finished: 2.4.1 qs: 6.11.0 - raw-body: 2.5.2 + raw-body: 2.5.1 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -6337,8 +6587,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001596 - electron-to-chromium: 1.4.698 + caniuse-lite: 1.0.30001591 + electron-to-chromium: 1.4.685 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -6371,6 +6621,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: false /buildcheck@0.0.6: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} @@ -6382,7 +6633,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.6.0 + semver: 7.5.4 dev: true /busboy@1.6.0: @@ -6423,7 +6674,7 @@ packages: minipass-pipeline: 1.2.4 p-map: 4.0.0 ssri: 10.0.5 - tar: 6.2.0 + tar: 6.1.11 unique-filename: 3.0.0 dev: true @@ -6475,8 +6726,8 @@ packages: engines: {node: '>=14.16'} dev: false - /caniuse-lite@1.0.30001596: - resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} + /caniuse-lite@1.0.30001591: + resolution: {integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -6561,11 +6812,11 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.3 + anymatch: 3.1.2 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -6583,12 +6834,12 @@ packages: engines: {node: '>=10'} dev: true - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + /cjs-module-lexer@1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true /class-variance-authority@0.7.0: @@ -6621,8 +6872,8 @@ packages: restore-cursor: 4.0.0 dev: false - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} engines: {node: '>=6'} /cli-truncate@2.1.0: @@ -6668,21 +6919,16 @@ packages: engines: {node: '>=6'} dev: false - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - dev: false - - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + /cluster-key-slot@1.1.0: + resolution: {integrity: sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==} engines: {node: '>=0.10.0'} dev: false /co-body@6.1.0: resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} dependencies: - inflation: 2.1.0 - qs: 6.12.0 + inflation: 2.0.0 + qs: 6.11.2 raw-body: 2.5.2 type-is: 1.6.18 @@ -6690,8 +6936,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + /collect-v8-coverage@1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true /color-convert@1.9.3: @@ -6710,6 +6956,7 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} @@ -6732,11 +6979,6 @@ packages: /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: false - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} @@ -6748,13 +6990,12 @@ packages: resolution: {integrity: sha512-Z6YfvgiTCERWJTj3wQiXamFhssdvz1n4ok447rS330lw3uL72WAx8IvrLU7xiE71uyb5WF8JEP+BWB5KhOoGeg==} dev: true - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + /comma-separated-tokens@2.0.2: + resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==} /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: false /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} @@ -6790,14 +7031,14 @@ packages: engines: {node: '>=4.0.0'} dev: true - /compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + /compress-commons@4.1.1: + resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} engines: {node: '>= 10'} dependencies: buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 + crc32-stream: 4.0.2 normalize-path: 3.0.0 - readable-stream: 3.6.2 + readable-stream: 3.6.0 dev: true /compressible@2.0.18: @@ -6830,7 +7071,7 @@ packages: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.8 + readable-stream: 2.3.7 typedarray: 0.0.6 dev: true @@ -6851,14 +7092,20 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + /convert-source-map@1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + dev: true + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - /cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + /cookie-signature@1.2.0: + resolution: {integrity: sha512-R0BOPfLGTitaKhgKROKZQN6iyq2iDQcH1DOF8nJoaWapguX5bC2w+Q/I9NmmM5lfcvEarnLZr+cCvmEYYSXvYA==} engines: {node: '>=6.6.0'} /cookie@0.5.0: @@ -6896,20 +7143,14 @@ packages: layout-base: 1.0.2 dev: false - /cosmiconfig@8.3.6(typescript@5.4.2): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + /cosmiconfig@8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.4.2 dev: true /cpu-features@0.0.9: @@ -6918,7 +7159,7 @@ packages: requiresBuild: true dependencies: buildcheck: 0.0.6 - nan: 2.19.0 + nan: 2.18.0 dev: true optional: true @@ -6928,12 +7169,12 @@ packages: hasBin: true dev: true - /crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + /crc32-stream@4.0.2: + resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==} engines: {node: '>= 10'} dependencies: crc-32: 1.2.2 - readable-stream: 3.6.2 + readable-stream: 3.6.0 dev: true /crc@3.8.0: @@ -6950,8 +7191,8 @@ packages: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.22) + graceful-fs: 4.2.10 + jest-config: 29.7.0(@types/node@18.19.19) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -6972,7 +7213,7 @@ packages: /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} dependencies: - node-fetch: 2.7.0 + node-fetch: 2.6.12 transitivePeerDependencies: - encoding dev: true @@ -6995,16 +7236,8 @@ packages: resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} dev: false - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.0.2 - dev: false - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + /css-what@5.1.0: + resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} engines: {node: '>= 6'} dev: true @@ -7013,19 +7246,18 @@ packages: engines: {node: '>=4'} hasBin: true - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + /cssstyle@3.0.0: + resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} + engines: {node: '>=14'} dependencies: rrweb-cssom: 0.6.0 dev: false - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /csstype@3.1.0: + resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} /cuid@2.1.8: resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} - deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. dev: false /cytoscape-cose-bilkent@4.1.0(cytoscape@3.28.1): @@ -7097,7 +7329,7 @@ packages: resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} engines: {node: '>=12'} dependencies: - delaunator: 5.0.1 + delaunator: 5.0.0 dev: false /d3-dispatch@3.0.1: @@ -7429,8 +7661,8 @@ packages: dev: false optional: true - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + /dedent@1.2.0: + resolution: {integrity: sha512-i4tcg0ClgvMUSxwHpt+NHQ01ZJmAkl6eBvDNrSZG9e+oLRTCSHv0wpr/Bzjpf6CwKeIHGevE1M34Y1Axdms5VQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -7441,28 +7673,26 @@ packages: /deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + /deep-equal@2.2.0: + resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} dependencies: - array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 es-get-iterator: 1.1.3 get-intrinsic: 1.2.4 is-arguments: 1.1.1 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.2 is-date-object: 1.0.5 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.2 isarray: 2.0.5 - object-is: 1.1.6 + object-is: 1.1.5 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-typed-array: 1.1.11 dev: true /deep-extend@0.6.0: @@ -7480,13 +7710,13 @@ packages: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} dev: true - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + /deepmerge@4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + /defaults@1.0.3: + resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} dependencies: clone: 1.0.4 dev: true @@ -7499,6 +7729,11 @@ packages: es-errors: 1.3.0 gopd: 1.0.1 + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -7508,8 +7743,8 @@ packages: object-keys: 1.1.1 dev: true - /delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + /delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dependencies: robust-predicates: 3.0.2 dev: false @@ -7592,8 +7827,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} /dir-glob@3.0.1: @@ -7617,14 +7852,14 @@ packages: yaml: 2.4.1 dev: true - /docker-modem@3.0.8: - resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} + /docker-modem@3.0.6: + resolution: {integrity: sha512-h0Ow21gclbYsZ3mkHDfsYNDqtRhXS8fXr51bU0qr1dxgTMJj0XufbzX+jhNOvA8KuEEzn6JbvLVhXyv+fny9Uw==} engines: {node: '>= 8.0'} dependencies: debug: 4.3.4(supports-color@9.4.0) - readable-stream: 3.6.2 + readable-stream: 3.6.0 split-ca: 1.0.1 - ssh2: 1.15.0 + ssh2: 1.11.0 transitivePeerDependencies: - supports-color dev: true @@ -7634,7 +7869,7 @@ packages: engines: {node: '>= 8.0'} dependencies: '@balena/dockerignore': 1.0.2 - docker-modem: 3.0.8 + docker-modem: 3.0.6 tar-fs: 2.0.1 transitivePeerDependencies: - supports-color @@ -7654,12 +7889,12 @@ packages: esutils: 2.0.3 dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + /dom-accessibility-api@0.5.14: + resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==} dev: true - /dompurify@3.0.9: - resolution: {integrity: sha512-uyb4NDIvQ3hRn6NiC+SIFaP4mJ/MdXlvtunaqK9Bn6dD3RuB/1S/gasEjDHD8eiaqdSael2vBv+hOs7Y+jhYOQ==} + /dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} dev: false /dot-case@3.0.4: @@ -7668,6 +7903,11 @@ packages: no-case: 3.0.4 tslib: 2.6.2 + /dotenv@16.4.1: + resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + engines: {node: '>=12'} + dev: true + /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -7681,8 +7921,8 @@ packages: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 + readable-stream: 2.3.7 + stream-shift: 1.0.1 dev: true /eastasianwidth@0.2.0: @@ -7691,11 +7931,11 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.698: - resolution: {integrity: sha512-f9iZD1t3CLy1AS6vzM5EKGa6p9pRcOeEFXRFbaG2Ta+Oe7MkfRQ3fsvPYidzHe1h4i0JvIvpcY55C+B6BZNGtQ==} + /electron-to-chromium@1.4.685: + resolution: {integrity: sha512-yDYeobbTEe4TNooEzOQO6xFqg9XnAkVy2Lod1C1B2it8u47JNLYvl9nLDWBamqUakWB8Jc1hhS1uHUNYTNQdfw==} - /elkjs@0.9.2: - resolution: {integrity: sha512-2Y/RaA1pdgSHpY0YG4TYuYCD2wh97CRvu22eLG3Kz0pgQ/6KbIFTxsTnDc4MH/6hFlg2L/9qXrDMG0nMjP63iw==} + /elkjs@0.9.1: + resolution: {integrity: sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ==} dev: false /emittery@0.13.1: @@ -7703,8 +7943,8 @@ packages: engines: {node: '>=12'} dev: true - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + /emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} dev: false /emoji-regex@8.0.0: @@ -7722,11 +7962,11 @@ packages: dependencies: once: 1.4.0 - /enhanced-resolve@5.15.1: - resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} + /enhanced-resolve@5.13.0: + resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} engines: {node: '>=10.13.0'} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 tapable: 2.2.1 dev: true @@ -7745,6 +7985,51 @@ packages: is-arrayish: 0.2.1 dev: true + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.7 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: true + /es-abstract@1.22.5: resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} engines: {node: '>= 0.4'} @@ -7792,10 +8077,6 @@ packages: which-typed-array: 1.1.14 dev: true - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -7813,13 +8094,32 @@ packages: get-intrinsic: 1.2.4 has-symbols: 1.0.3 is-arguments: 1.1.1 - is-map: 2.0.3 + is-map: 2.0.2 is-set: 2.0.2 is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 dev: true + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + /es-iterator-helpers@1.0.17: resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} engines: {node: '>= 0.4'} @@ -7844,6 +8144,15 @@ packages: /es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -7853,6 +8162,12 @@ packages: hasown: 2.0.1 dev: true + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: @@ -7868,15 +8183,15 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-plugins-node-modules-polyfill@1.6.3(esbuild@0.17.6): - resolution: {integrity: sha512-nydQGT3RijD8mBd3Hek+2gSAxndgceZU9GIjYYiqU+7CE7veN8utTmupf0frcKpwIXCXWpRofL9CY9k0yU70CA==} + /esbuild-plugins-node-modules-polyfill@1.6.1(esbuild@0.17.6): + resolution: {integrity: sha512-6sAwI24PV8W0zxeO+i4BS5zoQypS3SzEGwIdxpzpy65riRuK8apMw8PN0aKVLCTnLr0FgNIxUMRd9BsreBrtog==} engines: {node: '>=14.0.0'} peerDependencies: - esbuild: ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0 + esbuild: ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 dependencies: '@jspm/core': 2.0.1 esbuild: 0.17.6 - local-pkg: 0.5.0 + local-pkg: 0.4.3 resolve.exports: 2.0.2 dev: true @@ -7938,40 +8253,39 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: false - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + /esbuild@0.19.3: + resolution: {integrity: sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + '@esbuild/android-arm': 0.19.3 + '@esbuild/android-arm64': 0.19.3 + '@esbuild/android-x64': 0.19.3 + '@esbuild/darwin-arm64': 0.19.3 + '@esbuild/darwin-x64': 0.19.3 + '@esbuild/freebsd-arm64': 0.19.3 + '@esbuild/freebsd-x64': 0.19.3 + '@esbuild/linux-arm': 0.19.3 + '@esbuild/linux-arm64': 0.19.3 + '@esbuild/linux-ia32': 0.19.3 + '@esbuild/linux-loong64': 0.19.3 + '@esbuild/linux-mips64el': 0.19.3 + '@esbuild/linux-ppc64': 0.19.3 + '@esbuild/linux-riscv64': 0.19.3 + '@esbuild/linux-s390x': 0.19.3 + '@esbuild/linux-x64': 0.19.3 + '@esbuild/netbsd-x64': 0.19.3 + '@esbuild/openbsd-x64': 0.19.3 + '@esbuild/sunos-x64': 0.19.3 + '@esbuild/win32-arm64': 0.19.3 + '@esbuild/win32-ia32': 0.19.3 + '@esbuild/win32-x64': 0.19.3 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} /escape-html@1.0.3: @@ -8001,46 +8315,37 @@ packages: hasBin: true peerDependencies: eslint: '>=7.0.0' - dependencies: - eslint: 8.57.0 - dev: true - - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color + dependencies: + eslint: 8.57.0 dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + /eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 + is-core-module: 2.13.0 + resolve: 1.22.6 transitivePeerDependencies: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.57.0): + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' dependencies: debug: 4.3.4(supports-color@9.4.0) - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.13.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.3 - is-core-module: 2.13.1 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + get-tsconfig: 4.5.0 + globby: 13.1.3 + is-core-module: 2.13.0 is-glob: 4.0.3 + synckit: 0.8.5 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -8048,8 +8353,8 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -8069,41 +8374,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 5.60.1(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - debug: 3.2.7 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.57.0) transitivePeerDependencies: - supports-color dev: true @@ -8119,8 +8394,8 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -8129,25 +8404,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 5.60.1(eslint@8.57.0)(typescript@5.4.2) array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 - array.prototype.flat: 1.3.2 + array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - hasown: 2.0.1 - is-core-module: 2.13.1 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + has: 1.0.3 + is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.values: 1.1.6 + resolve: 1.22.6 semver: 6.3.1 - tsconfig-paths: 3.15.0 + tsconfig-paths: 3.14.1 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8160,13 +8433,13 @@ packages: peerDependencies: eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 dependencies: - '@babel/runtime': 7.24.0 - '@testing-library/dom': 8.20.1 + '@babel/runtime': 7.23.2 + '@testing-library/dom': 8.17.1 eslint: 8.57.0 requireindex: 1.2.0 dev: true - /eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@29.7.0)(typescript@5.4.2): + /eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.60.1)(eslint@8.57.0)(jest@29.7.0)(typescript@5.4.2): resolution: {integrity: sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -8179,7 +8452,7 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 jest: 29.7.0 @@ -8194,7 +8467,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.23.2 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -8203,9 +8476,9 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.15 eslint: 8.57.0 - hasown: 2.0.1 + hasown: 2.0.0 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 @@ -8222,9 +8495,9 @@ packages: eslint: 8.57.0 eslint-plugin-es: 3.0.1(eslint@8.57.0) eslint-utils: 2.1.0 - ignore: 5.3.1 + ignore: 5.2.4 minimatch: 3.1.2 - resolve: 1.22.8 + resolve: 1.22.6 semver: 6.3.1 dev: true @@ -8264,8 +8537,8 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + /eslint-plugin-testing-library@5.11.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 @@ -8321,7 +8594,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -8337,15 +8610,15 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.4.2 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 + globals: 13.19.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.2.4 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -8371,8 +8644,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 dev: true @@ -8381,8 +8654,8 @@ packages: engines: {node: '>=4'} hasBin: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery@1.4.2: + resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -8405,30 +8678,30 @@ packages: engines: {node: '>=4.0'} dev: true - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + /estree-util-attach-comments@2.1.0: + resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.0 - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + /estree-util-build-jsx@2.2.0: + resolution: {integrity: sha512-apsfRxF9uLrqosApvHVtYZjISPvTJ+lBiIydpC+9wE6cF6ssbhnjyQLqaIjgzGxvC2Hbmec1M7g91PoBayYoQQ==} dependencies: - '@types/estree-jsx': 1.0.5 - estree-util-is-identifier-name: 2.1.0 + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.0.1 estree-walker: 3.0.3 /estree-util-is-identifier-name@1.1.0: resolution: {integrity: sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==} dev: true - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + /estree-util-is-identifier-name@2.0.1: + resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==} /estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: - '@types/estree-jsx': 1.0.5 - astring: 1.8.6 + '@types/estree-jsx': 1.0.0 + astring: 1.8.3 source-map: 0.7.4 /estree-util-value-to-estree@1.3.0: @@ -8441,13 +8714,13 @@ packages: /estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 2.0.10 + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.6 /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.0 /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -8458,11 +8731,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - /eval@0.1.8: - resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + /eval@0.1.6: + resolution: {integrity: sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.19.22 require-like: 0.1.2 dev: true @@ -8474,10 +8746,6 @@ packages: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: false - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -8502,7 +8770,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.3.0 + npm-run-path: 5.1.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -8536,13 +8804,51 @@ packages: jest-util: 29.7.0 dev: true - /express@4.18.3: - resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} + /express@4.18.1: + resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.0 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.10.3 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.1 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.5.0 @@ -8573,14 +8879,15 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + dev: false - /expressive-code@0.29.4: - resolution: {integrity: sha512-MA0cdWkFsIPQ/DAiPgL49y1mZiOXOuxiBXlZ28SrtItNeoh3/NwUhZ21z5BwlaC7b6nkXfkI4E+HWguuIpEhSA==} + /expressive-code@0.29.2: + resolution: {integrity: sha512-UwC+GjYSUbonH8gYlHS4fmh0TSdyrdDry88GdVYVUiN2EI1nh7Duu8s2cpYvFsObPIeUXsbHLWTygBO1XhXtEQ==} dependencies: - '@expressive-code/core': 0.29.4 - '@expressive-code/plugin-frames': 0.29.4 - '@expressive-code/plugin-shiki': 0.29.4 - '@expressive-code/plugin-text-markers': 0.29.4 + '@expressive-code/core': 0.29.2 + '@expressive-code/plugin-frames': 0.29.2 + '@expressive-code/plugin-shiki': 0.29.2 + '@expressive-code/plugin-text-markers': 0.29.2 dev: false /extend-shallow@2.0.1: @@ -8610,8 +8917,8 @@ packages: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + /fast-copy@3.0.0: + resolution: {integrity: sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA==} dev: true /fast-decode-uri-component@1.0.1: @@ -8620,8 +8927,19 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + /fast-fifo@1.3.0: + resolution: {integrity: sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==} + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -8641,13 +8959,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + /fast-querystring@1.1.1: + resolution: {integrity: sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==} dependencies: fast-decode-uri-component: 1.0.1 - /fast-redact@3.4.0: - resolution: {integrity: sha512-2gwPvyna0zwBdxKnng1suu/dTL5s8XEy2ZqH8mwDUwJdDkV8w5kp+JV26mupdK68HmPMbm6yjW9m7/Ys/BHEHg==} + /fast-redact@3.1.2: + resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} /fast-safe-stringify@2.1.1: @@ -8658,10 +8976,9 @@ packages: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: punycode: 1.4.1 - dev: true - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + /fastq@1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: reusify: 1.0.4 @@ -8671,8 +8988,8 @@ packages: format: 0.2.2 dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + /fb-watchman@2.0.1: + resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: bser: 2.1.1 dev: true @@ -8681,8 +8998,8 @@ packages: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} dev: true - /fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + /fbjs@3.0.4: + resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} dependencies: cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 @@ -8690,7 +9007,7 @@ packages: object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 1.0.37 + ua-parser-js: 0.7.31 transitivePeerDependencies: - encoding dev: true @@ -8706,7 +9023,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.2.0 + flat-cache: 3.0.4 dev: true /fill-range@7.0.1: @@ -8750,26 +9067,25 @@ packages: pkg-dir: 4.2.0 dev: false - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.3.1 - keyv: 4.5.4 + flatted: 3.2.6 rimraf: 3.0.2 dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + /flatted@3.2.6: + resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} dev: true - /flattie@1.1.1: - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + /flattie@1.1.0: + resolution: {integrity: sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==} engines: {node: '>=8'} dev: false - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.4: + resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8799,6 +9115,15 @@ packages: mime-types: 2.1.35 dev: true + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -8831,18 +9156,18 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jsonfile: 6.1.0 - universalify: 2.0.1 + universalify: 2.0.0 dev: true - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jsonfile: 6.1.0 - universalify: 2.0.1 + universalify: 2.0.0 dev: false /fs-extra@9.1.0: @@ -8850,16 +9175,16 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jsonfile: 6.1.0 - universalify: 2.0.1 + universalify: 2.0.0 dev: true /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.6 + minipass: 3.3.4 dev: true /fs-minipass@3.0.3: @@ -8887,6 +9212,16 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: true + /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} @@ -8943,6 +9278,14 @@ packages: engines: {node: '>=16'} dev: false + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -8952,10 +9295,8 @@ packages: get-intrinsic: 1.2.4 dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} - dependencies: - resolve-pkg-maps: 1.0.0 + /get-tsconfig@4.5.0: + resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} dev: true /getopts@2.3.0: @@ -8997,6 +9338,17 @@ packages: path-scurry: 1.10.1 dev: true + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -9012,8 +9364,8 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + /globals@13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -9026,6 +9378,10 @@ packages: define-properties: 1.2.1 dev: true + /globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -9033,24 +9389,43 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 + /globby@13.1.3: + resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /graphql-config@5.0.3(graphql@16.8.1)(typescript@5.4.2): - resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==} + /graphql-config@5.0.2(@types/node@18.19.19)(graphql@16.8.1): + resolution: {integrity: sha512-7TPxOrlbiG0JplSZYCyxn2XQtqVhXomEjXUmWJVSS5ET1nPhOJSsIb/WTwqWhcYX6G0RlHXSj9PLtGTKmxLNGg==} engines: {node: '>= 16.0.0'} peerDependencies: cosmiconfig-toml-loader: ^1.0.0 @@ -9060,14 +9435,14 @@ packages: optional: true dependencies: '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.8.1) - '@graphql-tools/json-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) '@graphql-tools/load': 8.0.2(graphql@16.8.1) '@graphql-tools/merge': 9.0.3(graphql@16.8.1) - '@graphql-tools/url-loader': 8.0.2(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.0(@types/node@18.19.19)(graphql@16.8.1) '@graphql-tools/utils': 10.1.0(graphql@16.8.1) - cosmiconfig: 8.3.6(typescript@5.4.2) + cosmiconfig: 8.1.3 graphql: 16.8.1 - jiti: 1.21.0 + jiti: 1.20.0 minimatch: 4.2.3 string-env-interpolation: 1.0.1 tslib: 2.6.2 @@ -9075,7 +9450,6 @@ packages: - '@types/node' - bufferutil - encoding - - typescript - utf-8-validate dev: true @@ -9120,8 +9494,8 @@ packages: graphql: 16.8.1 tslib: 2.6.2 - /graphql-ws@5.15.0(graphql@16.8.1): - resolution: {integrity: sha512-xWGAtm3fig9TIhSaNsg0FaDZ8Pyn/3re3RFlP4rhQcmjRDIPpk1EhRuNB+YSJtLzttyuToaDiNhwT1OMoGnJnw==} + /graphql-ws@5.14.0(graphql@16.8.1): + resolution: {integrity: sha512-itrUTQZP/TgswR4GSSYuwWUzrE/w5GhbwM2GX3ic2U7aw33jgEsayfIlvaj7/GcIvZgNMzsPTrE5hqPuFUiE5g==} engines: {node: '>=10'} peerDependencies: graphql: '>=0.11 <=16' @@ -9179,12 +9553,31 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.2 + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /hasown@2.0.1: resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} @@ -9194,7 +9587,7 @@ packages: /hast-util-from-dom@5.0.0: resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.1 hastscript: 8.0.0 web-namespaces: 2.0.1 dev: false @@ -9202,23 +9595,23 @@ packages: /hast-util-from-parse5@7.1.2: resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} dependencies: - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 hastscript: 7.2.0 - property-information: 6.4.1 + property-information: 6.1.1 vfile: 5.3.7 - vfile-location: 4.1.0 + vfile-location: 4.0.1 web-namespaces: 2.0.1 dev: false /hast-util-from-parse5@8.0.1: resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.1 + '@types/unist': 3.0.0 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.4.1 + property-information: 6.1.1 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 @@ -9231,47 +9624,47 @@ packages: /hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.1 dev: false /hast-util-parse-selector@3.1.1: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 dev: false /hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.1 dev: false /hast-util-raw@7.2.3: resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 '@types/parse5': 6.0.3 hast-util-from-parse5: 7.1.2 hast-util-to-parse5: 7.1.0 html-void-elements: 2.0.1 parse5: 6.0.1 - unist-util-position: 4.0.4 + unist-util-position: 4.0.3 unist-util-visit: 4.1.2 vfile: 5.3.7 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: false - /hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.1 + '@types/unist': 3.0.0 '@ungap/structured-clone': 1.2.0 hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 + mdast-util-to-hast: 13.0.2 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -9283,40 +9676,40 @@ packages: /hast-util-select@5.0.5: resolution: {integrity: sha512-QQhWMhgTFRhCaQdgTKzZ5g31GLQ9qRb1hZtDPMqQaOhpLBziWcshUS0uCR5IJ0U1jrK/mxg35fmcq+Dp/Cy2Aw==} dependencies: - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 bcp-47-match: 2.0.3 - comma-separated-tokens: 2.0.3 + comma-separated-tokens: 2.0.2 css-selector-parser: 1.4.1 direction: 2.0.1 hast-util-has-property: 2.0.1 hast-util-to-string: 2.0.0 - hast-util-whitespace: 2.0.1 + hast-util-whitespace: 2.0.0 not: 0.1.0 nth-check: 2.1.1 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 unist-util-visit: 4.1.2 zwitch: 2.0.4 dev: false - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 4.0.4 + /hast-util-to-estree@2.1.0: + resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} + dependencies: + '@types/estree': 1.0.0 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + comma-separated-tokens: 2.0.2 + estree-util-attach-comments: 2.1.0 + estree-util-is-identifier-name: 2.0.1 + hast-util-whitespace: 2.0.0 + mdast-util-mdx-expression: 1.3.0 + mdast-util-mdxjs-esm: 1.3.0 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 + style-to-object: 0.3.0 + unist-util-position: 4.0.3 zwitch: 2.0.4 transitivePeerDependencies: - supports-color @@ -9324,15 +9717,15 @@ packages: /hast-util-to-html@8.0.4: resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} dependencies: - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 ccount: 2.0.1 - comma-separated-tokens: 2.0.3 + comma-separated-tokens: 2.0.2 hast-util-raw: 7.2.3 - hast-util-whitespace: 2.0.1 + hast-util-whitespace: 2.0.0 html-void-elements: 2.0.1 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 stringify-entities: 4.0.3 zwitch: 2.0.4 dev: false @@ -9340,16 +9733,16 @@ packages: /hast-util-to-html@9.0.0: resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.1 + '@types/unist': 3.0.0 ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.2 + comma-separated-tokens: 2.0.2 + hast-util-raw: 9.0.1 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + mdast-util-to-hast: 13.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 stringify-entities: 4.0.3 zwitch: 2.0.4 dev: false @@ -9357,10 +9750,10 @@ packages: /hast-util-to-parse5@7.1.0: resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 2.0.3 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: false @@ -9368,11 +9761,11 @@ packages: /hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 + '@types/hast': 3.0.1 + comma-separated-tokens: 2.0.2 devlop: 1.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: false @@ -9380,45 +9773,45 @@ packages: /hast-util-to-string@2.0.0: resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 dev: false /hast-util-to-text@4.0.0: resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.1 + '@types/unist': 3.0.0 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 dev: false - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + /hast-util-whitespace@2.0.0: + resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} /hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.1 dev: false /hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 2.0.3 + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.2 hast-util-parse-selector: 3.1.1 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 dev: false /hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 + '@types/hast': 3.0.1 + comma-separated-tokens: 2.0.2 hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 dev: false /he@1.2.0: @@ -9518,8 +9911,8 @@ packages: dependencies: structured-headers: 1.0.1 - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -9532,8 +9925,8 @@ packages: dependencies: structured-headers: 0.5.0 - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -9564,33 +9957,33 @@ packages: safer-buffer: 2.1.2 dev: false - /icss-utils@5.1.0(postcss@8.4.35): + /icss-utils@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.30 dev: true /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} /ilp-logger@1.4.4: resolution: {integrity: sha512-R7F+SH6Aiipuqoq63gtzy6/HVIfcCK1rEmq8bE8NLSufXJPRoXszNs6RpypQi9HJcZvTcIUPFE15bS/HI+T+/A==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.7 debug: 4.3.4(supports-color@7.2.0) supports-color: 7.2.0 /ilp-logger@1.4.5-alpha.2: resolution: {integrity: sha512-WtbscdjUUPVseRkDpRlfb/YUpsq4zfoOz6PlJSkx+aqJot1P5N+YGd4YKW1g9wm6O8muo5e/xBotyJqCQs0g+Q==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.7 debug: 4.3.4(supports-color@9.4.0) supports-color: 9.4.0 dev: false @@ -9655,8 +10048,8 @@ packages: resolve-cwd: 3.0.0 dev: true - /import-meta-resolve@3.1.1: - resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==} + /import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} dev: false /imurmurhash@0.1.4: @@ -9669,8 +10062,8 @@ packages: engines: {node: '>=8'} dev: true - /inflation@2.1.0: - resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + /inflation@2.0.0: + resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} engines: {node: '>= 0.8.0'} /inflight@1.0.6: @@ -9692,8 +10085,8 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + /inquirer@8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -9706,11 +10099,20 @@ packages: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.8.1 + rxjs: 7.8.0 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - wrap-ansi: 6.2.0 + wrap-ansi: 7.0.0 + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has: 1.0.3 + side-channel: 1.0.5 dev: true /internal-slot@1.0.7: @@ -9719,7 +10121,7 @@ packages: dependencies: es-errors: 1.3.0 hasown: 2.0.1 - side-channel: 1.0.6 + side-channel: 1.0.5 dev: true /internmap@1.0.1: @@ -9747,7 +10149,7 @@ packages: engines: {node: '>=12.22.0'} dependencies: '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 + cluster-key-slot: 1.1.0 debug: 4.3.4(supports-color@9.4.0) denque: 2.1.0 lodash.defaults: 4.2.0 @@ -9785,7 +10187,15 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + is-typed-array: 1.1.10 + dev: true /is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} @@ -9829,7 +10239,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-buffer@2.0.5: @@ -9844,16 +10254,16 @@ packages: resolution: {integrity: sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==} dev: false - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: - hasown: 2.0.1 + has: 1.0.3 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-decimal@2.0.1: @@ -9863,6 +10273,12 @@ packages: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} dev: true + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9913,14 +10329,6 @@ packages: /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: false - /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -9937,8 +10345,12 @@ packages: tslib: 2.6.2 dev: true - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true @@ -9951,7 +10363,7 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-number@7.0.0: @@ -9976,17 +10388,17 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: false - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + /is-reference@3.0.0: + resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.0 /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-relative@1.0.0: @@ -10000,6 +10412,12 @@ packages: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.7 + dev: true + /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} @@ -10021,7 +10439,7 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-symbol@1.0.4: @@ -10031,19 +10449,30 @@ packages: has-symbols: 1.0.3 dev: true - /is-type-of@1.4.0: - resolution: {integrity: sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==} + /is-type-of@1.2.1: + resolution: {integrity: sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==} dependencies: core-util-is: 1.0.3 is-class-hotfix: 0.0.6 isstream: 0.1.2 dev: false + /is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + /is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.14 + dev: true /is-unc-path@1.0.0: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} @@ -10090,11 +10519,18 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is-wsl@3.0.0: + resolution: {integrity: sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==} engines: {node: '>=16'} dependencies: - is-inside-container: 1.0.0 + is-docker: 3.0.0 dev: false /isarray@1.0.0: @@ -10113,54 +10549,61 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isomorphic-ws@5.0.0(ws@8.16.0): + /isomorphic-ws@5.0.0(ws@8.13.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.13.0 + + /isomorphic-ws@5.0.0(ws@8.15.1): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: ws: '*' dependencies: - ws: 8.16.0 + ws: 8.15.1 /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: false - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + /istanbul-lib-instrument@5.2.0: + resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + /istanbul-lib-instrument@6.0.0: + resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + istanbul-lib-coverage: 3.2.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 supports-color: 7.2.0 dev: true @@ -10169,18 +10612,18 @@ packages: engines: {node: '>=10'} dependencies: debug: 4.3.4(supports-color@9.4.0) - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 + istanbul-lib-report: 3.0.0 dev: true /iterator.prototype@1.1.2: @@ -10189,8 +10632,8 @@ packages: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 - set-function-name: 2.0.2 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 dev: true /jackspeak@2.3.6: @@ -10223,10 +10666,10 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 1.2.0 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -10236,9 +10679,9 @@ packages: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.0.4 + pure-rand: 6.0.0 slash: 3.0.0 - stack-utils: 2.0.6 + stack-utils: 2.0.5 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -10261,10 +10704,10 @@ packages: create-jest: 29.7.0 exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.22) + jest-config: 29.7.0(@types/node@18.19.19) jest-util: 29.7.0 jest-validate: 29.7.0 - yargs: 17.7.2 + yargs: 17.7.1 transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10272,7 +10715,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@18.19.22): + /jest-config@29.7.0(@types/node@18.19.19): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -10284,16 +10727,16 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 - babel-jest: 29.7.0(@babel/core@7.24.0) + '@types/node': 18.19.19 + babel-jest: 29.7.0(@babel/core@7.23.9) chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 + ci-info: 3.8.0 + deepmerge: 4.2.2 glob: 7.2.3 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-get-type: 29.6.3 @@ -10357,7 +10800,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.18.5 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -10377,11 +10820,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.22 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 + '@types/graceful-fs': 4.1.5 + '@types/node': 18.19.19 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.10 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -10425,13 +10868,13 @@ packages: dependencies: '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 + '@types/stack-utils': 2.0.1 chalk: 4.1.2 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 micromatch: 4.0.5 pretty-format: 29.7.0 slash: 3.0.0 - stack-utils: 2.0.6 + stack-utils: 2.0.5 dev: true /jest-mock@29.7.0: @@ -10439,7 +10882,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 jest-util: 29.7.0 dev: true @@ -10484,12 +10927,12 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-haste-map: 29.7.0 jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.8 + resolve: 1.22.6 resolve.exports: 2.0.2 slash: 3.0.0 dev: true @@ -10503,10 +10946,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 chalk: 4.1.2 emittery: 0.13.1 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-docblock: 29.7.0 jest-environment-node: 29.7.0 jest-haste-map: 29.7.0 @@ -10534,12 +10977,12 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 glob: 7.2.3 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 @@ -10557,18 +11000,18 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.23.9 '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) - '@babel/types': 7.24.0 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.23.9) + '@babel/types': 7.23.9 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) chalk: 4.1.2 expect: 29.7.0 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jest-diff: 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 @@ -10576,7 +11019,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true @@ -10586,10 +11029,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 + ci-info: 3.8.0 + graceful-fs: 4.2.10 picomatch: 2.3.1 dev: true @@ -10611,7 +11054,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.22 + '@types/node': 18.19.19 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -10623,7 +11066,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.19.22 + '@types/node': 18.19.19 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -10650,17 +11093,13 @@ packages: - ts-node dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + /jiti@1.20.0: + resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} hasBin: true dev: true - /jose@4.15.5: - resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} - - /jose@5.2.3: - resolution: {integrity: sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==} - dev: true + /jose@4.13.1: + resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -10683,8 +11122,8 @@ packages: dependencies: argparse: 2.0.1 - /jsdom@23.2.0: - resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} + /jsdom@23.0.1: + resolution: {integrity: sha512-2i27vgvlUsGEBO9+/kJQRbtqtm+191b5zAZrU/UezVmnC2dlDAFLgDYJvAEi94T4kjsRKkezEtLQTgsNEsW2lQ==} engines: {node: '>=18'} peerDependencies: canvas: ^2.11.2 @@ -10692,15 +11131,15 @@ packages: canvas: optional: true dependencies: - '@asamuzakjp/dom-selector': 2.0.2 - cssstyle: 4.0.1 + cssstyle: 3.0.0 data-urls: 5.0.0 decimal.js: 10.4.3 form-data: 4.0.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 parse5: 7.1.2 rrweb-cssom: 0.6.0 saxes: 6.0.0 @@ -10711,7 +11150,7 @@ packages: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.16.0 + ws: 8.15.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -10730,10 +11169,6 @@ packages: hasBin: true dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - /json-canonicalize@1.0.6: resolution: {integrity: sha512-kP2iYpOS5SZHYhIaR1t9oG80d4uTY3jPoaBj+nimy3njtJk8+sRsVatN8pyJRDRtk9Su3+6XqA2U8k0dByJBUQ==} dev: false @@ -10758,14 +11193,10 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json-stable-stringify@1.1.1: - resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} - engines: {node: '>= 0.4'} + /json-stable-stringify@1.0.1: + resolution: {integrity: sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==} dependencies: - call-bind: 1.0.7 - isarray: 2.0.5 - jsonify: 0.0.1 - object-keys: 1.1.1 + jsonify: 0.0.0 dev: true /json-stringify-safe@5.0.1: @@ -10780,11 +11211,11 @@ packages: remove-trailing-spaces: 1.0.8 dev: true - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + /json5@1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true dependencies: - minimist: 1.2.8 + minimist: 1.2.6 dev: true /json5@2.2.3: @@ -10792,18 +11223,18 @@ packages: engines: {node: '>=6'} hasBin: true - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.1 + universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 - /jsonify@0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + /jsonify@0.0.0: + resolution: {integrity: sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==} dev: true /jsx-ast-utils@3.3.5: @@ -10811,11 +11242,18 @@ packages: engines: {node: '>=4.0'} dependencies: array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 object.values: 1.1.7 dev: true + /katex@0.16.8: + resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + /katex@0.16.9: resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} hasBin: true @@ -10829,12 +11267,6 @@ packages: dependencies: tsscmp: 1.0.6 - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - /khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} dev: false @@ -10883,7 +11315,7 @@ packages: colorette: 2.0.19 commander: 10.0.1 debug: 4.3.4(supports-color@9.4.0) - escalade: 3.1.2 + escalade: 3.1.1 esm: 3.2.25 get-package-type: 0.1.0 getopts: 2.3.0 @@ -10923,7 +11355,7 @@ packages: dependencies: crc: 3.8.0 debug: 4.3.4(supports-color@9.4.0) - is-type-of: 1.4.0 + is-type-of: 1.2.1 uuid: 8.3.2 transitivePeerDependencies: - supports-color @@ -10978,7 +11410,7 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} dependencies: - readable-stream: 2.3.8 + readable-stream: 2.3.7 dev: true /leven@3.1.0: @@ -10999,11 +11431,6 @@ packages: engines: {node: '>=10'} dev: true - /lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - dev: true - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -11018,11 +11445,11 @@ packages: optional: true dependencies: cli-truncate: 2.1.0 - colorette: 2.0.20 + colorette: 2.0.19 log-update: 4.0.0 p-map: 4.0.0 - rfdc: 1.3.1 - rxjs: 7.8.1 + rfdc: 1.3.0 + rxjs: 7.8.0 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -11031,7 +11458,7 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 @@ -11042,12 +11469,9 @@ packages: engines: {node: '>= 12.13.0'} dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 dev: true /locate-path@5.0.0: @@ -11146,8 +11570,8 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + /longest-streak@3.0.1: + resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==} /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -11191,23 +11615,23 @@ packages: engines: {node: '>=12'} dev: false - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + /lz-string@1.4.4: + resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true dev: true - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} dependencies: - semver: 7.6.0 + semver: 6.3.1 dev: true /makeerror@1.0.12: @@ -11244,29 +11668,29 @@ packages: speech-rule-engine: 4.0.7 dev: false - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + /mdast-util-definitions@5.1.1: + resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 unist-util-visit: 4.1.2 /mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/mdast': 4.0.0 + '@types/unist': 3.0.0 unist-util-visit: 5.0.0 dev: false /mdast-util-directive@2.2.4: resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 + parse-entities: 4.0.0 stringify-entities: 4.0.3 unist-util-visit-parents: 5.1.3 transitivePeerDependencies: @@ -11276,26 +11700,26 @@ packages: /mdast-util-find-and-replace@2.2.2: resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 + unist-util-is: 5.1.1 unist-util-visit-parents: 5.1.3 dev: false /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 + mdast-util-to-string: 3.1.0 + micromark: 3.0.10 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-decode-string: 1.0.2 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-stringify-position: 3.0.2 uvu: 0.5.6 transitivePeerDependencies: - supports-color @@ -11303,13 +11727,13 @@ packages: /mdast-util-from-markdown@2.0.0: resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/mdast': 4.0.0 + '@types/unist': 3.0.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.0 micromark-util-decode-string: 2.0.0 micromark-util-normalize-identifier: 2.0.0 micromark-util-symbol: 2.0.0 @@ -11319,42 +11743,40 @@ packages: - supports-color dev: false - /mdast-util-frontmatter@1.0.1: - resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + /mdast-util-frontmatter@1.0.0: + resolution: {integrity: sha512-7itKvp0arEVNpCktOET/eLFAYaZ+0cNjVtFtIPxgQ5tV+3i+D4SDDTjTzPWl44LT59PC+xdx+glNTawBdF98Mw==} dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-extension-frontmatter: 1.1.1 + micromark-extension-frontmatter: 1.0.0 dev: true /mdast-util-gfm-autolink-literal@1.0.3: resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + micromark-util-character: 1.1.0 dev: false /mdast-util-gfm-footnote@1.0.2: resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 dev: false /mdast-util-gfm-strikethrough@1.0.3: resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 mdast-util-to-markdown: 1.5.0 dev: false /mdast-util-gfm-table@1.0.7: resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 markdown-table: 3.0.3 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 @@ -11365,7 +11787,7 @@ packages: /mdast-util-gfm-task-list-item@1.0.2: resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 mdast-util-to-markdown: 1.5.0 dev: false @@ -11386,10 +11808,10 @@ packages: /mdast-util-math@3.0.0: resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/hast': 3.0.1 + '@types/mdast': 4.0.0 devlop: 1.1.0 - longest-streak: 3.1.0 + longest-streak: 3.0.1 mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 unist-util-remove-position: 5.0.0 @@ -11397,12 +11819,12 @@ packages: - supports-color dev: false - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + /mdast-util-mdx-expression@1.3.0: + resolution: {integrity: sha512-9kTO13HaL/ChfzVCIEfDRdp1m5hsvsm6+R8yr67mH+KS2ikzZ0ISGLPTbTswOFpLLlgVHO9id3cul4ajutCvCA==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.12 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: @@ -11411,18 +11833,18 @@ packages: /mdast-util-mdx-jsx@2.1.4: resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 ccount: 2.0.1 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 + parse-entities: 4.0.0 stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + unist-util-remove-position: 4.0.1 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.2 transitivePeerDependencies: - supports-color @@ -11430,19 +11852,19 @@ packages: resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: mdast-util-from-markdown: 1.3.1 - mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-expression: 1.3.0 mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 + mdast-util-mdxjs-esm: 1.3.0 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + /mdast-util-mdxjs-esm@1.3.0: + resolution: {integrity: sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.12 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: @@ -11451,86 +11873,79 @@ packages: /mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 + '@types/mdast': 3.0.12 + unist-util-is: 5.1.1 - /mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.0 unist-util-is: 6.0.0 dev: false /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-definitions: 5.1.2 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.1 micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 + unist-util-generated: 2.0.0 + unist-util-position: 4.0.3 unist-util-visit: 4.1.2 - /mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/hast': 3.0.1 + '@types/mdast': 4.0.0 '@ungap/structured-clone': 1.2.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.0 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 dev: false /mdast-util-to-markdown@1.5.0: resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - longest-streak: 3.1.0 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 + longest-streak: 3.0.1 mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 + mdast-util-to-string: 3.1.0 + micromark-util-decode-string: 1.0.2 unist-util-visit: 4.1.2 zwitch: 2.0.4 /mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 + '@types/mdast': 4.0.0 + '@types/unist': 3.0.0 + longest-streak: 3.0.1 + mdast-util-phrasing: 4.0.0 mdast-util-to-string: 4.0.0 micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 dev: false - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.15 + /mdast-util-to-string@3.1.0: + resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} /mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: - '@types/mdast': 4.0.3 - dev: false - - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + '@types/mdast': 4.0.0 dev: false /media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.23.2 dev: true /media-typer@0.3.0: @@ -11545,10 +11960,6 @@ packages: /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - /merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - dev: true - /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -11560,37 +11971,39 @@ packages: resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} dependencies: '@braintree/sanitize-url': 6.0.4 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 + '@types/d3-scale': 4.0.5 + '@types/d3-scale-chromatic': 3.0.0 cytoscape: 3.28.1 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.28.1) d3: 7.8.5 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.10 - dompurify: 3.0.9 - elkjs: 0.9.2 + dompurify: 3.0.6 + elkjs: 0.9.1 katex: 0.16.9 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.1 + stylis: 4.3.0 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.3.0 + web-worker: 1.2.0 transitivePeerDependencies: - supports-color dev: false - /meros@1.3.0: - resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} + /meros@1.2.1(@types/node@18.19.19): + resolution: {integrity: sha512-R2f/jxYqCAGI19KhAvaxSOxALBMkaXWH2a7rOyqQw+ZmizX5bKkEYWLzdhC+U82ZVVPVp6MCXe3EkVligh+12g==} engines: {node: '>=13'} peerDependencies: '@types/node': '>=13' peerDependenciesMeta: '@types/node': optional: true + dependencies: + '@types/node': 18.19.19 /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -11600,24 +12013,24 @@ packages: resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} dev: false - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + /micromark-core-commonmark@1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-destination: 1.0.0 + micromark-factory-label: 1.0.2 + micromark-factory-space: 1.0.0 + micromark-factory-title: 1.0.2 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-html-tag-name: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 /micromark-core-commonmark@2.0.0: @@ -11630,7 +12043,7 @@ packages: micromark-factory-space: 2.0.0 micromark-factory-title: 2.0.0 micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-chunked: 2.0.0 micromark-util-classify-character: 2.0.0 micromark-util-html-tag-name: 2.0.0 @@ -11644,80 +12057,79 @@ packages: /micromark-extension-directive@2.2.1: resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} dependencies: - micromark-factory-space: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - parse-entities: 4.0.1 + micromark-factory-space: 1.0.0 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + parse-entities: 4.0.0 uvu: 0.5.6 dev: false - /micromark-extension-frontmatter@1.1.1: - resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} + /micromark-extension-frontmatter@1.0.0: + resolution: {integrity: sha512-EXjmRnupoX6yYuUJSQhrQ9ggK0iQtQlpi6xeJzVD5xscyAI+giqco5fdymayZhJMbIFecjnE2yz85S9NzIgQpg==} dependencies: fault: 2.0.1 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 dev: true /micromark-extension-gfm-autolink-literal@1.0.5: resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} dependencies: - micromark-util-character: 1.2.0 + micromark-util-character: 1.1.0 micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 dev: false /micromark-extension-gfm-footnote@1.1.2: resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 dev: false /micromark-extension-gfm-strikethrough@1.0.7: resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 dev: false /micromark-extension-gfm-table@1.0.7: resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 dev: false /micromark-extension-gfm-tagfilter@1.0.2: resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 1.0.2 dev: false /micromark-extension-gfm-task-list-item@1.0.5: resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 dev: false @@ -11730,186 +12142,184 @@ packages: micromark-extension-gfm-table: 1.0.7 micromark-extension-gfm-tagfilter: 1.0.2 micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 dev: false /micromark-extension-math@3.0.0: resolution: {integrity: sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==} dependencies: - '@types/katex': 0.16.7 + '@types/katex': 0.16.2 devlop: 1.1.0 - katex: 0.16.9 + katex: 0.16.8 micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + /micromark-extension-mdx-expression@1.0.3: + resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==} dependencies: - '@types/estree': 1.0.5 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 - /micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + /micromark-extension-mdx-jsx@1.0.3: + resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + estree-util-is-identifier-name: 2.0.1 + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 - vfile-message: 3.1.4 + vfile-message: 3.1.2 - /micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + /micromark-extension-mdx-md@1.0.0: + resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 1.0.2 - /micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + /micromark-extension-mdxjs-esm@1.0.3: + resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} dependencies: - '@types/estree': 1.0.5 - micromark-core-commonmark: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 + micromark-core-commonmark: 1.0.6 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 uvu: 0.5.6 - vfile-message: 3.1.4 + vfile-message: 3.1.2 - /micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + /micromark-extension-mdxjs@1.0.0: + resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - micromark-extension-mdx-expression: 1.0.8 - micromark-extension-mdx-jsx: 1.0.5 - micromark-extension-mdx-md: 1.0.1 - micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.3 + micromark-extension-mdx-jsx: 1.0.3 + micromark-extension-mdx-md: 1.0.0 + micromark-extension-mdxjs-esm: 1.0.3 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + /micromark-factory-destination@1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 /micromark-factory-destination@2.0.0: resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + /micromark-factory-label@1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 /micromark-factory-label@2.0.0: resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + /micromark-factory-mdx-expression@1.0.6: + resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} dependencies: - '@types/estree': 1.0.5 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 uvu: 0.5.6 - vfile-message: 3.1.4 + vfile-message: 3.1.2 - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + /micromark-factory-space@1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-types: 1.0.2 /micromark-factory-space@2.0.0: resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-types: 2.0.0 dev: false - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + /micromark-factory-title@1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 /micromark-factory-title@2.0.0: resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} dependencies: micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + /micromark-factory-whitespace@1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 /micromark-factory-whitespace@2.0.0: resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} dependencies: micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + /micromark-util-character@1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 - /micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + /micromark-util-chunked@1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 1.0.1 /micromark-util-chunked@2.0.0: resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} @@ -11917,26 +12327,26 @@ packages: micromark-util-symbol: 2.0.0 dev: false - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + /micromark-util-classify-character@1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 /micromark-util-classify-character@2.0.0: resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + /micromark-util-combine-extensions@1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-types: 1.0.2 /micromark-util-combine-extensions@2.0.0: resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} @@ -11945,64 +12355,63 @@ packages: micromark-util-types: 2.0.0 dev: false - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + /micromark-util-decode-numeric-character-reference@1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 1.0.1 - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + /micromark-util-decode-numeric-character-reference@2.0.0: + resolution: {integrity: sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==} dependencies: micromark-util-symbol: 2.0.0 dev: false - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + /micromark-util-decode-string@1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-symbol: 1.0.1 /micromark-util-decode-string@2.0.0: resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.0 micromark-util-symbol: 2.0.0 dev: false - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + /micromark-util-encode@1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} /micromark-util-encode@2.0.0: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} dev: false - /micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + /micromark-util-events-to-acorn@1.2.0: + resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - '@types/unist': 2.0.10 + '@types/estree': 1.0.0 estree-util-visit: 1.2.1 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-types: 1.0.2 uvu: 0.5.6 - vfile-message: 3.1.4 + vfile-location: 4.0.1 + vfile-message: 3.1.2 - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + /micromark-util-html-tag-name@1.1.0: + resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} /micromark-util-html-tag-name@2.0.0: resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} dev: false - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + /micromark-util-normalize-identifier@1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 1.0.1 /micromark-util-normalize-identifier@2.0.0: resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} @@ -12010,10 +12419,10 @@ packages: micromark-util-symbol: 2.0.0 dev: false - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + /micromark-util-resolve-all@1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 1.0.2 /micromark-util-resolve-all@2.0.0: resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} @@ -12024,24 +12433,24 @@ packages: /micromark-util-sanitize-uri@1.2.0: resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 1.1.0 + micromark-util-encode: 1.0.1 + micromark-util-symbol: 1.0.1 /micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 dev: false - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + /micromark-util-subtokenize@1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 /micromark-util-subtokenize@2.0.0: @@ -12053,39 +12462,39 @@ packages: micromark-util-types: 2.0.0 dev: false - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + /micromark-util-symbol@1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} /micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} dev: false - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + /micromark-util-types@1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} /micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} dev: false - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + /micromark@3.0.10: + resolution: {integrity: sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.7 debug: 4.3.4(supports-color@9.4.0) decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-encode: 1.0.1 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 uvu: 0.5.6 transitivePeerDependencies: - supports-color @@ -12093,16 +12502,16 @@ packages: /micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.7 debug: 4.3.4(supports-color@9.4.0) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.0 micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-chunked: 2.0.0 micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.0 micromark-util-encode: 2.0.0 micromark-util-normalize-identifier: 2.0.0 micromark-util-resolve-all: 2.0.0 @@ -12176,8 +12585,8 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + /minimatch@5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -12190,42 +12599,37 @@ packages: brace-expansion: 2.0.1 dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.6 + minipass: 3.3.4 dev: true /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.6 + minipass: 3.3.4 dev: true /minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: - minipass: 3.3.6 + minipass: 3.3.4 dev: true - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + /minipass@3.3.4: + resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true - /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -12235,7 +12639,7 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.6 + minipass: 3.3.4 yallist: 4.0.0 dev: true @@ -12250,7 +12654,7 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: - minimist: 1.2.8 + minimist: 1.2.6 dev: true /mkdirp@1.0.4: @@ -12259,17 +12663,13 @@ packages: hasBin: true dev: true - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 - dev: true - - /modern-ahocorasick@1.0.1: - resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + acorn: 8.10.0 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 dev: true /morgan@1.10.0: @@ -12326,12 +12726,18 @@ packages: thenify-all: 1.6.0 dev: true - /nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} requiresBuild: true dev: true optional: true + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -12358,7 +12764,7 @@ packages: dependencies: debug: 3.2.7 iconv-lite: 0.4.24 - sax: 1.3.0 + sax: 1.2.4 transitivePeerDependencies: - supports-color dev: false @@ -12370,7 +12776,7 @@ packages: /nlcst-to-string@3.1.1: resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 1.0.1 dev: false /no-case@3.0.4: @@ -12390,12 +12796,12 @@ packages: - supports-color dev: true - /node-abi@3.56.0: - resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} engines: {node: '>=10'} requiresBuild: true dependencies: - semver: 7.6.0 + semver: 7.5.4 dev: false optional: true @@ -12407,7 +12813,31 @@ packages: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} requiresBuild: true dev: false - optional: true + optional: true + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -12436,12 +12866,12 @@ packages: engines: {node: '>=14'} dependencies: '@types/express': 4.17.21 - '@types/node': 20.11.25 + '@types/node': 20.10.6 accepts: 1.3.8 content-disposition: 0.5.4 depd: 1.1.2 fresh: 0.5.2 - merge-descriptors: 1.0.3 + merge-descriptors: 1.0.1 methods: 1.1.2 mime: 1.6.0 parseurl: 1.3.3 @@ -12460,7 +12890,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.6 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -12470,8 +12900,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.13.1 - semver: 7.6.0 + is-core-module: 2.13.0 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -12498,7 +12928,7 @@ packages: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.6.0 + semver: 7.5.4 dev: true /npm-normalize-package-bin@3.0.1: @@ -12512,7 +12942,7 @@ packages: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.5.4 validate-npm-package-name: 5.0.0 dev: true @@ -12523,7 +12953,7 @@ packages: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.6.0 + semver: 7.5.4 dev: true /npm-run-all2@5.0.2: @@ -12537,7 +12967,7 @@ packages: minimatch: 3.1.2 pidtree: 0.5.0 read-pkg: 5.2.0 - shell-quote: 1.8.1 + shell-quote: 1.8.0 dev: true /npm-run-path@4.0.1: @@ -12547,8 +12977,8 @@ packages: path-key: 3.1.1 dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 @@ -12564,6 +12994,10 @@ packages: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} dev: true + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -12576,8 +13010,8 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -12589,6 +13023,16 @@ packages: engines: {node: '>= 0.4'} dev: true + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -12605,7 +13049,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.1 dev: true /object.fromentries@2.0.7: @@ -12614,24 +13058,23 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.1 dev: true - /object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: - array.prototype.filter: 1.0.3 - call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.22.1 dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} dependencies: + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.1 dev: true /object.values@1.1.7: @@ -12640,7 +13083,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.1 dev: true /objection-db-errors@1.1.2(objection@3.1.4): @@ -12670,9 +13113,8 @@ packages: '@types/long': 4.0.2 long: 4.0.0 - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} + /on-exit-leak-free@2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} /on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} @@ -12711,6 +13153,15 @@ packages: /only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + /open@8.4.0: + resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /openapi-default-setter@12.1.3: resolution: {integrity: sha512-wHKwvEuOWwke5WcQn8pyCTXT5WQ+rm9FpJmDeEVECEBWjEyB/MVLYfXi+UQeSHTTu2Tg4VDHHmzbjOqN6hYeLQ==} dependencies: @@ -12774,15 +13225,15 @@ packages: fast-glob: 3.3.2 js-yaml: 4.1.0 supports-color: 9.4.0 - undici: 5.28.3 + undici: 5.28.2 yargs-parser: 21.1.1 dev: true /openapi-validator@0.14.2: resolution: {integrity: sha512-bgRQLZoxmECTjRxfpyMorad1ll58biUdV+31ALsHW2gRzdtMscI4Qm/wuhG8HsDUMGQkVLQYzUgJijNGKD65Og==} dependencies: - '@types/request': 2.48.12 - '@types/superagent': 4.1.24 + '@types/request': 2.48.8 + '@types/superagent': 4.1.15 axios: 0.21.4 combos: 0.2.0 fs-extra: 9.1.0 @@ -12799,7 +13250,7 @@ packages: resolution: {integrity: sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==} dependencies: '@wry/caches': 1.0.1 - '@wry/context': 0.7.4 + '@wry/context': 0.7.3 '@wry/trie': 0.4.3 tslib: 2.6.2 @@ -12822,7 +13273,7 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.2 + cli-spinners: 2.9.1 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -12836,7 +13287,7 @@ packages: dependencies: chalk: 5.3.0 cli-cursor: 4.0.0 - cli-spinners: 2.9.2 + cli-spinners: 2.9.1 is-interactive: 2.0.0 is-unicode-supported: 1.3.0 log-symbols: 5.1.0 @@ -12913,15 +13364,15 @@ packages: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} dev: false - /pagefind@1.0.4: - resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} + /pagefind@1.0.3: + resolution: {integrity: sha512-ws7kmMxW6OuxzsOjj3YAx6TYq/54MiE3wfyBM3J5CInbZyBBvM2Z8c8IYvnMkBcb5v2EoB9DewXEekOEiDRu5g==} hasBin: true optionalDependencies: - '@pagefind/darwin-arm64': 1.0.4 - '@pagefind/darwin-x64': 1.0.4 - '@pagefind/linux-arm64': 1.0.4 - '@pagefind/linux-x64': 1.0.4 - '@pagefind/windows-x64': 1.0.4 + '@pagefind/darwin-arm64': 1.0.3 + '@pagefind/darwin-x64': 1.0.3 + '@pagefind/linux-arm64': 1.0.3 + '@pagefind/linux-x64': 1.0.3 + '@pagefind/windows-x64': 1.0.3 dev: false /pako@0.2.9: @@ -12941,10 +13392,10 @@ packages: callsites: 3.1.0 dev: true - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + /parse-entities@4.0.0: + resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 @@ -13070,8 +13521,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} dev: true /peek-stream@1.1.3: @@ -13082,12 +13533,11 @@ packages: through2: 2.0.5 dev: true - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + /periscopic@3.0.4: + resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} dependencies: - '@types/estree': 1.0.5 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.0 /pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} @@ -13150,7 +13600,7 @@ packages: /pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} dependencies: - split2: 4.2.0 + split2: 4.1.0 dev: false /picocolors@1.0.0: @@ -13185,50 +13635,50 @@ packages: /pino-abstract-transport@1.1.0: resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} dependencies: - readable-stream: 4.5.2 - split2: 4.2.0 + readable-stream: 4.1.0 + split2: 4.1.0 /pino-pretty@10.3.1: resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} hasBin: true dependencies: - colorette: 2.0.20 + colorette: 2.0.19 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.0 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.2 + minimist: 1.2.6 + on-exit-leak-free: 2.1.0 pino-abstract-transport: 1.1.0 pump: 3.0.0 - readable-stream: 4.5.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.8.0 + readable-stream: 4.1.0 + secure-json-parse: 2.5.0 + sonic-boom: 3.7.0 strip-json-comments: 3.1.1 dev: true - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + /pino-std-serializers@6.0.0: + resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==} /pino@8.19.0: resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.4.0 - on-exit-leak-free: 2.1.2 + fast-redact: 3.1.2 + on-exit-leak-free: 2.1.0 pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 + pino-std-serializers: 6.0.0 process-warning: 3.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.0 - thread-stream: 2.4.1 + safe-stable-stringify: 2.3.1 + sonic-boom: 3.7.0 + thread-stream: 2.1.0 - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + /pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true @@ -13238,12 +13688,12 @@ packages: dependencies: find-up: 4.1.0 - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 dev: true /pluralize@8.0.0: @@ -13254,14 +13704,15 @@ packages: /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + dev: true - /postcss-discard-duplicates@5.1.0(postcss@8.4.35): + /postcss-discard-duplicates@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.30 dev: true /postcss-import@15.1.0(postcss@8.4.35): @@ -13273,7 +13724,7 @@ packages: postcss: 8.4.35 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.6 dev: true /postcss-js@4.0.1(postcss@8.4.35): @@ -13286,8 +13737,25 @@ packages: postcss: 8.4.35 dev: true - /postcss-load-config@4.0.2(postcss@8.4.35): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + /postcss-load-config@4.0.1(postcss@8.4.30): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.30 + yaml: 2.4.1 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.35): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: postcss: '>=8.0.9' @@ -13298,65 +13766,65 @@ packages: ts-node: optional: true dependencies: - lilconfig: 3.1.1 + lilconfig: 2.1.0 postcss: 8.4.35 yaml: 2.4.1 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.30): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.30 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): - resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} + /postcss-modules-local-by-default@4.0.0(postcss@8.4.30): + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + icss-utils: 5.1.0(postcss@8.4.30) + postcss: 8.4.30 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.35): - resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} + /postcss-modules-scope@3.0.0(postcss@8.4.30): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.30 + postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.35): + /postcss-modules-values@4.0.0(postcss@8.4.30): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.30) + postcss: 8.4.30 dev: true - /postcss-modules@6.0.0(postcss@8.4.35): + /postcss-modules@6.0.0(postcss@8.4.30): resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} peerDependencies: postcss: ^8.0.0 dependencies: generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.30) lodash.camelcase: 4.3.0 - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + postcss: 8.4.30 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.30) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.30) + postcss-modules-scope: 3.0.0(postcss@8.4.30) + postcss-modules-values: 4.0.0(postcss@8.4.30) string-hash: 1.1.3 dev: true @@ -13367,10 +13835,10 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.11 - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + /postcss-selector-parser@6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -13380,6 +13848,15 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true + /postcss@8.4.30: + resolution: {integrity: sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} @@ -13410,8 +13887,8 @@ packages: xtend: 4.0.2 dev: false - /prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} hasBin: true requiresBuild: true @@ -13419,10 +13896,10 @@ packages: detect-libc: 2.0.2 expand-template: 2.0.3 github-from-package: 0.0.0 - minimist: 1.2.8 + minimist: 1.2.6 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.56.0 + node-abi: 3.47.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -13431,8 +13908,8 @@ packages: dev: false optional: true - /preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} engines: {node: '>=10'} dependencies: find-up: 5.0.0 @@ -13520,10 +13997,6 @@ packages: /process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -13569,7 +14042,7 @@ packages: /proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 retry: 0.12.0 signal-exit: 3.0.7 dev: true @@ -13581,8 +14054,8 @@ packages: mkdirp: 1.0.4 dev: true - /property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + /property-information@6.1.1: + resolution: {integrity: sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==} /protobufjs@7.2.6: resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} @@ -13599,7 +14072,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.19.22 + '@types/node': 18.19.19 long: 5.2.3 dev: false @@ -13640,18 +14113,17 @@ packages: /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + /pure-rand@6.0.0: + resolution: {integrity: sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==} dev: true - /pvtsutils@1.3.5: - resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} + /pvtsutils@1.3.2: + resolution: {integrity: sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==} dependencies: tslib: 2.6.2 dev: true @@ -13661,17 +14133,24 @@ packages: engines: {node: '>=6.0.0'} dev: true + /qs@6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.5 + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.6 + side-channel: 1.0.5 + dev: false - /qs@6.12.0: - resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.6 + side-channel: 1.0.5 /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -13690,6 +14169,15 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -13706,7 +14194,7 @@ packages: dependencies: deep-extend: 0.6.0 ini: 1.3.8 - minimist: 1.2.8 + minimist: 1.2.6 strip-json-comments: 2.0.1 dev: false optional: true @@ -13736,26 +14224,26 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} + /react-router-dom@6.22.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.15.3 + '@remix-run/router': 1.15.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.22.3(react@18.2.0) + react-router: 6.22.0(react@18.2.0) dev: false - /react-router@6.22.3(react@18.2.0): - resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} + /react-router@6.22.0(react@18.2.0): + resolution: {integrity: sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.15.3 + '@remix-run/router': 1.15.0 react: 18.2.0 dev: false @@ -13781,8 +14269,8 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + /readable-stream@2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -13793,28 +14281,24 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + /readable-stream@3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + /readable-stream@4.1.0: + resolution: {integrity: sha512-sVisi3+P2lJ2t0BPbpK629j8wRW06yKGJUcaLAGXPAUhyUxVJm7VsCTit1PFgT4JHUDMrGNR+ZjSKpzGaRF3zw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - /readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + /readdir-glob@1.1.2: + resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} dependencies: - minimatch: 5.1.6 + minimatch: 5.1.0 dev: true /readdirp@3.6.0: @@ -13831,7 +14315,7 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} dependencies: - resolve: 1.22.8 + resolve: 1.22.6 dev: false /redis-errors@1.2.0: @@ -13846,21 +14330,29 @@ packages: redis-errors: 1.2.0 dev: false - /reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + functions-have-names: 1.2.3 dev: true /regexp.prototype.flags@1.5.2: @@ -13870,7 +14362,7 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.2 + set-function-name: 2.0.1 dev: true /regexpp@3.2.0: @@ -13895,13 +14387,13 @@ packages: /rehype-mathjax@6.0.0: resolution: {integrity: sha512-SioRmn+0mRWtDc4QVKG9JG88bXhPazfhc11GQoQ68mwot2WWyfabyZ7tuJu3Z4LCf893wXkQTVTF8PUlntoDwA==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.1 '@types/mathjax': 0.0.40 hast-util-from-dom: 5.0.0 hast-util-to-text: 4.0.0 - jsdom: 23.2.0 + jsdom: 23.0.1 mathjax-full: 3.2.2 - unified: 11.0.4 + unified: 11.0.3 unist-util-visit-parents: 6.0.1 transitivePeerDependencies: - bufferutil @@ -13913,7 +14405,7 @@ packages: /rehype-parse@8.0.5: resolution: {integrity: sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 hast-util-from-parse5: 7.1.2 parse5: 6.0.1 unified: 10.1.2 @@ -13922,7 +14414,7 @@ packages: /rehype-raw@6.1.1: resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 hast-util-raw: 7.2.3 unified: 10.1.2 dev: false @@ -13930,7 +14422,7 @@ packages: /rehype-stringify@9.0.4: resolution: {integrity: sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 hast-util-to-html: 8.0.4 unified: 10.1.2 dev: false @@ -13938,7 +14430,7 @@ packages: /rehype@12.0.1: resolution: {integrity: sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==} dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.4 rehype-parse: 8.0.5 rehype-stringify: 9.0.4 unified: 10.1.2 @@ -13947,8 +14439,8 @@ packages: /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: - '@babel/runtime': 7.24.0 - fbjs: 3.0.5 + '@babel/runtime': 7.23.2 + fbjs: 3.0.4 invariant: 2.2.4 transitivePeerDependencies: - encoding @@ -13957,7 +14449,7 @@ packages: /remark-directive@2.0.1: resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 mdast-util-directive: 2.2.4 micromark-extension-directive: 2.2.1 unified: 10.1.2 @@ -13965,10 +14457,10 @@ packages: - supports-color dev: false - /remark-expressive-code@0.29.4: - resolution: {integrity: sha512-7PX6TgPKFDfrixlBugCXYQGb6HWWGCyMcLBSpUZG8aiJvbFEaERYTMhj3WPKc2haAqliCcMjzGV4Kdbl+ci0yA==} + /remark-expressive-code@0.29.2: + resolution: {integrity: sha512-XIsrURhMOJNOUkCSp0OQ3suAZxNIS6ZkubjOxlTLyViOuVPmvRIXp36t6om9PYSwbxesorM+DNJpsla297GzQQ==} dependencies: - expressive-code: 0.29.4 + expressive-code: 0.29.2 hast-util-to-html: 8.0.4 unist-util-visit: 4.1.2 dev: false @@ -13976,16 +14468,16 @@ packages: /remark-frontmatter@4.0.1: resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} dependencies: - '@types/mdast': 3.0.15 - mdast-util-frontmatter: 1.0.1 - micromark-extension-frontmatter: 1.1.1 + '@types/mdast': 3.0.12 + mdast-util-frontmatter: 1.0.0 + micromark-extension-frontmatter: 1.0.0 unified: 10.1.2 dev: true /remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 mdast-util-gfm: 2.0.2 micromark-extension-gfm: 2.0.3 unified: 10.1.2 @@ -13996,10 +14488,10 @@ packages: /remark-math@6.0.0: resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.0 mdast-util-math: 3.0.0 micromark-extension-math: 3.0.0 - unified: 11.0.4 + unified: 11.0.3 transitivePeerDependencies: - supports-color dev: false @@ -14018,14 +14510,14 @@ packages: resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} dependencies: mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.1 + micromark-extension-mdxjs: 1.0.0 transitivePeerDependencies: - supports-color /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.12 mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: @@ -14034,18 +14526,18 @@ packages: /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.12 mdast-util-to-hast: 12.3.0 unified: 10.1.2 - /remark-smartypants@2.1.0: - resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} + /remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: retext: 8.1.0 retext-smartypants: 5.2.0 - unist-util-visit: 5.0.0 + unist-util-visit: 4.1.2 dev: false /remedial@1.0.8: @@ -14105,20 +14597,16 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + /resolve@1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -14126,7 +14614,7 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -14154,7 +14642,7 @@ packages: /retext-latin@3.1.0: resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 1.0.1 parse-latin: 5.0.1 unherit: 3.0.1 unified: 10.1.2 @@ -14163,7 +14651,7 @@ packages: /retext-smartypants@5.2.0: resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 1.0.1 nlcst-to-string: 3.1.1 unified: 10.1.2 unist-util-visit: 4.1.2 @@ -14172,7 +14660,7 @@ packages: /retext-stringify@3.1.0: resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 1.0.1 nlcst-to-string: 3.1.1 unified: 10.1.2 dev: false @@ -14180,7 +14668,7 @@ packages: /retext@8.1.0: resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 1.0.1 retext-latin: 3.1.0 retext-stringify: 3.1.0 unified: 10.1.2 @@ -14200,8 +14688,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true /rimraf@3.0.2: @@ -14215,36 +14703,12 @@ packages: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: false - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + /rollup@3.28.1: + resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.3 - dev: false - - /rollup@4.12.1: - resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.1 - '@rollup/rollup-android-arm64': 4.12.1 - '@rollup/rollup-darwin-arm64': 4.12.1 - '@rollup/rollup-darwin-x64': 4.12.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 - '@rollup/rollup-linux-arm64-gnu': 4.12.1 - '@rollup/rollup-linux-arm64-musl': 4.12.1 - '@rollup/rollup-linux-riscv64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-musl': 4.12.1 - '@rollup/rollup-win32-arm64-msvc': 4.12.1 - '@rollup/rollup-win32-ia32-msvc': 4.12.1 - '@rollup/rollup-win32-x64-msvc': 4.12.1 - fsevents: 2.3.3 - dev: true /rosie@2.1.1: resolution: {integrity: sha512-2AXB7WrIZXtKMZ6Q/PlozqPF5nu/x7NEvRJZOblrJuprrPfm5gL8JVvJPj9aaib9F8IUALnLUFhzXrwEtnI5cQ==} @@ -14269,8 +14733,8 @@ packages: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} dev: false - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + /rxjs@7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.6.2 dev: true @@ -14281,6 +14745,16 @@ packages: dependencies: mri: 1.2.0 + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-array-concat@1.1.0: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} @@ -14297,6 +14771,14 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + is-regex: 1.1.4 + dev: true + /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} @@ -14306,15 +14788,15 @@ packages: is-regex: 1.1.4 dev: true - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + /safe-stable-stringify@2.3.1: + resolution: {integrity: sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==} engines: {node: '>=10'} /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: false /saxes@6.0.0: @@ -14345,8 +14827,8 @@ packages: kind-of: 6.0.3 dev: false - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + /secure-json-parse@2.5.0: + resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==} dev: true /semver@5.7.2: @@ -14358,8 +14840,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -14425,12 +14907,11 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 - es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 dev: true @@ -14458,8 +14939,8 @@ packages: color: 4.2.3 detect-libc: 2.0.2 node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.0 + prebuild-install: 7.1.1 + semver: 7.5.4 simple-get: 4.0.1 tar-fs: 3.0.5 tunnel-agent: 0.6.0 @@ -14476,27 +14957,27 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + /shell-quote@1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} dev: true - /shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + /shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} dependencies: ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.1 + jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 dev: false - /shikiji@0.6.13: - resolution: {integrity: sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==} + /shikiji@0.6.10: + resolution: {integrity: sha512-WE+A5Y2ntM5hL3iJQujk97qr5Uj7PSIRXpQfrZ6h+JWPXZ8KBEDhFXc4lqNriaRq1WGOVPUT83XMOzmHiH3W8A==} dependencies: hast-util-to-html: 9.0.0 dev: false - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + /side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -14548,15 +15029,20 @@ packages: hasBin: true dependencies: '@types/node': 17.0.45 - '@types/sax': 1.2.7 + '@types/sax': 1.2.4 arg: 5.0.2 - sax: 1.3.0 + sax: 1.2.4 dev: false /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -14579,8 +15065,8 @@ packages: resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} dev: true - /slugify@1.6.6: - resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + /slugify@1.6.5: + resolution: {integrity: sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==} engines: {node: '>=8.0.0'} dev: false @@ -14590,8 +15076,8 @@ packages: dot-case: 3.0.4 tslib: 2.6.2 - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + /sonic-boom@3.7.0: + resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} dependencies: atomic-sleep: 1.0.0 @@ -14620,29 +15106,29 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + /space-separated-tokens@2.0.1: + resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==} /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.16 dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true /speech-rule-engine@4.0.7: @@ -14658,8 +15144,8 @@ packages: resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} dev: true - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + /split2@4.1.0: + resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} /sponge-case@1.0.1: @@ -14675,11 +15161,11 @@ packages: resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} dependencies: '@types/ssh2': 0.5.52 - ssh2: 1.15.0 + ssh2: 1.11.0 dev: true - /ssh2@1.15.0: - resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} + /ssh2@1.11.0: + resolution: {integrity: sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==} engines: {node: '>=10.16.0'} requiresBuild: true dependencies: @@ -14687,7 +15173,7 @@ packages: bcrypt-pbkdf: 1.0.2 optionalDependencies: cpu-features: 0.0.9 - nan: 2.19.0 + nan: 2.18.0 dev: true /ssri@10.0.5: @@ -14697,8 +15183,8 @@ packages: minipass: 7.0.4 dev: true - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + /stack-utils@2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 @@ -14727,7 +15213,7 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.7 + internal-slot: 1.0.5 dev: true /stream-parser@0.3.1: @@ -14738,8 +15224,8 @@ packages: - supports-color dev: false - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true /stream-slice@0.1.2: @@ -14749,13 +15235,11 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + /streamx@2.15.0: + resolution: {integrity: sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==} dependencies: - fast-fifo: 1.3.2 + fast-fifo: 1.3.0 queue-tick: 1.0.1 - optionalDependencies: - bare-events: 2.2.1 /string-env-interpolation@1.0.1: resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} @@ -14794,7 +15278,7 @@ packages: engines: {node: '>=16'} dependencies: eastasianwidth: 0.2.0 - emoji-regex: 10.3.0 + emoji-regex: 10.2.1 strip-ansi: 7.1.0 dev: false @@ -14803,13 +15287,22 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + set-function-name: 2.0.1 + side-channel: 1.0.5 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.1 dev: true /string.prototype.trim@1.2.8: @@ -14821,6 +15314,14 @@ packages: es-abstract: 1.22.5 dev: true + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.1 + dev: true + /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: @@ -14829,6 +15330,14 @@ packages: es-abstract: 1.22.5 dev: true + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.1 + dev: true + /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: @@ -14909,26 +15418,26 @@ packages: resolution: {integrity: sha512-QYBxdBtA4Tl5rFPuqmbmdrS9kbtren74RTJTcs0VSQNVV5iRhJD4QlYTLD0+81SBwUQctjEQzjTRI3WG4DzICA==} engines: {node: '>= 14', npm: '>=6'} - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + /style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} dependencies: inline-style-parser: 0.1.1 - /stylis@4.3.1: - resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} dev: false - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} + /sucrase@3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + engines: {node: '>=8'} hasBin: true dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.4 commander: 4.1.1 - glob: 10.3.10 + glob: 7.1.6 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.5 ts-interface-checker: 0.1.13 dev: true @@ -14973,6 +15482,14 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: false + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.3.1 + tslib: 2.6.2 + dev: true + /tailwindcss@3.4.1: resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} @@ -14980,13 +15497,13 @@ packages: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 - chokidar: 3.6.0 + chokidar: 3.5.3 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.0 + jiti: 1.20.0 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -14995,11 +15512,11 @@ packages: postcss: 8.4.35 postcss-import: 15.1.0(postcss@8.4.35) postcss-js: 4.0.1(postcss@8.4.35) - postcss-load-config: 4.0.2(postcss@8.4.35) + postcss-load-config: 4.0.1(postcss@8.4.35) postcss-nested: 6.0.1(postcss@8.4.35) - postcss-selector-parser: 6.0.15 - resolve: 1.22.8 - sucrase: 3.35.0 + postcss-selector-parser: 6.0.11 + resolve: 1.22.6 + sucrase: 3.32.0 transitivePeerDependencies: - ts-node dev: true @@ -15030,9 +15547,9 @@ packages: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} dependencies: pump: 3.0.0 - tar-stream: 3.1.7 + tar-stream: 3.1.6 optionalDependencies: - bare-fs: 2.2.1 + bare-fs: 2.2.0 bare-path: 2.1.0 /tar-stream@2.2.0: @@ -15043,22 +15560,22 @@ packages: end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 - readable-stream: 3.6.2 + readable-stream: 3.6.0 - /tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} dependencies: - b4a: 1.6.6 - fast-fifo: 1.3.2 - streamx: 2.16.1 + b4a: 1.6.4 + fast-fifo: 1.3.0 + streamx: 2.15.0 - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + /tar@6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 5.0.0 + minipass: 3.3.4 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 @@ -15082,7 +15599,7 @@ packages: resolution: {integrity: sha512-7d+LVd/4YKp/cutiVMLL5cnj/8p8oYELAVRRyNUM4FyUDz1OLQuwW868nDl7Vd1ZAQxzGeCR+F86FlR9Yw9fMA==} dependencies: '@balena/dockerignore': 1.0.2 - '@types/dockerode': 3.3.26 + '@types/dockerode': 3.3.24 archiver: 5.3.2 async-lock: 1.4.1 byline: 5.0.0 @@ -15118,15 +15635,15 @@ packages: any-promise: 1.3.0 dev: true - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + /thread-stream@2.1.0: + resolution: {integrity: sha512-5+Pf2Ya31CsZyIPYYkhINzdTZ3guL+jHq7D8lkBybgGcSQIKDbid3NJku3SpCKeE/gACWAccDA/rH2B6doC5aA==} dependencies: real-require: 0.2.0 /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.8 + readable-stream: 2.3.7 xtend: 4.0.2 dev: true @@ -15134,8 +15651,8 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /tigerbeetle-node@0.14.183: - resolution: {integrity: sha512-6Ww2nkVYrm5tF4F6PEWStZ57QrYT68fWFkBSYOquTHwBk1OuFstTaH/HMzLFuMZdKSwCN3INmHa06sjGfj2WyQ==} + /tigerbeetle-node@0.14.176: + resolution: {integrity: sha512-BoxBofixOjKZyIANwZ6P1zAUllPJYR3AVzl+TJPucgQyYJuFhzAPlmztHI5t3VYAUElBLV5e8LrQ3VhwO/0Csw==} engines: {node: '>=14.0.0'} dev: false @@ -15144,6 +15661,13 @@ packages: engines: {node: '>=8'} dev: false + /tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + /title-case@3.0.3: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} dependencies: @@ -15207,16 +15731,16 @@ packages: /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - /trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} /truncatise@0.0.8: resolution: {integrity: sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==} dev: false - /ts-api-utils@1.2.1(typescript@5.4.2): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} - engines: {node: '>=16'} + /ts-api-utils@1.0.1(typescript@5.4.2): + resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: @@ -15241,8 +15765,8 @@ packages: /ts-log@2.2.5: resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} - /tsconfck@3.0.3(typescript@5.4.2): - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + /tsconfck@3.0.0(typescript@5.4.2): + resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -15254,21 +15778,21 @@ packages: typescript: 5.4.2 dev: false - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + /tsconfig-paths@3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 + json5: 1.0.1 + minimist: 1.2.6 strip-bom: 3.0.0 dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + /tsconfig-paths@4.1.0: + resolution: {integrity: sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==} engines: {node: '>=6'} dependencies: json5: 2.2.3 - minimist: 1.2.8 + minimist: 1.2.6 strip-bom: 3.0.0 dev: true @@ -15280,6 +15804,10 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: false + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -15311,22 +15839,22 @@ packages: requiresBuild: true dependencies: '@types/commander': 2.12.2 - '@types/deep-equal': 1.0.4 - '@types/is-number': 7.0.5 + '@types/deep-equal': 1.0.3 + '@types/is-number': 7.0.4 '@types/jest': 29.5.12 - '@types/node-fetch': 2.6.11 - '@types/node-localstorage': 1.3.3 - '@types/node-persist': 3.1.8 - '@types/source-map-support': 0.5.10 - '@types/validator': 13.11.9 + '@types/node-fetch': 2.6.2 + '@types/node-localstorage': 1.3.2 + '@types/node-persist': 3.1.5 + '@types/source-map-support': 0.5.9 + '@types/validator': 13.11.5 '@types/ws': 7.4.7 axios: 1.6.7 commander: 5.1.0 - deep-equal: 2.2.3 - deepmerge: 4.3.1 + deep-equal: 2.2.0 + deepmerge: 4.2.2 is-number: 7.0.0 multer: 1.4.5-lts.1 - nanoid: 3.3.7 + nanoid: 3.3.6 node-fetch: 2.7.0 node-localstorage: 2.2.1 source-map-support: 0.5.21 @@ -15383,6 +15911,15 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + is-typed-array: 1.1.10 + dev: true + /typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -15392,6 +15929,16 @@ packages: is-typed-array: 1.1.13 dev: true + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + has-proto: 1.0.3 + is-typed-array: 1.1.10 + dev: true + /typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} @@ -15403,6 +15950,17 @@ packages: is-typed-array: 1.1.13 dev: true + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.7 + for-each: 0.3.3 + has-proto: 1.0.3 + is-typed-array: 1.1.10 + dev: true + /typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} @@ -15415,6 +15973,14 @@ packages: is-typed-array: 1.1.13 dev: true + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + /typed-array-length@1.0.5: resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} engines: {node: '>= 0.4'} @@ -15440,12 +16006,12 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + /ua-parser-js@0.7.31: + resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} dev: true - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} dev: true /unbox-primitive@1.0.2: @@ -15465,11 +16031,11 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@5.28.3: - resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + /undici@5.28.2: + resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} engines: {node: '>=14.0'} dependencies: - '@fastify/busboy': 2.1.1 + '@fastify/busboy': 2.0.0 dev: true /unherit@3.0.1: @@ -15479,23 +16045,23 @@ packages: /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 bail: 2.0.2 extend: 3.0.2 is-buffer: 2.0.5 is-plain-obj: 4.1.0 - trough: 2.2.0 + trough: 2.1.0 vfile: 5.3.7 - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + /unified@11.0.3: + resolution: {integrity: sha512-jlCV402P+YDcFcB2VcN/n8JasOddqIiaxv118wNBoZXEhOn+lYG7BR4Bfg2BwxvlK58dwbuH2w7GX2esAjL6Mg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 - trough: 2.2.0 + trough: 2.1.0 vfile: 6.0.1 dev: false @@ -15516,109 +16082,107 @@ packages: /unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 unist-util-is: 6.0.0 dev: false - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + /unist-util-generated@2.0.0: + resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.10 + /unist-util-is@5.1.1: + resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} /unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 dev: false /unist-util-modify-children@3.1.1: resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 array-iterate: 2.0.1 dev: false - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + /unist-util-position-from-estree@1.1.1: + resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + /unist-util-position@4.0.3: + resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 /unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 dev: false - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + /unist-util-remove-position@4.0.1: + resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 unist-util-visit: 4.1.2 /unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 unist-util-visit: 5.0.0 dev: false /unist-util-remove@3.1.1: resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 unist-util-visit-parents: 5.1.3 dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + /unist-util-stringify-position@3.0.2: + resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 dev: false /unist-util-visit-children@2.0.2: resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 dev: false /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 /unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 unist-util-is: 6.0.0 dev: false /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 unist-util-visit-parents: 5.1.3 /unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 dev: false @@ -15628,8 +16192,8 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} /unixify@1.0.0: @@ -15649,7 +16213,7 @@ packages: browserslist: '>= 4.21.0' dependencies: browserslist: 4.23.0 - escalade: 3.1.2 + escalade: 3.1.1 picocolors: 1.0.0 /upper-case-first@2.0.2: @@ -15674,24 +16238,27 @@ packages: requires-port: 1.0.0 dev: false - /urlpattern-polyfill@10.0.0: - resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} - - /urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + /urlpattern-polyfill@6.0.2: + resolution: {integrity: sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg==} + dependencies: + braces: 3.0.2 dev: true + /urlpattern-polyfill@9.0.0: + resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + /util@0.12.4: + resolution: {integrity: sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==} dependencies: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.14 + is-typed-array: 1.1.10 + safe-buffer: 5.2.1 + which-typed-array: 1.1.11 /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} @@ -15711,17 +16278,17 @@ packages: hasBin: true dependencies: dequal: 2.0.3 - diff: 5.2.0 + diff: 5.1.0 kleur: 4.1.5 sade: 1.8.1 - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + /v8-to-istanbul@9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 + '@jridgewell/trace-mapping': 0.3.23 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.8.0 dev: true /validate-npm-package-license@3.0.4: @@ -15756,59 +16323,61 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + /vfile-location@4.0.1: + resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 vfile: 5.3.7 - dev: false /vfile-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 vfile: 6.0.1 dev: false - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + /vfile-message@3.1.2: + resolution: {integrity: sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==} dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.2 /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 unist-util-stringify-position: 4.0.0 dev: false /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.2 /vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.0 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 dev: false - /vite-node@1.3.1(@types/node@18.19.22): - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} - engines: {node: ^18.0.0 || >=20.0.0} + /vite-node@0.28.5(@types/node@18.11.9): + resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} + engines: {node: '>=v14.16.0'} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@9.4.0) - pathe: 1.1.2 + mlly: 1.2.0 + pathe: 1.1.0 picocolors: 1.0.0 - vite: 5.1.5(@types/node@18.19.22) + source-map: 0.6.1 + source-map-support: 0.5.21 + vite: 4.4.9(@types/node@18.11.9) transitivePeerDependencies: - '@types/node' - less @@ -15820,8 +16389,8 @@ packages: - terser dev: true - /vite@4.5.2: - resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} + /vite@4.4.9(@types/node@18.11.9): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -15848,58 +16417,22 @@ packages: terser: optional: true dependencies: + '@types/node': 18.11.9 esbuild: 0.18.20 postcss: 8.4.35 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /vite@5.1.5(@types/node@18.19.22): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.19.22 - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.1 + rollup: 3.28.1 optionalDependencies: fsevents: 2.3.3 - dev: true - /vitefu@0.2.5(vite@4.5.2): - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + /vitefu@0.2.4(vite@4.4.9): + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 peerDependenciesMeta: vite: optional: true dependencies: - vite: 4.5.2 + vite: 4.4.9(@types/node@18.11.9) dev: false /vscode-oniguruma@1.7.0: @@ -15926,13 +16459,13 @@ packages: /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: - defaults: 1.0.4 + defaults: 1.0.3 dev: true /web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} dependencies: - util: 0.12.5 + util: 0.12.4 optionalDependencies: '@zxing/text-encoding': 0.9.0 @@ -15940,21 +16473,21 @@ packages: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} - /web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + /web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} dev: false - /webcrypto-core@1.7.8: - resolution: {integrity: sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==} + /webcrypto-core@1.7.5: + resolution: {integrity: sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A==} dependencies: - '@peculiar/asn1-schema': 2.3.8 + '@peculiar/asn1-schema': 2.3.0 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.5 - pvtsutils: 1.3.5 + pvtsutils: 1.3.2 tslib: 2.6.2 dev: true @@ -16011,8 +16544,8 @@ packages: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 + function.prototype.name: 1.1.5 + has-tostringtag: 1.0.0 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -16022,20 +16555,20 @@ packages: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-typed-array: 1.1.11 dev: true /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: - is-map: 2.0.3 + is-map: 2.0.2 is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 dev: true - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + /which-module@2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true /which-pm-runs@1.1.0: @@ -16059,6 +16592,16 @@ packages: path-exists: 4.0.0 dev: false + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + /which-typed-array@1.1.14: resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} @@ -16068,6 +16611,7 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 + dev: true /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -16126,7 +16670,7 @@ packages: /write-file-atomic@1.3.4: resolution: {integrity: sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 imurmurhash: 0.1.4 slide: 1.1.6 dev: true @@ -16152,8 +16696,20 @@ packages: optional: true dev: true - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.15.1: + resolution: {integrity: sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -16229,22 +16785,36 @@ packages: require-main-filename: 2.0.0 set-blocking: 2.0.0 string-width: 4.2.3 - which-module: 2.0.1 + which-module: 2.0.0 y18n: 4.0.3 yargs-parser: 18.1.3 dev: true + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + 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.8 + yargs-parser: 21.1.1 + dev: true + /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.1.1 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + dev: false /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} @@ -16267,13 +16837,13 @@ packages: /zen-observable@0.8.15: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} - /zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + /zip-stream@4.1.0: + resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} engines: {node: '>= 10'} dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 + archiver-utils: 2.1.0 + compress-commons: 4.1.1 + readable-stream: 3.6.0 dev: true /zod@3.22.4: From b94f452b4383a2357c926399a9e182f86488aeed Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:20:59 -0500 Subject: [PATCH 23/53] feat: build deps in mock ase job --- .github/workflows/lint_test_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lint_test_build.yml b/.github/workflows/lint_test_build.yml index 3262e5e018..3da749ba5f 100644 --- a/.github/workflows/lint_test_build.yml +++ b/.github/workflows/lint_test_build.yml @@ -84,6 +84,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup + - run: pnpm --filter mock-account-servicing-entity build:deps - run: pnpm --filter mock-account-servicing-entity typecheck - run: pnpm --filter mock-account-servicing-entity build From 82e84d640d110989544bec2951f8da2610da1768 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 8 Mar 2024 22:29:26 -0500 Subject: [PATCH 24/53] feat: get non existant wallet address test --- pnpm-lock.yaml | 9 +- test/integration/integration.test.ts | 60 +++--- test/integration/lib/AdminClient.ts | 229 ++++++++++++++++++++++ test/integration/lib/IntegrationServer.ts | 36 +++- test/integration/lib/MockASE.ts | 3 +- test/integration/lib/apolloClient.ts | 202 ------------------- test/integration/lib/utils.ts | 11 +- test/integration/package.json | 1 + 8 files changed, 305 insertions(+), 246 deletions(-) create mode 100644 test/integration/lib/AdminClient.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c3da2c691..e89fdc9017 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -629,6 +629,9 @@ importers: '@types/koa-bodyparser': specifier: ^4.3.12 version: 4.3.12 + '@types/node': + specifier: ^18.19.19 + version: 18.19.19 '@types/uuid': specifier: ^9.0.8 version: 9.0.8 @@ -5144,10 +5147,6 @@ packages: /@types/node@18.11.9: resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} - /@types/node@18.18.5: - resolution: {integrity: sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==} - dev: true - /@types/node@18.19.19: resolution: {integrity: sha512-qqV6hSy9zACEhQUy5CEGeuXAZN0fNjqLWRIvOXOwdFYhFoKBiY08VKR5kgchr90+TitLVhpUEb54hk4bYaArUw==} dependencies: @@ -10800,7 +10799,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.5 + '@types/node': 18.19.19 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index cd6ec71de9..0e31e6e27c 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -76,36 +76,46 @@ describe('Integration tests', (): void => { senderWalletAddress = await c9.opClient.walletAddress.get({ url: senderWalletAddressUrl }) + console.log({ receiverWalletAddress, senderWalletAddress }) - // TODO: better expect. - // tried jestOpenapi.toSatifyApiSpec but loading throws errors - // for invalid spec? something not right there because that works in other pkgs - expect(receiverWalletAddress).toBeTruthy() - expect(senderWalletAddress).toBeTruthy() + + expect(receiverWalletAddress.id).toBe( + receiverWalletAddressUrl.replace('http', 'https') + ) + expect(senderWalletAddress.id).toBe( + senderWalletAddressUrl.replace('http', 'https') + ) }) - // TODO: fix account not found error in webhook handler - test.skip('Get Non-Existing Wallet Address Triggers Not Found Webhook Event', async (): Promise => { - let walletAddress + test('Can Get Non-Existing Wallet Address', async (): Promise => { + const notFoundWalletAddress = + 'https://host.docker.internal:4000/accounts/asmith' const handleWebhookEventSpy = jest.spyOn( - c9.integrationServer.webhookEventHandler, + hlb.integrationServer.webhookEventHandler, 'handleWebhookEvent' ) - try { - walletAddress = await c9.opClient.walletAddress.get({ - url: 'http://host.docker.internal:4000/accounts/asmith' - }) - } catch (e) { - // 404 error from client is expected - swallow it - if (!(e instanceof OpenPaymentsClientError)) throw e - } - expect(walletAddress).toBeUndefined() + // Poll in case the webhook response to create wallet address is slow, + // but initial request may very well resolve immediately. + const walletAddress = await poll( + async () => + c9.opClient.walletAddress.get({ + url: notFoundWalletAddress + }), + (responseData) => responseData.id === notFoundWalletAddress, + 5, + 0.5 + ) + + assert(walletAddress) + expect(walletAddress.id).toBe(notFoundWalletAddress) expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ type: WebhookEventType.WalletAddressNotFound, - data: expect.any(Object) + data: expect.objectContaining({ + walletAddressUrl: notFoundWalletAddress + }) }) ) }) @@ -315,7 +325,8 @@ describe('Integration tests', (): void => { // ---------------------------------------------------------- // Grant Continuation via Polling. - // Alternative to getting the redirect url with interact_ref. + // Alternative to gettiang the redirect url with interact_ref. + // TODO: Test this way as well when OP client doesnt require interact_ref. test.skip('Grant Request Outgoing Payment', async (): Promise => { const grant = await hlb.opClient.grant.request( { @@ -361,20 +372,17 @@ describe('Integration tests', (): void => { accessToken: access_token.value, url: uri }, - { - interact_ref: '' // TODO: update OP spec/client to not need body/interact_ref here - } + // TODO: pull in latest spec which shouldn't need interact_ref + { interact_ref: '' } ), (responseData) => 'accessToken' in responseData, + // TODO: update timing to be based on the grant.continue.wait 10, 2 ) console.log({ grantContinue }) expect(true).toBe(true) }) - // ^^^ - // Grant Continuation via Polling. - // Alternative to getting the redirect url with interact_ref. // ---------------------------------------------------------- test('Create Outgoing Payment', async (): Promise => { diff --git a/test/integration/lib/AdminClient.ts b/test/integration/lib/AdminClient.ts new file mode 100644 index 0000000000..dc6d0371e1 --- /dev/null +++ b/test/integration/lib/AdminClient.ts @@ -0,0 +1,229 @@ +import type { NormalizedCacheObject } from '@apollo/client' +import { ApolloClient, gql } from '@apollo/client' +import { GraphqlTypes } from 'mock-account-servicing-lib' + +export class AdminClient { + private apolloClient: ApolloClient + + constructor(apolloClient: ApolloClient) { + this.apolloClient = apolloClient + } + + async createReceiver( + input: GraphqlTypes.CreateReceiverInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateReceiver($input: CreateReceiverInput!) { + createReceiver(input: $input) { + code + message + receiver { + completed + createdAt + expiresAt + metadata + id + incomingAmount { + assetCode + assetScale + value + } + walletAddressUrl + receivedAmount { + assetCode + assetScale + value + } + updatedAt + } + success + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.CreateReceiverResponse => { + return data.createReceiver + }) + } + + async createQuote( + input: GraphqlTypes.CreateQuoteInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateQuote($input: CreateQuoteInput!) { + createQuote(input: $input) { + code + message + quote { + createdAt + expiresAt + highEstimatedExchangeRate + id + lowEstimatedExchangeRate + maxPacketAmount + minExchangeRate + walletAddressId + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + } + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.QuoteResponse => { + return data.createQuote + }) + } + + async createOutgoingPayment( + input: GraphqlTypes.CreateOutgoingPaymentInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateOutgoingPayment($input: CreateOutgoingPaymentInput!) { + createOutgoingPayment(input: $input) { + code + message + payment { + createdAt + error + metadata + id + walletAddressId + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + sentAmount { + assetCode + assetScale + value + } + state + stateAttempts + } + success + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.OutgoingPaymentResponse => { + return data.createOutgoingPayment + }) + } + + async getOutgoingPayment(id: string): Promise { + return await this.apolloClient + .query({ + query: gql` + query GetOutgoingPayment($id: String!) { + outgoingPayment(id: $id) { + createdAt + error + metadata + id + walletAddressId + quote { + id + } + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + sentAmount { + assetCode + assetScale + value + } + state + stateAttempts + } + } + `, + variables: { id } + }) + .then((response): GraphqlTypes.OutgoingPayment => { + return response.data.outgoingPayment + }) + } + + async depositOutgoingPaymentLiquidity( + input: GraphqlTypes.DepositOutgoingPaymentLiquidityInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation DepositOutgoingPaymentLiquidity( + $input: DepositOutgoingPaymentLiquidityInput! + ) { + depositOutgoingPaymentLiquidity(input: $input) { + code + success + message + error + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.LiquidityMutationResponse => { + return data.depositOutgoingPaymentLiquidity + }) + } + + async createWalletAddress( + input: GraphqlTypes.CreateWalletAddressInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateWalletAddress($input: CreateWalletAddressInput!) { + createWalletAddress(input: $input) { + success + walletAddress { + id + url + publicName + } + } + } + `, + variables: { input } + }) + .then(({ data }): GraphqlTypes.CreateWalletAddressMutationResponse => { + console.log({ data }) + return data.createWalletAddress + }) + } +} diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index 55956bdb14..bfcdd743b8 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -8,7 +8,7 @@ import { Webhook } from 'mock-account-servicing-lib' import { TestConfig } from './config' -import { AdminClient } from './apolloClient' +import { AdminClient } from './AdminClient' export class IntegrationServer { private config: TestConfig @@ -119,20 +119,46 @@ export class WebhookEventHandler { } private async handleWalletAddressNotFound(webhookEvent: Webhook) { - const walletAddressUrl = webhookEvent.data['walletAddressUrl'] + const url = webhookEvent.data['walletAddressUrl'] - if (!walletAddressUrl || typeof walletAddressUrl !== 'string') { + if (!url || typeof url !== 'string') { throw new Error('No walletAddressUrl found') } - const accountPath = new URL(walletAddressUrl).pathname.substring(1) + const accountPath = new URL(url).pathname.substring(1) const account = await this.accounts.getByPath(accountPath) if (!account) { throw new Error('No account found for wallet address') } - // TODO: create wallet address via apolloClient + const { assetId, name: publicName } = account + + console.log('would have tried to create wallet address', { + assetId, + publicName, + url + }) + + const response = await this.adminClient.createWalletAddress({ + assetId, + publicName, + url + }) + const { walletAddress } = response + + if (!response.success) { + throw new Error('Failed to create wallet address') + } + if (!walletAddress) { + throw new Error('Could not get wallet address') + } + + await this.accounts.setWalletAddress( + account.id, + walletAddress.id, + walletAddress.url + ) } private async handleOutgoingPaymentCreated(webhookEvent: Webhook) { diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index a52db28567..1fbd3dae82 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -4,7 +4,8 @@ import { createAuthenticatedClient } from '@interledger/open-payments' import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' -import { AdminClient, createApolloClient } from './apolloClient' +import { createApolloClient } from './apolloClient' +import { AdminClient } from './AdminClient' import { IntegrationServer } from './IntegrationServer' import { TestConfig } from './config' diff --git a/test/integration/lib/apolloClient.ts b/test/integration/lib/apolloClient.ts index f6cd728053..12a9d250f7 100644 --- a/test/integration/lib/apolloClient.ts +++ b/test/integration/lib/apolloClient.ts @@ -1,6 +1,5 @@ import type { NormalizedCacheObject } from '@apollo/client' import { ApolloClient, InMemoryCache, gql } from '@apollo/client' -import { GraphqlTypes } from 'mock-account-servicing-lib' export function createApolloClient( graphqlUrl: string @@ -21,204 +20,3 @@ export function createApolloClient( } }) } - -export class AdminClient { - private apolloClient: ApolloClient - - constructor(apolloClient: ApolloClient) { - this.apolloClient = apolloClient - } - - async createReceiver( - input: GraphqlTypes.CreateReceiverInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateReceiver($input: CreateReceiverInput!) { - createReceiver(input: $input) { - code - message - receiver { - completed - createdAt - expiresAt - metadata - id - incomingAmount { - assetCode - assetScale - value - } - walletAddressUrl - receivedAmount { - assetCode - assetScale - value - } - updatedAt - } - success - } - } - `, - variables: { input } - }) - .then(({ data }): GraphqlTypes.CreateReceiverResponse => { - return data.createReceiver - }) - } - - async createQuote( - input: GraphqlTypes.CreateQuoteInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateQuote($input: CreateQuoteInput!) { - createQuote(input: $input) { - code - message - quote { - createdAt - expiresAt - highEstimatedExchangeRate - id - lowEstimatedExchangeRate - maxPacketAmount - minExchangeRate - walletAddressId - receiveAmount { - assetCode - assetScale - value - } - receiver - debitAmount { - assetCode - assetScale - value - } - } - } - } - `, - variables: { input } - }) - .then(({ data }): GraphqlTypes.QuoteResponse => { - return data.createQuote - }) - } - - async createOutgoingPayment( - input: GraphqlTypes.CreateOutgoingPaymentInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateOutgoingPayment($input: CreateOutgoingPaymentInput!) { - createOutgoingPayment(input: $input) { - code - message - payment { - createdAt - error - metadata - id - walletAddressId - receiveAmount { - assetCode - assetScale - value - } - receiver - debitAmount { - assetCode - assetScale - value - } - sentAmount { - assetCode - assetScale - value - } - state - stateAttempts - } - success - } - } - `, - variables: { input } - }) - .then(({ data }): GraphqlTypes.OutgoingPaymentResponse => { - return data.createOutgoingPayment - }) - } - - async getOutgoingPayment(id: string): Promise { - return await this.apolloClient - .query({ - query: gql` - query GetOutgoingPayment($id: String!) { - outgoingPayment(id: $id) { - createdAt - error - metadata - id - walletAddressId - quote { - id - } - receiveAmount { - assetCode - assetScale - value - } - receiver - debitAmount { - assetCode - assetScale - value - } - sentAmount { - assetCode - assetScale - value - } - state - stateAttempts - } - } - `, - variables: { id } - }) - .then((response): GraphqlTypes.OutgoingPayment => { - return response.data.outgoingPayment - }) - } - - async depositOutgoingPaymentLiquidity( - input: GraphqlTypes.DepositOutgoingPaymentLiquidityInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation DepositOutgoingPaymentLiquidity( - $input: DepositOutgoingPaymentLiquidityInput! - ) { - depositOutgoingPaymentLiquidity(input: $input) { - code - success - message - error - } - } - `, - variables: { input } - }) - .then(({ data }): GraphqlTypes.LiquidityMutationResponse => { - return data.depositOutgoingPaymentLiquidity - }) - } -} diff --git a/test/integration/lib/utils.ts b/test/integration/lib/utils.ts index 1d07f82d7d..815e47b012 100644 --- a/test/integration/lib/utils.ts +++ b/test/integration/lib/utils.ts @@ -5,27 +5,24 @@ export function wait(ms: number): Promise { export async function poll( requestFn: () => Promise, successCondition: (responseData: T) => boolean, - pollingDurationSeconds: number, - pollingIntervalSeconds: number + pollDurationSeconds: number, + pollIntervalSeconds: number ): Promise { const startTime = Date.now() let responseData - while (Date.now() - startTime < pollingDurationSeconds * 1000) { + while (Date.now() - startTime < pollDurationSeconds * 1000) { try { responseData = await requestFn() if (successCondition(responseData)) { - console.log({ responseData }) return responseData } } catch (error) { console.error('Error during polling:', error) } - await new Promise((resolve) => - setTimeout(resolve, pollingIntervalSeconds * 1000) - ) + await wait(pollIntervalSeconds * 1000) } throw new Error('Poll completed without success') diff --git a/test/integration/package.json b/test/integration/package.json index fc23542691..cc28620bdc 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -16,6 +16,7 @@ "@interledger/open-payments": "^6.7.0", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", + "@types/node": "^18.19.19", "@types/uuid": "^9.0.8", "dotenv": "^16.4.1", "koa": "^2.15.0", From 7dd1f1336f19c64e2f7d866a4adecb39f123725e Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:37:06 -0400 Subject: [PATCH 25/53] fix: update open payments pkg --- openapi/auth-server.yaml | 17 +++++++++-------- packages/auth/package.json | 2 +- packages/backend/package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- scripts/fetch-schemas.sh | 2 +- test/integration/package.json | 2 +- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/openapi/auth-server.yaml b/openapi/auth-server.yaml index 1f868fcea2..eb30e62859 100644 --- a/openapi/auth-server.yaml +++ b/openapi/auth-server.yaml @@ -213,8 +213,6 @@ paths: description: |- The interaction reference generated for this interaction by the AS. - required: - - interact_ref examples: Interaction Reference: value: @@ -323,7 +321,8 @@ components: properties: type: type: string - enum: ['incoming-payment'] + enum: + - incoming-payment description: The type of resource request as a string. This field defines which other fields are allowed in the request object. actions: type: array @@ -351,7 +350,8 @@ components: properties: type: type: string - enum: ['outgoing-payment'] + enum: + - outgoing-payment description: The type of resource request as a string. This field defines which other fields are allowed in the request object. actions: type: array @@ -381,7 +381,8 @@ components: properties: type: type: string - enum: ['quote'] + enum: + - quote description: The type of resource request as a string. This field defines which other fields are allowed in the request object. actions: type: array @@ -514,13 +515,13 @@ components: type: object properties: receiver: - $ref: './schemas.yaml#/components/schemas/receiver' + $ref: ./schemas.yaml#/components/schemas/receiver debitAmount: description: 'All amounts are maxima, i.e. multiple payments can be created under a grant as long as the total amounts of these payments do not exceed the maximum amount per interval as specified in the grant.' - $ref: './schemas.yaml#/components/schemas/amount' + $ref: ./schemas.yaml#/components/schemas/amount receiveAmount: description: 'All amounts are maxima, i.e. multiple payments can be created under a grant as long as the total amounts of these payments do not exceed the maximum amount per interval as specified in the grant.' - $ref: './schemas.yaml#/components/schemas/amount' + $ref: ./schemas.yaml#/components/schemas/amount interval: $ref: '#/components/schemas/interval' anyOf: diff --git a/packages/auth/package.json b/packages/auth/package.json index 56fe0de2bc..2e17a66b23 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -26,7 +26,7 @@ "@graphql-tools/load": "^8.0.2", "@graphql-tools/schema": "^10.0.3", "@interledger/http-signature-utils": "2.0.2", - "@interledger/open-payments": "6.7.0", + "@interledger/open-payments": "6.7.1", "@interledger/openapi": "1.2.1", "@koa/cors": "^5.0.0", "@koa/router": "^12.0.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 77743c8ac6..b5149cfada 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -51,7 +51,7 @@ "@graphql-tools/load": "^8.0.2", "@graphql-tools/schema": "^10.0.3", "@interledger/http-signature-utils": "2.0.2", - "@interledger/open-payments": "6.7.0", + "@interledger/open-payments": "6.7.1", "@interledger/openapi": "1.2.1", "@interledger/pay": "0.4.0-alpha.9", "@interledger/stream-receiver": "^0.3.3-alpha.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e89fdc9017..b48bf12c75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,8 +133,8 @@ importers: specifier: 2.0.2 version: 2.0.2 '@interledger/open-payments': - specifier: 6.7.0 - version: 6.7.0 + specifier: 6.7.1 + version: 6.7.1 '@interledger/openapi': specifier: 1.2.1 version: 1.2.1 @@ -272,8 +272,8 @@ importers: specifier: 2.0.2 version: 2.0.2 '@interledger/open-payments': - specifier: 6.7.0 - version: 6.7.0 + specifier: 6.7.1 + version: 6.7.1 '@interledger/openapi': specifier: 1.2.1 version: 1.2.1 @@ -621,8 +621,8 @@ importers: specifier: 2.0.0 version: 2.0.0 '@interledger/open-payments': - specifier: ^6.7.0 - version: 6.7.0 + specifier: ^6.7.1 + version: 6.7.1 '@types/koa': specifier: 2.14.0 version: 2.14.0 @@ -3549,8 +3549,8 @@ packages: jose: 4.13.1 uuid: 9.0.1 - /@interledger/open-payments@6.7.0: - resolution: {integrity: sha512-ibIpNHNZknhYWCy/SqUNWybwDkkhaM/H9lIXruEKsBogkh5l/ouXw78DrOYuzTTIb+3T4x6LlTJk/PGBht8S8Q==} + /@interledger/open-payments@6.7.1: + resolution: {integrity: sha512-wrSe0Z9ogn6WpLvZQTnacyTBbHbiiXP78anAxQsPAvXh2degj82RSQJiSboSAWkC4yYPyIu7JMo3PVGC0ZTl2w==} dependencies: '@interledger/http-signature-utils': 2.0.2 '@interledger/openapi': 1.2.1 diff --git a/scripts/fetch-schemas.sh b/scripts/fetch-schemas.sh index c2b7c57426..8d78328426 100755 --- a/scripts/fetch-schemas.sh +++ b/scripts/fetch-schemas.sh @@ -1,7 +1,7 @@ #!/bin/bash REPO_ROOT=$(git rev-parse --show-toplevel) -BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.7.0}" +BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.7.1}" BASE_URL="https://raw.githubusercontent.com/interledger/open-payments/$BRANCH_OR_TAG" OUT_DIR="$REPO_ROOT/openapi" diff --git a/test/integration/package.json b/test/integration/package.json index cc28620bdc..1a129c06cf 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.0", - "@interledger/open-payments": "^6.7.0", + "@interledger/open-payments": "^6.7.1", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", "@types/node": "^18.19.19", From 53773cceb1cd3417a9542b3fbccd273ae27971a1 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:39:52 -0400 Subject: [PATCH 26/53] chore: fix lint warnings --- test/integration/integration.test.ts | 5 ++--- test/integration/lib/apolloClient.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 0e31e6e27c..f408d7b21e 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -1,7 +1,6 @@ import assert from 'assert' import { validate as isUuid } from 'uuid' import { - OpenPaymentsClientError, isPendingGrant, isFinalizedGrant, WalletAddress, @@ -372,8 +371,8 @@ describe('Integration tests', (): void => { accessToken: access_token.value, url: uri }, - // TODO: pull in latest spec which shouldn't need interact_ref - { interact_ref: '' } + // TODO: pull in latest from OP (when merged) which shouldn't need body at all + { interact_ref: undefined } ), (responseData) => 'accessToken' in responseData, // TODO: update timing to be based on the grant.continue.wait diff --git a/test/integration/lib/apolloClient.ts b/test/integration/lib/apolloClient.ts index 12a9d250f7..6ef4647bd8 100644 --- a/test/integration/lib/apolloClient.ts +++ b/test/integration/lib/apolloClient.ts @@ -1,5 +1,5 @@ import type { NormalizedCacheObject } from '@apollo/client' -import { ApolloClient, InMemoryCache, gql } from '@apollo/client' +import { ApolloClient, InMemoryCache } from '@apollo/client' export function createApolloClient( graphqlUrl: string From 4cd2646220d3024331afd6b933f3ee1b52dab6d2 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 11 Mar 2024 16:26:43 -0400 Subject: [PATCH 27/53] feat: implement continuation polling --- test/integration/integration.test.ts | 88 ++++++++++++++++------- test/integration/lib/IntegrationServer.ts | 6 -- 2 files changed, 64 insertions(+), 30 deletions(-) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index f408d7b21e..1aafed1af2 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -220,7 +220,9 @@ describe('Integration tests', (): void => { console.log({ quote }) }) - test('Grant Request Outgoing Payment', async (): Promise => { + // --- GRANT CONTINUATION WITH FINISH METHOD --- + // TODO: Grant Continuation w/ finish in another Open Payments Flow test + test.skip('Grant Request Outgoing Payment', async (): Promise => { const grant = await hlb.opClient.grant.request( { url: senderWalletAddress.authServer @@ -254,9 +256,12 @@ describe('Integration tests', (): void => { assert(isPendingGrant(grant)) outgoingPaymentGrant = grant + + // TODO: I assumed I needed to do this. Can I skip? Probably not but I should + await wait((outgoingPaymentGrant.continue.wait ?? 5) * 1000) }) - test('Continuation Request', async (): Promise => { + test.skip('Continuation Request', async (): Promise => { // Extract interact ID from the redirect URL const { redirect: startInteractionUrl } = outgoingPaymentGrant.interact const tokens = startInteractionUrl.split('/interact/') @@ -307,9 +312,6 @@ describe('Integration tests', (): void => { assert(interact_ref) const { access_token, uri } = outgoingPaymentGrant.continue - - await wait((outgoingPaymentGrant.continue.wait ?? 5) * 1000) - const grantContinue_ = await c9.opClient.grant.continue( { accessToken: access_token.value, @@ -321,12 +323,9 @@ describe('Integration tests', (): void => { assert(isFinalizedGrant(grantContinue_)) grantContinue = grantContinue_ }) + // --- GRANT CONTINUATION WITH FINISH METHOD --- - // ---------------------------------------------------------- - // Grant Continuation via Polling. - // Alternative to gettiang the redirect url with interact_ref. - // TODO: Test this way as well when OP client doesnt require interact_ref. - test.skip('Grant Request Outgoing Payment', async (): Promise => { + test('Grant Request Outgoing Payment', async (): Promise => { const grant = await hlb.opClient.grant.request( { url: senderWalletAddress.authServer @@ -337,7 +336,7 @@ describe('Integration tests', (): void => { { type: 'outgoing-payment', actions: ['create', 'read', 'list'], - identifier: senderWalletAddressUrl, + identifier: senderWalletAddressUrl.replace('http', 'https'), limits: { debitAmount: quote.debitAmount, receiveAmount: quote.receiveAmount @@ -347,11 +346,6 @@ describe('Integration tests', (): void => { }, interact: { start: ['redirect'] - // finish: { - // method: 'redirect', - // uri: 'https://example.com', - // nonce: '456' - // } } } ) @@ -360,11 +354,56 @@ describe('Integration tests', (): void => { assert(isPendingGrant(grant)) outgoingPaymentGrant = grant + + // Delay following request according to the continue wait time + await wait((outgoingPaymentGrant.continue.wait ?? 5) * 1000) }) - test.skip('Continuation Request', async (): Promise => { + test('Continuation Request', async (): Promise => { + // Extract interact ID from the redirect URL + const { redirect: startInteractionUrl } = outgoingPaymentGrant.interact + const tokens = startInteractionUrl.split('/interact/') + const interactId = tokens[1] ? tokens[1].split('/')[0] : null + const nonce = outgoingPaymentGrant.interact.finish + assert(interactId) + + // Start interaction + const interactResponse = await fetch(startInteractionUrl, { + redirect: 'manual' // dont follow redirects + }) + expect(interactResponse.status).toBe(302) + + const cookie = parseCookies(interactResponse) + + // Accept + const acceptResponse = await fetch( + `${senderWalletAddress.authServer}/grant/${interactId}/${nonce}/accept`, + { + method: 'POST', + headers: { + 'x-idp-secret': 'replace-me', + cookie + } + } + ) + + expect(acceptResponse.status).toBe(202) + + // Finish interaction + const finishResponse = await fetch( + `${senderWalletAddress.authServer}/interact/${interactId}/${nonce}/finish`, + { + method: 'GET', + headers: { + 'x-idp-secret': 'replace-me', + cookie + } + } + ) + expect(finishResponse.status).toBe(202) + const { access_token, uri } = outgoingPaymentGrant.continue - const grantContinue = await poll( + const grantContinue_ = await poll( async () => c9.opClient.grant.continue( { @@ -374,13 +413,14 @@ describe('Integration tests', (): void => { // TODO: pull in latest from OP (when merged) which shouldn't need body at all { interact_ref: undefined } ), - (responseData) => 'accessToken' in responseData, - // TODO: update timing to be based on the grant.continue.wait - 10, - 2 + (responseData) => 'access_token' in responseData, + 20, + 5 ) - console.log({ grantContinue }) - expect(true).toBe(true) + + console.log('grantContinue', JSON.stringify(grantContinue_, null, 2)) + assert(isFinalizedGrant(grantContinue_)) + grantContinue = grantContinue_ }) // ---------------------------------------------------------- diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index bfcdd743b8..919dfd8ea7 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -134,12 +134,6 @@ export class WebhookEventHandler { const { assetId, name: publicName } = account - console.log('would have tried to create wallet address', { - assetId, - publicName, - url - }) - const response = await this.adminClient.createWalletAddress({ assetId, publicName, From b17465db6d4ccd8ceb7e84121d8093d389aac845 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:41:27 -0400 Subject: [PATCH 28/53] chore: test cleanup --- .../connector/core/utils/create-context.ts | 4 +- test/integration/integration.test.ts | 47 +------------ test/integration/lib/AdminClient.ts | 1 - test/integration/lib/IntegrationServer.ts | 67 +------------------ 4 files changed, 6 insertions(+), 113 deletions(-) diff --git a/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts b/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts index 96b52c0f96..cb8af0779f 100644 --- a/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts +++ b/packages/backend/src/payment-method/ilp/connector/core/utils/create-context.ts @@ -20,9 +20,7 @@ export function createContext( options: Options = {} ): Koa.ParameterizedContext { const app = options.app || new Koa() - const req = new MockIncomingMessage( - options.req || {} - ) as unknown as IncomingMessage + const req = new MockIncomingMessage(options.req || {}) const res = new MockServerResponse( req, options.res diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 1aafed1af2..42bee96176 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -37,35 +37,13 @@ describe('Integration tests', (): void => { const senderWalletAddressUrl = 'http://host.docker.internal:3000/accounts/gfranklin' - // TODO: Is there a better way to organize these tests so that there arent many tests - // with side effects (changing this global state) which subsequent tests rely on? In - // some ways these tests should all be 1 since they aren't independant but I would - // prefer not to make them literally 1 test for readability of code and results and - // easier developement and debugging. - - // Assigned in test: Can Get Existing Wallet Address let receiverWalletAddress: WalletAddress let senderWalletAddress: WalletAddress - - // Assigned initially in test: Grant Request Incoming Payment - // Then re-assigned in test: Grant Request Quote and Grant Request Outgoing Payment - // - could set new vars but just following whats in postman for now let accessToken: string - - // Assigned in Create Incoming Payment let incomingPayment: IncomingPayment - - // Assigned in Create Quote let quote: Quote - - // Assigned in Grant Request Outgoing Payment - // let continueId: string let outgoingPaymentGrant: PendingGrant - - // set in Continuation Request let grantContinue: Grant - - // set in Create Outgoing Payment let outgoingPayment: OutgoingPayment test('Can Get Existing Wallet Address', async (): Promise => { @@ -76,8 +54,6 @@ describe('Integration tests', (): void => { url: senderWalletAddressUrl }) - console.log({ receiverWalletAddress, senderWalletAddress }) - expect(receiverWalletAddress.id).toBe( receiverWalletAddressUrl.replace('http', 'https') ) @@ -136,8 +112,6 @@ describe('Integration tests', (): void => { } ) - console.log({ grant }) - assert(!isPendingGrant(grant)) accessToken = grant.access_token.value }) @@ -169,8 +143,6 @@ describe('Integration tests', (): void => { } ) - console.log({ incomingPayment }) - // Delay gives time for webhook to be received await wait(1000) expect(handleWebhookEventSpy).toHaveBeenCalledWith( @@ -198,8 +170,6 @@ describe('Integration tests', (): void => { } ) - console.log(JSON.stringify(grant, null, 2)) - assert(!isPendingGrant(grant)) accessToken = grant.access_token.value }) @@ -216,8 +186,6 @@ describe('Integration tests', (): void => { method: 'ilp' } ) - - console.log({ quote }) }) // --- GRANT CONTINUATION WITH FINISH METHOD --- @@ -252,17 +220,14 @@ describe('Integration tests', (): void => { } ) - console.log({ grant }) - assert(isPendingGrant(grant)) outgoingPaymentGrant = grant - // TODO: I assumed I needed to do this. Can I skip? Probably not but I should + // Delay following request according to the continue wait time await wait((outgoingPaymentGrant.continue.wait ?? 5) * 1000) }) test.skip('Continuation Request', async (): Promise => { - // Extract interact ID from the redirect URL const { redirect: startInteractionUrl } = outgoingPaymentGrant.interact const tokens = startInteractionUrl.split('/interact/') const interactId = tokens[1] ? tokens[1].split('/')[0] : null @@ -319,7 +284,6 @@ describe('Integration tests', (): void => { }, { interact_ref } ) - console.log(JSON.stringify(grantContinue_, null, 2)) assert(isFinalizedGrant(grantContinue_)) grantContinue = grantContinue_ }) @@ -350,8 +314,6 @@ describe('Integration tests', (): void => { } ) - console.log({ grant }) - assert(isPendingGrant(grant)) outgoingPaymentGrant = grant @@ -360,7 +322,6 @@ describe('Integration tests', (): void => { }) test('Continuation Request', async (): Promise => { - // Extract interact ID from the redirect URL const { redirect: startInteractionUrl } = outgoingPaymentGrant.interact const tokens = startInteractionUrl.split('/interact/') const interactId = tokens[1] ? tokens[1].split('/')[0] : null @@ -418,11 +379,9 @@ describe('Integration tests', (): void => { 5 ) - console.log('grantContinue', JSON.stringify(grantContinue_, null, 2)) assert(isFinalizedGrant(grantContinue_)) grantContinue = grantContinue_ }) - // ---------------------------------------------------------- test('Create Outgoing Payment', async (): Promise => { const handleWebhookEventSpy = jest.spyOn( @@ -441,7 +400,6 @@ describe('Integration tests', (): void => { quoteId: quote.id } ) - console.log({ outgoingPayment }) // Delay gives time for webhooks to be received await wait(1000) expect(handleWebhookEventSpy).toHaveBeenCalledWith( @@ -467,7 +425,8 @@ describe('Integration tests', (): void => { url: `${senderWalletAddress.resourceServer}/outgoing-payments/${id}`, accessToken: grantContinue.access_token.value }) - console.log({ outgoingPayment_ }) + + expect(outgoingPayment_.id).toBe(outgoingPayment.id) }) }) diff --git a/test/integration/lib/AdminClient.ts b/test/integration/lib/AdminClient.ts index dc6d0371e1..4ebb0e5498 100644 --- a/test/integration/lib/AdminClient.ts +++ b/test/integration/lib/AdminClient.ts @@ -222,7 +222,6 @@ export class AdminClient { variables: { input } }) .then(({ data }): GraphqlTypes.CreateWalletAddressMutationResponse => { - console.log({ data }) return data.createWalletAddress }) } diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index 919dfd8ea7..644cc92020 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -30,7 +30,8 @@ export class IntegrationServer { public start(port: number): void { this.app.use(async (ctx) => { if (ctx.path === '/webhooks' && ctx.method === 'POST') { - const { body } = ctx.request + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { body } = ctx.request as Koa.Request & { body?: any } if (this.isWebhookEvent(body)) { this.webhookEventHandler.handleWebhookEvent(body) @@ -93,25 +94,16 @@ export class WebhookEventHandler { } public async handleWebhookEvent(webhookEvent: Webhook) { - console.log('handling webhook') - console.log((await this.accounts.listAll())[0].walletAddress) switch (webhookEvent.type) { case WebhookEventType.WalletAddressNotFound: await this.handleWalletAddressNotFound(webhookEvent) break case WebhookEventType.IncomingPaymentCreated: - console.log('incoming payment created') - // await this.handleIncomingPaymentCreated(webhookEvent) - break - case WebhookEventType.IncomingPaymentCompleted: - console.log('incoming payemnt completed') break case WebhookEventType.OutgoingPaymentCreated: - console.log('outgoing payemnt created') await this.handleOutgoingPaymentCreated(webhookEvent) break case WebhookEventType.OutgoingPaymentCompleted: - console.log('outgoing payemnt completed') break default: console.log(`unknown event type: ${webhookEvent.type}`) @@ -184,62 +176,7 @@ export class WebhookEventHandler { if (response.code !== '200') { const msg = 'Deposit outgoing payment liquidity failed' - console.log(msg, { response }) throw new Error(msg) } - - // TODO: remove this debug log - console.log({ response }) - - return } - - // private async handleOutgoingPaymentCompletedFailed(webhookEvent: Webhook) { - // const payment = webhookEvent.data - // const walletAddressId = payment.walletAddressId - // if (typeof walletAddressId !== 'string') { - // throw new Error('No walletAddressId found') - // } - // const account = await this.accounts.getByWalletAddressId(walletAddressId) - - // if (!account) { - // throw new Error( - // `No account found for walletAddressId: ${walletAddressId}` - // ) - // } - - // console.log({ - // 'payment.sentAmount': payment.sentAmount, - // 'payment.debitAmount': payment.debitAmount - // }) - - // // 'payment.sentAmount': { value: '0', assetCode: 'USD', assetScale: 2 }, - // // 'payment.debitAmount': { value: '617', assetCode: 'USD', assetScale: 2 } - - // let sentAmount: bigint - // let debitAmount: bigint - - // try { - // sentAmount = BigInt((payment.sentAmount as any).value) - // debitAmount = BigInt((payment.debitAmount as any).value) - // } catch (err) { - // throw new Error('Invalid sentAmount or debitAmount') - // } - - // const toVoid = debitAmount - sentAmount - - // await this.accounts.debit(account.id, sentAmount, true) - // if (toVoid > 0) { - // await this.accounts.voidPendingDebit(account.id, toVoid) - // } - - // // TODO: withdraw remaining liquidity - - // return - // } - - // private async handleIncomingPaymentCreated(webhookEvent: Webhook) { - // console.log('handleIncomingPaymentCreated') - // console.log({ webhookEvent }) - // } } From 42ab9646358112b379a373022a4ed21073ab6872 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:39:56 -0400 Subject: [PATCH 29/53] refactor: generate gql in tests instead of import from lib --- packages/backend/codegen.yml | 11 + .../mock-account-servicing-lib/src/index.ts | 1 - test/integration/integration.test.ts | 16 +- test/integration/lib/AdminClient.ts | 48 +- test/integration/lib/generated/graphql.ts | 2227 +++++++++++++++++ 5 files changed, 2278 insertions(+), 25 deletions(-) create mode 100644 test/integration/lib/generated/graphql.ts diff --git a/packages/backend/codegen.yml b/packages/backend/codegen.yml index 213acf88b8..d6bdfe4225 100644 --- a/packages/backend/codegen.yml +++ b/packages/backend/codegen.yml @@ -41,6 +41,17 @@ generates: UInt8: number UInt64: bigint ../mock-account-servicing-lib/src/generated/graphql.ts: + plugins: + - 'typescript' + - 'typescript-resolvers' + config: + defaultMapper: Partial<{T}> + # By default it is T | null. But the service code uses typescript's optional types (`foo?: T`) which are `T | undefined`. This saves the trouble of converting them explicitly. + inputMaybeValue: T | undefined + scalars: + UInt8: number + UInt64: bigint + ../../test/integration/lib/generated/graphql.ts: plugins: - 'typescript' - 'typescript-resolvers' diff --git a/packages/mock-account-servicing-lib/src/index.ts b/packages/mock-account-servicing-lib/src/index.ts index ab9486dc61..db6d2486b2 100644 --- a/packages/mock-account-servicing-lib/src/index.ts +++ b/packages/mock-account-servicing-lib/src/index.ts @@ -1,5 +1,4 @@ export { Peering, Account, Config, Webhook } from './types' -export * as GraphqlTypes from './generated/graphql' export { AccountProvider } from './AccountProvider' export { setupFromSeed } from './setupFromSeed' diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 42bee96176..5827669102 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -12,8 +12,14 @@ import { } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' -import { GraphqlTypes, WebhookEventType } from 'mock-account-servicing-lib' +import { WebhookEventType } from 'mock-account-servicing-lib' import { parseCookies, poll, wait } from './lib/utils' +import { + Receiver as ReceiverGql, + Quote as QuoteGql, + OutgoingPayment as OutgoingPaymentGql, + OutgoingPaymentState +} from './lib/generated/graphql' jest.setTimeout(20000) @@ -436,9 +442,9 @@ describe('Integration tests', (): void => { const amountValueToSend = '500' let gfranklinWalletAddressId: string - let receiver: GraphqlTypes.Receiver - let quote: GraphqlTypes.Quote - let outgoingPayment: GraphqlTypes.OutgoingPayment + let receiver: ReceiverGql + let quote: QuoteGql + let outgoingPayment: OutgoingPaymentGql beforeAll(async () => { const gfranklinWalletAddress = await c9.accounts.getByWalletAddressUrl( @@ -525,7 +531,7 @@ describe('Integration tests', (): void => { const payment = await c9.adminClient.getOutgoingPayment( outgoingPayment.id ) - expect(payment.state).toBe(GraphqlTypes.OutgoingPaymentState.Completed) + expect(payment.state).toBe(OutgoingPaymentState.Completed) expect(payment.receiveAmount.value).toBe(amountValueToSend) expect(payment.sentAmount.value).toBe(amountValueToSend) }) diff --git a/test/integration/lib/AdminClient.ts b/test/integration/lib/AdminClient.ts index 4ebb0e5498..6f848d2fcc 100644 --- a/test/integration/lib/AdminClient.ts +++ b/test/integration/lib/AdminClient.ts @@ -1,6 +1,18 @@ import type { NormalizedCacheObject } from '@apollo/client' import { ApolloClient, gql } from '@apollo/client' -import { GraphqlTypes } from 'mock-account-servicing-lib' +import { + CreateOutgoingPaymentInput, + CreateQuoteInput, + CreateReceiverInput, + CreateReceiverResponse, + CreateWalletAddressInput, + CreateWalletAddressMutationResponse, + DepositOutgoingPaymentLiquidityInput, + LiquidityMutationResponse, + OutgoingPayment, + OutgoingPaymentResponse, + QuoteResponse +} from './generated/graphql' export class AdminClient { private apolloClient: ApolloClient @@ -10,8 +22,8 @@ export class AdminClient { } async createReceiver( - input: GraphqlTypes.CreateReceiverInput - ): Promise { + input: CreateReceiverInput + ): Promise { return await this.apolloClient .mutate({ mutation: gql` @@ -44,14 +56,12 @@ export class AdminClient { `, variables: { input } }) - .then(({ data }): GraphqlTypes.CreateReceiverResponse => { + .then(({ data }): CreateReceiverResponse => { return data.createReceiver }) } - async createQuote( - input: GraphqlTypes.CreateQuoteInput - ): Promise { + async createQuote(input: CreateQuoteInput): Promise { return await this.apolloClient .mutate({ mutation: gql` @@ -85,14 +95,14 @@ export class AdminClient { `, variables: { input } }) - .then(({ data }): GraphqlTypes.QuoteResponse => { + .then(({ data }): QuoteResponse => { return data.createQuote }) } async createOutgoingPayment( - input: GraphqlTypes.CreateOutgoingPaymentInput - ): Promise { + input: CreateOutgoingPaymentInput + ): Promise { return await this.apolloClient .mutate({ mutation: gql` @@ -131,12 +141,12 @@ export class AdminClient { `, variables: { input } }) - .then(({ data }): GraphqlTypes.OutgoingPaymentResponse => { + .then(({ data }): OutgoingPaymentResponse => { return data.createOutgoingPayment }) } - async getOutgoingPayment(id: string): Promise { + async getOutgoingPayment(id: string): Promise { return await this.apolloClient .query({ query: gql` @@ -173,14 +183,14 @@ export class AdminClient { `, variables: { id } }) - .then((response): GraphqlTypes.OutgoingPayment => { + .then((response): OutgoingPayment => { return response.data.outgoingPayment }) } async depositOutgoingPaymentLiquidity( - input: GraphqlTypes.DepositOutgoingPaymentLiquidityInput - ): Promise { + input: DepositOutgoingPaymentLiquidityInput + ): Promise { return await this.apolloClient .mutate({ mutation: gql` @@ -197,14 +207,14 @@ export class AdminClient { `, variables: { input } }) - .then(({ data }): GraphqlTypes.LiquidityMutationResponse => { + .then(({ data }): LiquidityMutationResponse => { return data.depositOutgoingPaymentLiquidity }) } async createWalletAddress( - input: GraphqlTypes.CreateWalletAddressInput - ): Promise { + input: CreateWalletAddressInput + ): Promise { return await this.apolloClient .mutate({ mutation: gql` @@ -221,7 +231,7 @@ export class AdminClient { `, variables: { input } }) - .then(({ data }): GraphqlTypes.CreateWalletAddressMutationResponse => { + .then(({ data }): CreateWalletAddressMutationResponse => { return data.createWalletAddress }) } diff --git a/test/integration/lib/generated/graphql.ts b/test/integration/lib/generated/graphql.ts new file mode 100644 index 0000000000..f5f4003911 --- /dev/null +++ b/test/integration/lib/generated/graphql.ts @@ -0,0 +1,2227 @@ +import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +export type Maybe = T | null; +export type InputMaybe = T | undefined; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + JSONObject: { input: any; output: any; } + UInt8: { input: number; output: number; } + UInt64: { input: bigint; output: bigint; } +}; + +export enum Alg { + EdDsa = 'EdDSA' +} + +export type Amount = { + __typename?: 'Amount'; + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + assetCode: Scalars['String']['output']; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + assetScale: Scalars['UInt8']['output']; + value: Scalars['UInt64']['output']; +}; + +export type AmountInput = { + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + assetCode: Scalars['String']['input']; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + assetScale: Scalars['UInt8']['input']; + value: Scalars['UInt64']['input']; +}; + +export type Asset = Model & { + __typename?: 'Asset'; + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + code: Scalars['String']['output']; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Fetch a page of asset fees */ + fees?: Maybe; + /** Asset id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Account Servicing Entity will be notified via a webhook event if liquidity falls below this value */ + liquidityThreshold?: Maybe; + /** The receiving fee structure for the asset */ + receivingFee?: Maybe; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + scale: Scalars['UInt8']['output']; + /** The sending fee structure for the asset */ + sendingFee?: Maybe; + /** Minimum amount of liquidity that can be withdrawn from the asset */ + withdrawalThreshold?: Maybe; +}; + + +export type AssetFeesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + +export type AssetEdge = { + __typename?: 'AssetEdge'; + cursor: Scalars['String']['output']; + node: Asset; +}; + +export type AssetMutationResponse = MutationResponse & { + __typename?: 'AssetMutationResponse'; + asset?: Maybe; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type AssetsConnection = { + __typename?: 'AssetsConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type BasePayment = { + createdAt: Scalars['String']['output']; + id: Scalars['ID']['output']; + metadata?: Maybe; + walletAddressId: Scalars['ID']['output']; +}; + +export type CreateAssetInput = { + /** [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` */ + code: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if liquidity falls below this value */ + liquidityThreshold?: InputMaybe; + /** Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit */ + scale: Scalars['UInt8']['input']; + /** Minimum amount of liquidity that can be withdrawn from the asset */ + withdrawalThreshold?: InputMaybe; +}; + +export type CreateAssetLiquidityWithdrawalInput = { + /** Amount of withdrawal. */ + amount: Scalars['UInt64']['input']; + /** The id of the asset to create the withdrawal for. */ + assetId: Scalars['String']['input']; + /** The id of the withdrawal. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type CreateIncomingPaymentInput = { + /** Expiration date-time */ + expiresAt?: InputMaybe; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Maximum amount to be received */ + incomingAmount?: InputMaybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: InputMaybe; + /** Id of the wallet address under which the incoming payment will be created */ + walletAddressId: Scalars['String']['input']; +}; + +export type CreateOrUpdatePeerByUrlInput = { + /** Asset id of peering relationship */ + assetId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value */ + liquidityThreshold?: InputMaybe; + /** Amount of liquidity to deposit for peer */ + liquidityToDeposit?: InputMaybe; + /** Maximum packet amount that the peer accepts */ + maxPacketAmount?: InputMaybe; + /** Peer's internal name for overriding auto-peer's default naming */ + name?: InputMaybe; + /** Peer's URL address at which the peer accepts auto-peering requests */ + peerUrl: Scalars['String']['input']; +}; + +export type CreateOrUpdatePeerByUrlMutationResponse = MutationResponse & { + __typename?: 'CreateOrUpdatePeerByUrlMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + peer?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type CreateOutgoingPaymentInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Additional metadata associated with the outgoing payment. */ + metadata?: InputMaybe; + /** Id of the corresponding quote for that outgoing payment */ + quoteId: Scalars['String']['input']; + /** Id of the wallet address under which the outgoing payment will be created */ + walletAddressId: Scalars['String']['input']; +}; + +export type CreatePeerInput = { + /** Asset id of peering relationship */ + assetId: Scalars['String']['input']; + /** Peering connection details */ + http: HttpInput; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Initial amount of liquidity to deposit for peer */ + initialLiquidity?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value */ + liquidityThreshold?: InputMaybe; + /** Maximum packet amount that the peer accepts */ + maxPacketAmount?: InputMaybe; + /** Peer's internal name */ + name?: InputMaybe; + /** Peer's ILP address */ + staticIlpAddress: Scalars['String']['input']; +}; + +export type CreatePeerLiquidityWithdrawalInput = { + /** Amount of withdrawal. */ + amount: Scalars['UInt64']['input']; + /** The id of the withdrawal. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the peer to create the withdrawal for. */ + peerId: Scalars['String']['input']; +}; + +export type CreatePeerMutationResponse = MutationResponse & { + __typename?: 'CreatePeerMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + peer?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type CreateQuoteInput = { + /** Amount to send (fixed send) */ + debitAmount?: InputMaybe; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Amount to receive (fixed receive) */ + receiveAmount?: InputMaybe; + /** Wallet address URL of the receiver */ + receiver: Scalars['String']['input']; + /** Id of the wallet address under which the quote will be created */ + walletAddressId: Scalars['String']['input']; +}; + +export type CreateReceiverInput = { + /** Expiration date-time */ + expiresAt?: InputMaybe; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Maximum amount to be received */ + incomingAmount?: InputMaybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: InputMaybe; + /** Receiving wallet address URL */ + walletAddressUrl: Scalars['String']['input']; +}; + +export type CreateReceiverResponse = { + __typename?: 'CreateReceiverResponse'; + code: Scalars['String']['output']; + message?: Maybe; + receiver?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type CreateWalletAddressInput = { + /** Asset of the wallet address */ + assetId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Public name associated with the wallet address */ + publicName?: InputMaybe; + /** Wallet Address URL */ + url: Scalars['String']['input']; +}; + +export type CreateWalletAddressKeyInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Public key */ + jwk: JwkInput; + walletAddressId: Scalars['String']['input']; +}; + +export type CreateWalletAddressKeyMutationResponse = MutationResponse & { + __typename?: 'CreateWalletAddressKeyMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddressKey?: Maybe; +}; + +export type CreateWalletAddressMutationResponse = MutationResponse & { + __typename?: 'CreateWalletAddressMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddress?: Maybe; +}; + +export type CreateWalletAddressWithdrawalInput = { + /** The id of the withdrawal. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the Open Payments wallet address to create the withdrawal for. */ + walletAddressId: Scalars['String']['input']; +}; + +export enum Crv { + Ed25519 = 'Ed25519' +} + +export type DeletePeerInput = { + id: Scalars['ID']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; +}; + +export type DeletePeerMutationResponse = MutationResponse & { + __typename?: 'DeletePeerMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type DepositAssetLiquidityInput = { + /** Amount of liquidity to deposit. */ + amount: Scalars['UInt64']['input']; + /** The id of the asset to deposit liquidity. */ + assetId: Scalars['String']['input']; + /** The id of the transfer. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type DepositEventLiquidityInput = { + /** The id of the event to deposit into. */ + eventId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type DepositOutgoingPaymentLiquidityInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the outgoing payment to deposit into. */ + outgoingPaymentId: Scalars['String']['input']; +}; + +export type DepositPeerLiquidityInput = { + /** Amount of liquidity to deposit. */ + amount: Scalars['UInt64']['input']; + /** The id of the transfer. */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the peer to deposit liquidity. */ + peerId: Scalars['String']['input']; +}; + +export type Fee = Model & { + __typename?: 'Fee'; + /** Asset id associated with the fee */ + assetId: Scalars['ID']['output']; + /** Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100% */ + basisPoints: Scalars['Int']['output']; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Fixed fee */ + fixed: Scalars['UInt64']['output']; + /** Fee id */ + id: Scalars['ID']['output']; + /** Type of fee (sending or receiving) */ + type: FeeType; +}; + +export type FeeDetails = { + /** Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100% */ + basisPoints: Scalars['Int']['input']; + /** A flat fee */ + fixed: Scalars['UInt64']['input']; +}; + +export type FeeEdge = { + __typename?: 'FeeEdge'; + cursor: Scalars['String']['output']; + node: Fee; +}; + +export enum FeeType { + /** Receiver pays the fees */ + Receiving = 'RECEIVING', + /** Sender pays the fees */ + Sending = 'SENDING' +} + +export type FeesConnection = { + __typename?: 'FeesConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type FilterString = { + in: Array; +}; + +export type Http = { + __typename?: 'Http'; + /** Outgoing connection details */ + outgoing: HttpOutgoing; +}; + +export type HttpIncomingInput = { + /** Array of auth tokens accepted by this Rafiki instance */ + authTokens: Array; +}; + +export type HttpInput = { + /** Incoming connection details */ + incoming?: InputMaybe; + /** Outgoing connection details */ + outgoing: HttpOutgoingInput; +}; + +export type HttpOutgoing = { + __typename?: 'HttpOutgoing'; + /** Auth token to present at the peering Rafiki instance */ + authToken: Scalars['String']['output']; + /** Peer's connection endpoint */ + endpoint: Scalars['String']['output']; +}; + +export type HttpOutgoingInput = { + /** Auth token to present at the peering Rafiki instance */ + authToken: Scalars['String']['input']; + /** Peer's connection endpoint */ + endpoint: Scalars['String']['input']; +}; + +export type IncomingPayment = BasePayment & Model & { + __typename?: 'IncomingPayment'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Date-time of expiry. After this time, the incoming payment will not accept further payments made to it. */ + expiresAt: Scalars['String']['output']; + /** Incoming Payment id */ + id: Scalars['ID']['output']; + /** The maximum amount that should be paid into the wallet address under this incoming payment. */ + incomingAmount?: Maybe; + /** Available liquidity */ + liquidity?: Maybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: Maybe; + /** The total amount that has been paid into the wallet address under this incoming payment. */ + receivedAmount: Amount; + /** Incoming payment state */ + state: IncomingPaymentState; + /** Id of the wallet address under which this incoming payment was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type IncomingPaymentConnection = { + __typename?: 'IncomingPaymentConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type IncomingPaymentEdge = { + __typename?: 'IncomingPaymentEdge'; + cursor: Scalars['String']['output']; + node: IncomingPayment; +}; + +export type IncomingPaymentResponse = { + __typename?: 'IncomingPaymentResponse'; + code: Scalars['String']['output']; + message?: Maybe; + payment?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export enum IncomingPaymentState { + /** The payment is either auto-completed once the received amount equals the expected `incomingAmount`, or it is completed manually via an API call. */ + Completed = 'COMPLETED', + /** If the payment expires before it is completed then the state will move to EXPIRED and no further payments will be accepted. */ + Expired = 'EXPIRED', + /** The payment has a state of PENDING when it is initially created. */ + Pending = 'PENDING', + /** As soon as payment has started (funds have cleared into the account) the state moves to PROCESSING */ + Processing = 'PROCESSING' +} + +export type Jwk = { + __typename?: 'Jwk'; + /** Cryptographic algorithm family used with the key. The only allowed value is `EdDSA`. */ + alg: Alg; + /** Curve that the key pair is derived from. The only allowed value is `Ed25519`. */ + crv: Crv; + /** Key id */ + kid: Scalars['String']['output']; + /** Key type. The only allowed value is `OKP`. */ + kty: Kty; + /** Base64 url-encoded public key. */ + x: Scalars['String']['output']; +}; + +export type JwkInput = { + /** Cryptographic algorithm family used with the key. The only allowed value is `EdDSA`. */ + alg: Alg; + /** Curve that the key pair is derived from. The only allowed value is `Ed25519`. */ + crv: Crv; + /** Key id */ + kid: Scalars['String']['input']; + /** Key type. The only allowed value is `OKP`. */ + kty: Kty; + /** Base64 url-encoded public key. */ + x: Scalars['String']['input']; +}; + +export enum Kty { + Okp = 'OKP' +} + +export enum LiquidityError { + AlreadyPosted = 'AlreadyPosted', + AlreadyVoided = 'AlreadyVoided', + AmountZero = 'AmountZero', + InsufficientBalance = 'InsufficientBalance', + InvalidId = 'InvalidId', + TransferExists = 'TransferExists', + UnknownAsset = 'UnknownAsset', + UnknownIncomingPayment = 'UnknownIncomingPayment', + UnknownPayment = 'UnknownPayment', + UnknownPeer = 'UnknownPeer', + UnknownTransfer = 'UnknownTransfer', + UnknownWalletAddress = 'UnknownWalletAddress' +} + +export type LiquidityMutationResponse = MutationResponse & { + __typename?: 'LiquidityMutationResponse'; + code: Scalars['String']['output']; + error?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type Model = { + createdAt: Scalars['String']['output']; + id: Scalars['ID']['output']; +}; + +export type Mutation = { + __typename?: 'Mutation'; + /** Create an asset */ + createAsset: AssetMutationResponse; + /** Withdraw asset liquidity */ + createAssetLiquidityWithdrawal?: Maybe; + /** Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. */ + createIncomingPayment: IncomingPaymentResponse; + /** Create a peer using a URL */ + createOrUpdatePeerByUrl: CreateOrUpdatePeerByUrlMutationResponse; + /** Create an Open Payments Outgoing Payment */ + createOutgoingPayment: OutgoingPaymentResponse; + /** Create a peer */ + createPeer: CreatePeerMutationResponse; + /** Withdraw peer liquidity */ + createPeerLiquidityWithdrawal?: Maybe; + /** Create an Open Payments Quote */ + createQuote: QuoteResponse; + /** Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. */ + createReceiver: CreateReceiverResponse; + /** Create a wallet address */ + createWalletAddress: CreateWalletAddressMutationResponse; + /** Add a public key to a wallet address that is used to verify Open Payments requests. */ + createWalletAddressKey?: Maybe; + /** Withdraw liquidity from a wallet address received via Web Monetization. */ + createWalletAddressWithdrawal?: Maybe; + /** Delete a peer */ + deletePeer: DeletePeerMutationResponse; + /** Deposit asset liquidity */ + depositAssetLiquidity?: Maybe; + /** + * Deposit webhook event liquidity + * @deprecated Use `depositOutgoingPaymentLiquidity` + */ + depositEventLiquidity?: Maybe; + /** Deposit outgoing payment liquidity */ + depositOutgoingPaymentLiquidity?: Maybe; + /** Deposit peer liquidity */ + depositPeerLiquidity?: Maybe; + /** Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. */ + postLiquidityWithdrawal?: Maybe; + /** Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. */ + revokeWalletAddressKey?: Maybe; + /** Set the fee on an asset */ + setFee: SetFeeResponse; + /** If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. */ + triggerWalletAddressEvents: TriggerWalletAddressEventsMutationResponse; + /** Update an asset */ + updateAsset: AssetMutationResponse; + /** Update a peer */ + updatePeer: UpdatePeerMutationResponse; + /** Update a wallet address */ + updateWalletAddress: UpdateWalletAddressMutationResponse; + /** Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. */ + voidLiquidityWithdrawal?: Maybe; + /** + * Withdraw webhook event liquidity + * @deprecated Use `withdrawOutgoingPaymentLiquidity, withdrawIncomingPaymentLiquidity, or createWalletAddressWithdrawal` + */ + withdrawEventLiquidity?: Maybe; + /** Withdraw incoming payment liquidity */ + withdrawIncomingPaymentLiquidity?: Maybe; + /** Withdraw outgoing payment liquidity */ + withdrawOutgoingPaymentLiquidity?: Maybe; +}; + + +export type MutationCreateAssetArgs = { + input: CreateAssetInput; +}; + + +export type MutationCreateAssetLiquidityWithdrawalArgs = { + input: CreateAssetLiquidityWithdrawalInput; +}; + + +export type MutationCreateIncomingPaymentArgs = { + input: CreateIncomingPaymentInput; +}; + + +export type MutationCreateOrUpdatePeerByUrlArgs = { + input: CreateOrUpdatePeerByUrlInput; +}; + + +export type MutationCreateOutgoingPaymentArgs = { + input: CreateOutgoingPaymentInput; +}; + + +export type MutationCreatePeerArgs = { + input: CreatePeerInput; +}; + + +export type MutationCreatePeerLiquidityWithdrawalArgs = { + input: CreatePeerLiquidityWithdrawalInput; +}; + + +export type MutationCreateQuoteArgs = { + input: CreateQuoteInput; +}; + + +export type MutationCreateReceiverArgs = { + input: CreateReceiverInput; +}; + + +export type MutationCreateWalletAddressArgs = { + input: CreateWalletAddressInput; +}; + + +export type MutationCreateWalletAddressKeyArgs = { + input: CreateWalletAddressKeyInput; +}; + + +export type MutationCreateWalletAddressWithdrawalArgs = { + input: CreateWalletAddressWithdrawalInput; +}; + + +export type MutationDeletePeerArgs = { + input: DeletePeerInput; +}; + + +export type MutationDepositAssetLiquidityArgs = { + input: DepositAssetLiquidityInput; +}; + + +export type MutationDepositEventLiquidityArgs = { + input: DepositEventLiquidityInput; +}; + + +export type MutationDepositOutgoingPaymentLiquidityArgs = { + input: DepositOutgoingPaymentLiquidityInput; +}; + + +export type MutationDepositPeerLiquidityArgs = { + input: DepositPeerLiquidityInput; +}; + + +export type MutationPostLiquidityWithdrawalArgs = { + input: PostLiquidityWithdrawalInput; +}; + + +export type MutationRevokeWalletAddressKeyArgs = { + input: RevokeWalletAddressKeyInput; +}; + + +export type MutationSetFeeArgs = { + input: SetFeeInput; +}; + + +export type MutationTriggerWalletAddressEventsArgs = { + input: TriggerWalletAddressEventsInput; +}; + + +export type MutationUpdateAssetArgs = { + input: UpdateAssetInput; +}; + + +export type MutationUpdatePeerArgs = { + input: UpdatePeerInput; +}; + + +export type MutationUpdateWalletAddressArgs = { + input: UpdateWalletAddressInput; +}; + + +export type MutationVoidLiquidityWithdrawalArgs = { + input: VoidLiquidityWithdrawalInput; +}; + + +export type MutationWithdrawEventLiquidityArgs = { + input: WithdrawEventLiquidityInput; +}; + + +export type MutationWithdrawIncomingPaymentLiquidityArgs = { + input: WithdrawIncomingPaymentLiquidityInput; +}; + + +export type MutationWithdrawOutgoingPaymentLiquidityArgs = { + input: WithdrawOutgoingPaymentLiquidityInput; +}; + +export type MutationResponse = { + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type OutgoingPayment = BasePayment & Model & { + __typename?: 'OutgoingPayment'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Amount to send (fixed send) */ + debitAmount: Amount; + error?: Maybe; + /** Outgoing payment id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Additional metadata associated with the outgoing payment. */ + metadata?: Maybe; + /** Quote for this outgoing payment */ + quote?: Maybe; + /** Amount to receive (fixed receive) */ + receiveAmount: Amount; + /** Wallet address URL of the receiver */ + receiver: Scalars['String']['output']; + /** Amount already sent */ + sentAmount: Amount; + /** Outgoing payment state */ + state: OutgoingPaymentState; + stateAttempts: Scalars['Int']['output']; + /** Id of the wallet address under which this outgoing payment was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type OutgoingPaymentConnection = { + __typename?: 'OutgoingPaymentConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type OutgoingPaymentEdge = { + __typename?: 'OutgoingPaymentEdge'; + cursor: Scalars['String']['output']; + node: OutgoingPayment; +}; + +export type OutgoingPaymentResponse = { + __typename?: 'OutgoingPaymentResponse'; + code: Scalars['String']['output']; + message?: Maybe; + payment?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export enum OutgoingPaymentState { + /** Successful completion */ + Completed = 'COMPLETED', + /** Payment failed */ + Failed = 'FAILED', + /** Will transition to SENDING once payment funds are reserved */ + Funding = 'FUNDING', + /** Paying, will transition to COMPLETED on success */ + Sending = 'SENDING' +} + +export type PageInfo = { + __typename?: 'PageInfo'; + /** Paginating forwards: the cursor to continue. */ + endCursor?: Maybe; + /** Paginating forwards: Are there more pages? */ + hasNextPage: Scalars['Boolean']['output']; + /** Paginating backwards: Are there more pages? */ + hasPreviousPage: Scalars['Boolean']['output']; + /** Paginating backwards: the cursor to continue. */ + startCursor?: Maybe; +}; + +export type Payment = BasePayment & Model & { + __typename?: 'Payment'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Payment id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Additional metadata associated with the payment. */ + metadata?: Maybe; + /** Either the IncomingPaymentState or OutgoingPaymentState according to type */ + state: Scalars['String']['output']; + /** Type of payment */ + type: PaymentType; + /** Id of the wallet address under which this payment was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type PaymentConnection = { + __typename?: 'PaymentConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type PaymentEdge = { + __typename?: 'PaymentEdge'; + cursor: Scalars['String']['output']; + node: Payment; +}; + +export type PaymentFilter = { + type?: InputMaybe; + walletAddressId?: InputMaybe; +}; + +export enum PaymentType { + Incoming = 'INCOMING', + Outgoing = 'OUTGOING' +} + +export type Peer = Model & { + __typename?: 'Peer'; + /** Asset of peering relationship */ + asset: Asset; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Peering connection details */ + http: Http; + /** Peer id */ + id: Scalars['ID']['output']; + /** Available liquidity */ + liquidity?: Maybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value */ + liquidityThreshold?: Maybe; + /** Maximum packet amount that the peer accepts */ + maxPacketAmount?: Maybe; + /** Peer's public name */ + name?: Maybe; + /** Peer's ILP address */ + staticIlpAddress: Scalars['String']['output']; +}; + +export type PeerEdge = { + __typename?: 'PeerEdge'; + cursor: Scalars['String']['output']; + node: Peer; +}; + +export type PeersConnection = { + __typename?: 'PeersConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type PostLiquidityWithdrawalInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the liquidity withdrawal to post. */ + withdrawalId: Scalars['String']['input']; +}; + +export type Query = { + __typename?: 'Query'; + /** Fetch an asset */ + asset?: Maybe; + /** Fetch a page of assets. */ + assets: AssetsConnection; + /** Fetch an Open Payments incoming payment */ + incomingPayment?: Maybe; + /** Fetch an Open Payments outgoing payment */ + outgoingPayment?: Maybe; + /** Fetch a page of combined payments */ + payments: PaymentConnection; + /** Fetch a peer */ + peer?: Maybe; + /** Fetch a page of peers. */ + peers: PeersConnection; + /** Fetch an Open Payments quote */ + quote?: Maybe; + /** Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. */ + receiver?: Maybe; + /** Fetch a wallet address */ + walletAddress?: Maybe; + /** Fetch a page of wallet addresses. */ + walletAddresses: WalletAddressesConnection; + /** Fetch a page of webhook events */ + webhookEvents: WebhookEventsConnection; +}; + + +export type QueryAssetArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryAssetsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryIncomingPaymentArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryOutgoingPaymentArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryPaymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + filter?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryPeerArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryPeersArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryQuoteArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryReceiverArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryWalletAddressArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryWalletAddressesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type QueryWebhookEventsArgs = { + after?: InputMaybe; + before?: InputMaybe; + filter?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + +export type Quote = { + __typename?: 'Quote'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Amount to send (fixed send) */ + debitAmount: Amount; + /** Date-time of expiration */ + expiresAt: Scalars['String']['output']; + /** Upper bound of probed exchange rate */ + highEstimatedExchangeRate: Scalars['Float']['output']; + /** Quote id */ + id: Scalars['ID']['output']; + /** Lower bound of probed exchange rate */ + lowEstimatedExchangeRate: Scalars['Float']['output']; + /** Maximum value per packet allowed on the possible routes */ + maxPacketAmount: Scalars['UInt64']['output']; + /** Aggregate exchange rate the payment is guaranteed to meet */ + minExchangeRate: Scalars['Float']['output']; + /** Amount to receive (fixed receive) */ + receiveAmount: Amount; + /** Wallet address URL of the receiver */ + receiver: Scalars['String']['output']; + /** Id of the wallet address under which this quote was created */ + walletAddressId: Scalars['ID']['output']; +}; + +export type QuoteConnection = { + __typename?: 'QuoteConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type QuoteEdge = { + __typename?: 'QuoteEdge'; + cursor: Scalars['String']['output']; + node: Quote; +}; + +export type QuoteResponse = { + __typename?: 'QuoteResponse'; + code: Scalars['String']['output']; + message?: Maybe; + quote?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type Receiver = { + __typename?: 'Receiver'; + /** Describes whether the incoming payment has completed receiving funds. */ + completed: Scalars['Boolean']['output']; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Date-time of expiry. After this time, the incoming payment will accept further payments made to it. */ + expiresAt?: Maybe; + /** Incoming payment URL */ + id: Scalars['String']['output']; + /** The maximum amount that should be paid into the wallet address under this incoming payment. */ + incomingAmount?: Maybe; + /** Additional metadata associated with the incoming payment. */ + metadata?: Maybe; + /** The total amount that has been paid into the wallet address under this incoming payment. */ + receivedAmount: Amount; + /** Date-time of last update */ + updatedAt: Scalars['String']['output']; + /** Wallet address URL under which the incoming payment was created */ + walletAddressUrl: Scalars['String']['output']; +}; + +export type RevokeWalletAddressKeyInput = { + /** Internal id of key */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; +}; + +export type RevokeWalletAddressKeyMutationResponse = MutationResponse & { + __typename?: 'RevokeWalletAddressKeyMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddressKey?: Maybe; +}; + +export type SetFeeInput = { + /** Asset id to add the fee to */ + assetId: Scalars['ID']['input']; + /** Fee values */ + fee: FeeDetails; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Type of fee (sending or receiving) */ + type: FeeType; +}; + +export type SetFeeResponse = MutationResponse & { + __typename?: 'SetFeeResponse'; + code: Scalars['String']['output']; + fee?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export enum SortOrder { + /** Choose ascending order for results. */ + Asc = 'ASC', + /** Choose descending order for results. */ + Desc = 'DESC' +} + +export type TransferMutationResponse = MutationResponse & { + __typename?: 'TransferMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type TriggerWalletAddressEventsInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Maximum number of events being triggered (n). */ + limit: Scalars['Int']['input']; +}; + +export type TriggerWalletAddressEventsMutationResponse = MutationResponse & { + __typename?: 'TriggerWalletAddressEventsMutationResponse'; + code: Scalars['String']['output']; + /** Number of events triggered */ + count?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; +}; + +export type UpdateAssetInput = { + /** Asset id */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value */ + liquidityThreshold?: InputMaybe; + /** New minimum amount of liquidity that can be withdrawn from the asset */ + withdrawalThreshold?: InputMaybe; +}; + +export type UpdatePeerInput = { + /** New peering connection details */ + http?: InputMaybe; + /** Peer id */ + id: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value */ + liquidityThreshold?: InputMaybe; + /** New maximum packet amount that the peer accepts */ + maxPacketAmount?: InputMaybe; + /** Peer's new public name */ + name?: InputMaybe; + /** Peer's new ILP address */ + staticIlpAddress?: InputMaybe; +}; + +export type UpdatePeerMutationResponse = MutationResponse & { + __typename?: 'UpdatePeerMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + peer?: Maybe; + success: Scalars['Boolean']['output']; +}; + +export type UpdateWalletAddressInput = { + /** ID of wallet address to update */ + id: Scalars['ID']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey?: InputMaybe; + /** New public name for wallet address */ + publicName?: InputMaybe; + /** New status to set the wallet address to */ + status?: InputMaybe; +}; + +export type UpdateWalletAddressMutationResponse = MutationResponse & { + __typename?: 'UpdateWalletAddressMutationResponse'; + code: Scalars['String']['output']; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + walletAddress?: Maybe; +}; + +export type VoidLiquidityWithdrawalInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the liquidity withdrawal to void. */ + withdrawalId: Scalars['String']['input']; +}; + +export type WalletAddress = Model & { + __typename?: 'WalletAddress'; + /** Asset of the wallet address */ + asset: Asset; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Wallet address id */ + id: Scalars['ID']['output']; + /** List of incoming payments received by this wallet address */ + incomingPayments?: Maybe; + /** Available liquidity */ + liquidity?: Maybe; + /** List of outgoing payments sent from this wallet address */ + outgoingPayments?: Maybe; + /** Public name associated with the wallet address */ + publicName?: Maybe; + /** List of quotes created at this wallet address */ + quotes?: Maybe; + /** Status of the wallet address */ + status: WalletAddressStatus; + /** Wallet Address URL */ + url: Scalars['String']['output']; +}; + + +export type WalletAddressIncomingPaymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type WalletAddressOutgoingPaymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + + +export type WalletAddressQuotesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + sortOrder?: InputMaybe; +}; + +export type WalletAddressEdge = { + __typename?: 'WalletAddressEdge'; + cursor: Scalars['String']['output']; + node: WalletAddress; +}; + +export type WalletAddressKey = Model & { + __typename?: 'WalletAddressKey'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Internal id of key */ + id: Scalars['ID']['output']; + /** Public key */ + jwk: Jwk; + /** Indicator whether the key has been revoked */ + revoked: Scalars['Boolean']['output']; + /** Id of the wallet address to which this key belongs to */ + walletAddressId: Scalars['ID']['output']; +}; + +export enum WalletAddressStatus { + /** Default status */ + Active = 'ACTIVE', + /** Status after deactivating */ + Inactive = 'INACTIVE' +} + +export type WalletAddressWithdrawal = { + __typename?: 'WalletAddressWithdrawal'; + /** Amount to withdraw */ + amount: Scalars['UInt64']['output']; + /** Withdrawal Id */ + id: Scalars['ID']['output']; + /** Wallet address details */ + walletAddress: WalletAddress; +}; + +export type WalletAddressWithdrawalMutationResponse = MutationResponse & { + __typename?: 'WalletAddressWithdrawalMutationResponse'; + code: Scalars['String']['output']; + error?: Maybe; + message: Scalars['String']['output']; + success: Scalars['Boolean']['output']; + withdrawal?: Maybe; +}; + +export type WalletAddressesConnection = { + __typename?: 'WalletAddressesConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type WebhookEvent = Model & { + __typename?: 'WebhookEvent'; + /** Date-time of creation */ + createdAt: Scalars['String']['output']; + /** Stringified JSON data */ + data: Scalars['JSONObject']['output']; + /** Event id */ + id: Scalars['ID']['output']; + /** Type of event */ + type: Scalars['String']['output']; +}; + +export type WebhookEventFilter = { + type?: InputMaybe; +}; + +export type WebhookEventsConnection = { + __typename?: 'WebhookEventsConnection'; + edges: Array; + pageInfo: PageInfo; +}; + +export type WebhookEventsEdge = { + __typename?: 'WebhookEventsEdge'; + cursor: Scalars['String']['output']; + node: WebhookEvent; +}; + +export type WithdrawEventLiquidityInput = { + /** The id of the event to withdraw from. */ + eventId: Scalars['String']['input']; + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; +}; + +export type WithdrawIncomingPaymentLiquidityInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the incoming payment to withdraw from. */ + incomingPaymentId: Scalars['String']['input']; +}; + +export type WithdrawOutgoingPaymentLiquidityInput = { + /** Unique key to ensure duplicate or retried requests are processed only once. See [idempotence](https://en.wikipedia.org/wiki/Idempotence) */ + idempotencyKey: Scalars['String']['input']; + /** The id of the outgoing payment to withdraw from. */ + outgoingPaymentId: Scalars['String']['input']; +}; + + + +export type ResolverTypeWrapper = Promise | T; + + +export type ResolverWithResolve = { + resolve: ResolverFn; +}; +export type Resolver = ResolverFn | ResolverWithResolve; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterable | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + + +/** Mapping of interface types */ +export type ResolversInterfaceTypes> = { + BasePayment: ( Partial ) | ( Partial ) | ( Partial ); + Model: ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ); + MutationResponse: ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ) | ( Partial ); +}; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + Alg: ResolverTypeWrapper>; + Amount: ResolverTypeWrapper>; + AmountInput: ResolverTypeWrapper>; + Asset: ResolverTypeWrapper>; + AssetEdge: ResolverTypeWrapper>; + AssetMutationResponse: ResolverTypeWrapper>; + AssetsConnection: ResolverTypeWrapper>; + BasePayment: ResolverTypeWrapper['BasePayment']>; + Boolean: ResolverTypeWrapper>; + CreateAssetInput: ResolverTypeWrapper>; + CreateAssetLiquidityWithdrawalInput: ResolverTypeWrapper>; + CreateIncomingPaymentInput: ResolverTypeWrapper>; + CreateOrUpdatePeerByUrlInput: ResolverTypeWrapper>; + CreateOrUpdatePeerByUrlMutationResponse: ResolverTypeWrapper>; + CreateOutgoingPaymentInput: ResolverTypeWrapper>; + CreatePeerInput: ResolverTypeWrapper>; + CreatePeerLiquidityWithdrawalInput: ResolverTypeWrapper>; + CreatePeerMutationResponse: ResolverTypeWrapper>; + CreateQuoteInput: ResolverTypeWrapper>; + CreateReceiverInput: ResolverTypeWrapper>; + CreateReceiverResponse: ResolverTypeWrapper>; + CreateWalletAddressInput: ResolverTypeWrapper>; + CreateWalletAddressKeyInput: ResolverTypeWrapper>; + CreateWalletAddressKeyMutationResponse: ResolverTypeWrapper>; + CreateWalletAddressMutationResponse: ResolverTypeWrapper>; + CreateWalletAddressWithdrawalInput: ResolverTypeWrapper>; + Crv: ResolverTypeWrapper>; + DeletePeerInput: ResolverTypeWrapper>; + DeletePeerMutationResponse: ResolverTypeWrapper>; + DepositAssetLiquidityInput: ResolverTypeWrapper>; + DepositEventLiquidityInput: ResolverTypeWrapper>; + DepositOutgoingPaymentLiquidityInput: ResolverTypeWrapper>; + DepositPeerLiquidityInput: ResolverTypeWrapper>; + Fee: ResolverTypeWrapper>; + FeeDetails: ResolverTypeWrapper>; + FeeEdge: ResolverTypeWrapper>; + FeeType: ResolverTypeWrapper>; + FeesConnection: ResolverTypeWrapper>; + FilterString: ResolverTypeWrapper>; + Float: ResolverTypeWrapper>; + Http: ResolverTypeWrapper>; + HttpIncomingInput: ResolverTypeWrapper>; + HttpInput: ResolverTypeWrapper>; + HttpOutgoing: ResolverTypeWrapper>; + HttpOutgoingInput: ResolverTypeWrapper>; + ID: ResolverTypeWrapper>; + IncomingPayment: ResolverTypeWrapper>; + IncomingPaymentConnection: ResolverTypeWrapper>; + IncomingPaymentEdge: ResolverTypeWrapper>; + IncomingPaymentResponse: ResolverTypeWrapper>; + IncomingPaymentState: ResolverTypeWrapper>; + Int: ResolverTypeWrapper>; + JSONObject: ResolverTypeWrapper>; + Jwk: ResolverTypeWrapper>; + JwkInput: ResolverTypeWrapper>; + Kty: ResolverTypeWrapper>; + LiquidityError: ResolverTypeWrapper>; + LiquidityMutationResponse: ResolverTypeWrapper>; + Model: ResolverTypeWrapper['Model']>; + Mutation: ResolverTypeWrapper<{}>; + MutationResponse: ResolverTypeWrapper['MutationResponse']>; + OutgoingPayment: ResolverTypeWrapper>; + OutgoingPaymentConnection: ResolverTypeWrapper>; + OutgoingPaymentEdge: ResolverTypeWrapper>; + OutgoingPaymentResponse: ResolverTypeWrapper>; + OutgoingPaymentState: ResolverTypeWrapper>; + PageInfo: ResolverTypeWrapper>; + Payment: ResolverTypeWrapper>; + PaymentConnection: ResolverTypeWrapper>; + PaymentEdge: ResolverTypeWrapper>; + PaymentFilter: ResolverTypeWrapper>; + PaymentType: ResolverTypeWrapper>; + Peer: ResolverTypeWrapper>; + PeerEdge: ResolverTypeWrapper>; + PeersConnection: ResolverTypeWrapper>; + PostLiquidityWithdrawalInput: ResolverTypeWrapper>; + Query: ResolverTypeWrapper<{}>; + Quote: ResolverTypeWrapper>; + QuoteConnection: ResolverTypeWrapper>; + QuoteEdge: ResolverTypeWrapper>; + QuoteResponse: ResolverTypeWrapper>; + Receiver: ResolverTypeWrapper>; + RevokeWalletAddressKeyInput: ResolverTypeWrapper>; + RevokeWalletAddressKeyMutationResponse: ResolverTypeWrapper>; + SetFeeInput: ResolverTypeWrapper>; + SetFeeResponse: ResolverTypeWrapper>; + SortOrder: ResolverTypeWrapper>; + String: ResolverTypeWrapper>; + TransferMutationResponse: ResolverTypeWrapper>; + TriggerWalletAddressEventsInput: ResolverTypeWrapper>; + TriggerWalletAddressEventsMutationResponse: ResolverTypeWrapper>; + UInt8: ResolverTypeWrapper>; + UInt64: ResolverTypeWrapper>; + UpdateAssetInput: ResolverTypeWrapper>; + UpdatePeerInput: ResolverTypeWrapper>; + UpdatePeerMutationResponse: ResolverTypeWrapper>; + UpdateWalletAddressInput: ResolverTypeWrapper>; + UpdateWalletAddressMutationResponse: ResolverTypeWrapper>; + VoidLiquidityWithdrawalInput: ResolverTypeWrapper>; + WalletAddress: ResolverTypeWrapper>; + WalletAddressEdge: ResolverTypeWrapper>; + WalletAddressKey: ResolverTypeWrapper>; + WalletAddressStatus: ResolverTypeWrapper>; + WalletAddressWithdrawal: ResolverTypeWrapper>; + WalletAddressWithdrawalMutationResponse: ResolverTypeWrapper>; + WalletAddressesConnection: ResolverTypeWrapper>; + WebhookEvent: ResolverTypeWrapper>; + WebhookEventFilter: ResolverTypeWrapper>; + WebhookEventsConnection: ResolverTypeWrapper>; + WebhookEventsEdge: ResolverTypeWrapper>; + WithdrawEventLiquidityInput: ResolverTypeWrapper>; + WithdrawIncomingPaymentLiquidityInput: ResolverTypeWrapper>; + WithdrawOutgoingPaymentLiquidityInput: ResolverTypeWrapper>; +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + Amount: Partial; + AmountInput: Partial; + Asset: Partial; + AssetEdge: Partial; + AssetMutationResponse: Partial; + AssetsConnection: Partial; + BasePayment: ResolversInterfaceTypes['BasePayment']; + Boolean: Partial; + CreateAssetInput: Partial; + CreateAssetLiquidityWithdrawalInput: Partial; + CreateIncomingPaymentInput: Partial; + CreateOrUpdatePeerByUrlInput: Partial; + CreateOrUpdatePeerByUrlMutationResponse: Partial; + CreateOutgoingPaymentInput: Partial; + CreatePeerInput: Partial; + CreatePeerLiquidityWithdrawalInput: Partial; + CreatePeerMutationResponse: Partial; + CreateQuoteInput: Partial; + CreateReceiverInput: Partial; + CreateReceiverResponse: Partial; + CreateWalletAddressInput: Partial; + CreateWalletAddressKeyInput: Partial; + CreateWalletAddressKeyMutationResponse: Partial; + CreateWalletAddressMutationResponse: Partial; + CreateWalletAddressWithdrawalInput: Partial; + DeletePeerInput: Partial; + DeletePeerMutationResponse: Partial; + DepositAssetLiquidityInput: Partial; + DepositEventLiquidityInput: Partial; + DepositOutgoingPaymentLiquidityInput: Partial; + DepositPeerLiquidityInput: Partial; + Fee: Partial; + FeeDetails: Partial; + FeeEdge: Partial; + FeesConnection: Partial; + FilterString: Partial; + Float: Partial; + Http: Partial; + HttpIncomingInput: Partial; + HttpInput: Partial; + HttpOutgoing: Partial; + HttpOutgoingInput: Partial; + ID: Partial; + IncomingPayment: Partial; + IncomingPaymentConnection: Partial; + IncomingPaymentEdge: Partial; + IncomingPaymentResponse: Partial; + Int: Partial; + JSONObject: Partial; + Jwk: Partial; + JwkInput: Partial; + LiquidityMutationResponse: Partial; + Model: ResolversInterfaceTypes['Model']; + Mutation: {}; + MutationResponse: ResolversInterfaceTypes['MutationResponse']; + OutgoingPayment: Partial; + OutgoingPaymentConnection: Partial; + OutgoingPaymentEdge: Partial; + OutgoingPaymentResponse: Partial; + PageInfo: Partial; + Payment: Partial; + PaymentConnection: Partial; + PaymentEdge: Partial; + PaymentFilter: Partial; + Peer: Partial; + PeerEdge: Partial; + PeersConnection: Partial; + PostLiquidityWithdrawalInput: Partial; + Query: {}; + Quote: Partial; + QuoteConnection: Partial; + QuoteEdge: Partial; + QuoteResponse: Partial; + Receiver: Partial; + RevokeWalletAddressKeyInput: Partial; + RevokeWalletAddressKeyMutationResponse: Partial; + SetFeeInput: Partial; + SetFeeResponse: Partial; + String: Partial; + TransferMutationResponse: Partial; + TriggerWalletAddressEventsInput: Partial; + TriggerWalletAddressEventsMutationResponse: Partial; + UInt8: Partial; + UInt64: Partial; + UpdateAssetInput: Partial; + UpdatePeerInput: Partial; + UpdatePeerMutationResponse: Partial; + UpdateWalletAddressInput: Partial; + UpdateWalletAddressMutationResponse: Partial; + VoidLiquidityWithdrawalInput: Partial; + WalletAddress: Partial; + WalletAddressEdge: Partial; + WalletAddressKey: Partial; + WalletAddressWithdrawal: Partial; + WalletAddressWithdrawalMutationResponse: Partial; + WalletAddressesConnection: Partial; + WebhookEvent: Partial; + WebhookEventFilter: Partial; + WebhookEventsConnection: Partial; + WebhookEventsEdge: Partial; + WithdrawEventLiquidityInput: Partial; + WithdrawIncomingPaymentLiquidityInput: Partial; + WithdrawOutgoingPaymentLiquidityInput: Partial; +}; + +export type AmountResolvers = { + assetCode?: Resolver; + assetScale?: Resolver; + value?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetResolvers = { + code?: Resolver; + createdAt?: Resolver; + fees?: Resolver, ParentType, ContextType, Partial>; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + liquidityThreshold?: Resolver, ParentType, ContextType>; + receivingFee?: Resolver, ParentType, ContextType>; + scale?: Resolver; + sendingFee?: Resolver, ParentType, ContextType>; + withdrawalThreshold?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetMutationResponseResolvers = { + asset?: Resolver, ParentType, ContextType>; + code?: Resolver; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AssetsConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BasePaymentResolvers = { + __resolveType: TypeResolveFn<'IncomingPayment' | 'OutgoingPayment' | 'Payment', ParentType, ContextType>; + createdAt?: Resolver; + id?: Resolver; + metadata?: Resolver, ParentType, ContextType>; + walletAddressId?: Resolver; +}; + +export type CreateOrUpdatePeerByUrlMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + peer?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreatePeerMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + peer?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateReceiverResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + receiver?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateWalletAddressKeyMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddressKey?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateWalletAddressMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddress?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DeletePeerMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeeResolvers = { + assetId?: Resolver; + basisPoints?: Resolver; + createdAt?: Resolver; + fixed?: Resolver; + id?: Resolver; + type?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeeEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeesConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type HttpResolvers = { + outgoing?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type HttpOutgoingResolvers = { + authToken?: Resolver; + endpoint?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentResolvers = { + createdAt?: Resolver; + expiresAt?: Resolver; + id?: Resolver; + incomingAmount?: Resolver, ParentType, ContextType>; + liquidity?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + receivedAmount?: Resolver; + state?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IncomingPaymentResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + payment?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig { + name: 'JSONObject'; +} + +export type JwkResolvers = { + alg?: Resolver; + crv?: Resolver; + kid?: Resolver; + kty?: Resolver; + x?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LiquidityMutationResponseResolvers = { + code?: Resolver; + error?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ModelResolvers = { + __resolveType: TypeResolveFn<'Asset' | 'Fee' | 'IncomingPayment' | 'OutgoingPayment' | 'Payment' | 'Peer' | 'WalletAddress' | 'WalletAddressKey' | 'WebhookEvent', ParentType, ContextType>; + createdAt?: Resolver; + id?: Resolver; +}; + +export type MutationResolvers = { + createAsset?: Resolver>; + createAssetLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + createIncomingPayment?: Resolver>; + createOrUpdatePeerByUrl?: Resolver>; + createOutgoingPayment?: Resolver>; + createPeer?: Resolver>; + createPeerLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + createQuote?: Resolver>; + createReceiver?: Resolver>; + createWalletAddress?: Resolver>; + createWalletAddressKey?: Resolver, ParentType, ContextType, RequireFields>; + createWalletAddressWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + deletePeer?: Resolver>; + depositAssetLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + depositEventLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + depositOutgoingPaymentLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + depositPeerLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + postLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + revokeWalletAddressKey?: Resolver, ParentType, ContextType, RequireFields>; + setFee?: Resolver>; + triggerWalletAddressEvents?: Resolver>; + updateAsset?: Resolver>; + updatePeer?: Resolver>; + updateWalletAddress?: Resolver>; + voidLiquidityWithdrawal?: Resolver, ParentType, ContextType, RequireFields>; + withdrawEventLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + withdrawIncomingPaymentLiquidity?: Resolver, ParentType, ContextType, RequireFields>; + withdrawOutgoingPaymentLiquidity?: Resolver, ParentType, ContextType, RequireFields>; +}; + +export type MutationResponseResolvers = { + __resolveType: TypeResolveFn<'AssetMutationResponse' | 'CreateOrUpdatePeerByUrlMutationResponse' | 'CreatePeerMutationResponse' | 'CreateWalletAddressKeyMutationResponse' | 'CreateWalletAddressMutationResponse' | 'DeletePeerMutationResponse' | 'LiquidityMutationResponse' | 'RevokeWalletAddressKeyMutationResponse' | 'SetFeeResponse' | 'TransferMutationResponse' | 'TriggerWalletAddressEventsMutationResponse' | 'UpdatePeerMutationResponse' | 'UpdateWalletAddressMutationResponse' | 'WalletAddressWithdrawalMutationResponse', ParentType, ContextType>; + code?: Resolver; + message?: Resolver; + success?: Resolver; +}; + +export type OutgoingPaymentResolvers = { + createdAt?: Resolver; + debitAmount?: Resolver; + error?: Resolver, ParentType, ContextType>; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + quote?: Resolver, ParentType, ContextType>; + receiveAmount?: Resolver; + receiver?: Resolver; + sentAmount?: Resolver; + state?: Resolver; + stateAttempts?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OutgoingPaymentConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OutgoingPaymentEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OutgoingPaymentResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + payment?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PageInfoResolvers = { + endCursor?: Resolver, ParentType, ContextType>; + hasNextPage?: Resolver; + hasPreviousPage?: Resolver; + startCursor?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PaymentResolvers = { + createdAt?: Resolver; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + state?: Resolver; + type?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PaymentConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PaymentEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PeerResolvers = { + asset?: Resolver; + createdAt?: Resolver; + http?: Resolver; + id?: Resolver; + liquidity?: Resolver, ParentType, ContextType>; + liquidityThreshold?: Resolver, ParentType, ContextType>; + maxPacketAmount?: Resolver, ParentType, ContextType>; + name?: Resolver, ParentType, ContextType>; + staticIlpAddress?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PeerEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PeersConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryResolvers = { + asset?: Resolver, ParentType, ContextType, RequireFields>; + assets?: Resolver>; + incomingPayment?: Resolver, ParentType, ContextType, RequireFields>; + outgoingPayment?: Resolver, ParentType, ContextType, RequireFields>; + payments?: Resolver>; + peer?: Resolver, ParentType, ContextType, RequireFields>; + peers?: Resolver>; + quote?: Resolver, ParentType, ContextType, RequireFields>; + receiver?: Resolver, ParentType, ContextType, RequireFields>; + walletAddress?: Resolver, ParentType, ContextType, RequireFields>; + walletAddresses?: Resolver>; + webhookEvents?: Resolver>; +}; + +export type QuoteResolvers = { + createdAt?: Resolver; + debitAmount?: Resolver; + expiresAt?: Resolver; + highEstimatedExchangeRate?: Resolver; + id?: Resolver; + lowEstimatedExchangeRate?: Resolver; + maxPacketAmount?: Resolver; + minExchangeRate?: Resolver; + receiveAmount?: Resolver; + receiver?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuoteConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuoteEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuoteResponseResolvers = { + code?: Resolver; + message?: Resolver, ParentType, ContextType>; + quote?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ReceiverResolvers = { + completed?: Resolver; + createdAt?: Resolver; + expiresAt?: Resolver, ParentType, ContextType>; + id?: Resolver; + incomingAmount?: Resolver, ParentType, ContextType>; + metadata?: Resolver, ParentType, ContextType>; + receivedAmount?: Resolver; + updatedAt?: Resolver; + walletAddressUrl?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RevokeWalletAddressKeyMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddressKey?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SetFeeResponseResolvers = { + code?: Resolver; + fee?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransferMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TriggerWalletAddressEventsMutationResponseResolvers = { + code?: Resolver; + count?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface UInt8ScalarConfig extends GraphQLScalarTypeConfig { + name: 'UInt8'; +} + +export interface UInt64ScalarConfig extends GraphQLScalarTypeConfig { + name: 'UInt64'; +} + +export type UpdatePeerMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + peer?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UpdateWalletAddressMutationResponseResolvers = { + code?: Resolver; + message?: Resolver; + success?: Resolver; + walletAddress?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressResolvers = { + asset?: Resolver; + createdAt?: Resolver; + id?: Resolver; + incomingPayments?: Resolver, ParentType, ContextType, Partial>; + liquidity?: Resolver, ParentType, ContextType>; + outgoingPayments?: Resolver, ParentType, ContextType, Partial>; + publicName?: Resolver, ParentType, ContextType>; + quotes?: Resolver, ParentType, ContextType, Partial>; + status?: Resolver; + url?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressKeyResolvers = { + createdAt?: Resolver; + id?: Resolver; + jwk?: Resolver; + revoked?: Resolver; + walletAddressId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressWithdrawalResolvers = { + amount?: Resolver; + id?: Resolver; + walletAddress?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressWithdrawalMutationResponseResolvers = { + code?: Resolver; + error?: Resolver, ParentType, ContextType>; + message?: Resolver; + success?: Resolver; + withdrawal?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WalletAddressesConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookEventResolvers = { + createdAt?: Resolver; + data?: Resolver; + id?: Resolver; + type?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookEventsConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookEventsEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type Resolvers = { + Amount?: AmountResolvers; + Asset?: AssetResolvers; + AssetEdge?: AssetEdgeResolvers; + AssetMutationResponse?: AssetMutationResponseResolvers; + AssetsConnection?: AssetsConnectionResolvers; + BasePayment?: BasePaymentResolvers; + CreateOrUpdatePeerByUrlMutationResponse?: CreateOrUpdatePeerByUrlMutationResponseResolvers; + CreatePeerMutationResponse?: CreatePeerMutationResponseResolvers; + CreateReceiverResponse?: CreateReceiverResponseResolvers; + CreateWalletAddressKeyMutationResponse?: CreateWalletAddressKeyMutationResponseResolvers; + CreateWalletAddressMutationResponse?: CreateWalletAddressMutationResponseResolvers; + DeletePeerMutationResponse?: DeletePeerMutationResponseResolvers; + Fee?: FeeResolvers; + FeeEdge?: FeeEdgeResolvers; + FeesConnection?: FeesConnectionResolvers; + Http?: HttpResolvers; + HttpOutgoing?: HttpOutgoingResolvers; + IncomingPayment?: IncomingPaymentResolvers; + IncomingPaymentConnection?: IncomingPaymentConnectionResolvers; + IncomingPaymentEdge?: IncomingPaymentEdgeResolvers; + IncomingPaymentResponse?: IncomingPaymentResponseResolvers; + JSONObject?: GraphQLScalarType; + Jwk?: JwkResolvers; + LiquidityMutationResponse?: LiquidityMutationResponseResolvers; + Model?: ModelResolvers; + Mutation?: MutationResolvers; + MutationResponse?: MutationResponseResolvers; + OutgoingPayment?: OutgoingPaymentResolvers; + OutgoingPaymentConnection?: OutgoingPaymentConnectionResolvers; + OutgoingPaymentEdge?: OutgoingPaymentEdgeResolvers; + OutgoingPaymentResponse?: OutgoingPaymentResponseResolvers; + PageInfo?: PageInfoResolvers; + Payment?: PaymentResolvers; + PaymentConnection?: PaymentConnectionResolvers; + PaymentEdge?: PaymentEdgeResolvers; + Peer?: PeerResolvers; + PeerEdge?: PeerEdgeResolvers; + PeersConnection?: PeersConnectionResolvers; + Query?: QueryResolvers; + Quote?: QuoteResolvers; + QuoteConnection?: QuoteConnectionResolvers; + QuoteEdge?: QuoteEdgeResolvers; + QuoteResponse?: QuoteResponseResolvers; + Receiver?: ReceiverResolvers; + RevokeWalletAddressKeyMutationResponse?: RevokeWalletAddressKeyMutationResponseResolvers; + SetFeeResponse?: SetFeeResponseResolvers; + TransferMutationResponse?: TransferMutationResponseResolvers; + TriggerWalletAddressEventsMutationResponse?: TriggerWalletAddressEventsMutationResponseResolvers; + UInt8?: GraphQLScalarType; + UInt64?: GraphQLScalarType; + UpdatePeerMutationResponse?: UpdatePeerMutationResponseResolvers; + UpdateWalletAddressMutationResponse?: UpdateWalletAddressMutationResponseResolvers; + WalletAddress?: WalletAddressResolvers; + WalletAddressEdge?: WalletAddressEdgeResolvers; + WalletAddressKey?: WalletAddressKeyResolvers; + WalletAddressWithdrawal?: WalletAddressWithdrawalResolvers; + WalletAddressWithdrawalMutationResponse?: WalletAddressWithdrawalMutationResponseResolvers; + WalletAddressesConnection?: WalletAddressesConnectionResolvers; + WebhookEvent?: WebhookEventResolvers; + WebhookEventsConnection?: WebhookEventsConnectionResolvers; + WebhookEventsEdge?: WebhookEventsEdgeResolvers; +}; + From e29b58cc2a9c8c4cb0a233baee90dcc889200ae4 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:51:36 -0400 Subject: [PATCH 30/53] chore: rm old comment --- pnpm-workspace.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 03b3e60a56..015ee3f2f8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,4 @@ packages: - 'packages/*' - 'localenv/mock-account-servicing-entity' - # exclude packages that are inside test directories - 'test/integration' From 187df0bce78166c5e3c81f279e2a20224b195208 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:58:24 -0400 Subject: [PATCH 31/53] chore: use latest http-singature-utils to match other deps --- packages/mock-account-servicing-lib/package.json | 2 +- pnpm-lock.yaml | 16 ++++------------ test/integration/package.json | 2 +- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/packages/mock-account-servicing-lib/package.json b/packages/mock-account-servicing-lib/package.json index a8a0431b2a..fb4c26a704 100644 --- a/packages/mock-account-servicing-lib/package.json +++ b/packages/mock-account-servicing-lib/package.json @@ -17,7 +17,7 @@ "@types/uuid": "^9.0.8" }, "dependencies": { - "@interledger/http-signature-utils": "2.0.0", + "@interledger/http-signature-utils": "2.0.2", "graphql": "^16.8.1", "uuid": "^9.0.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 349dfde395..32334a6792 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -571,8 +571,8 @@ importers: packages/mock-account-servicing-lib: dependencies: '@interledger/http-signature-utils': - specifier: 2.0.0 - version: 2.0.0 + specifier: 2.0.2 + version: 2.0.2 graphql: specifier: ^16.8.1 version: 16.8.1 @@ -618,8 +618,8 @@ importers: specifier: ^3.8.10 version: 3.9.6(@types/react@18.2.64)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@interledger/http-signature-utils': - specifier: 2.0.0 - version: 2.0.0 + specifier: 2.0.2 + version: 2.0.2 '@interledger/open-payments': specifier: ^6.7.1 version: 6.7.1 @@ -3533,14 +3533,6 @@ packages: - supports-color dev: false - /@interledger/http-signature-utils@2.0.0: - resolution: {integrity: sha512-zJTuTzkb9Y8ZJe8L0KcYnRtha8KyrYVpdM0FLL3HEOscWXRNrYC75IkJLzeTZnjzog77q9DT9PmxLitHuPl8iQ==} - dependencies: - http-message-signatures: 0.1.2 - httpbis-digest-headers: 1.0.0 - jose: 4.13.1 - uuid: 9.0.1 - /@interledger/http-signature-utils@2.0.2: resolution: {integrity: sha512-gTAPFMt7xwG1zv1rbrltcZTAqOw/ZJwkVdnNjQzu5G9JTfvJQzS6pcpiVUej1cblpewotbOzosgdX00f93q9zA==} dependencies: diff --git a/test/integration/package.json b/test/integration/package.json index 1a129c06cf..a9dfa059ea 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -12,7 +12,7 @@ "license": "ISC", "devDependencies": { "@apollo/client": "^3.8.10", - "@interledger/http-signature-utils": "2.0.0", + "@interledger/http-signature-utils": "2.0.2", "@interledger/open-payments": "^6.7.1", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", From d9a425e333744228861eda811207d9ae4341fbdd Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:05:27 -0400 Subject: [PATCH 32/53] chore: pnpm i --- pnpm-lock.yaml | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32334a6792..00e0c7900b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5139,6 +5139,10 @@ packages: /@types/node@18.11.9: resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + /@types/node@18.18.5: + resolution: {integrity: sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==} + dev: true + /@types/node@18.19.19: resolution: {integrity: sha512-qqV6hSy9zACEhQUy5CEGeuXAZN0fNjqLWRIvOXOwdFYhFoKBiY08VKR5kgchr90+TitLVhpUEb54hk4bYaArUw==} dependencies: @@ -9545,6 +9549,7 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: true /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} @@ -10170,7 +10175,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -10222,7 +10227,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-buffer@2.0.5: @@ -10246,7 +10251,7 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-decimal@2.0.1: @@ -10346,7 +10351,7 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-number@7.0.0: @@ -10381,7 +10386,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-relative@1.0.0: @@ -10448,7 +10453,7 @@ packages: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} @@ -10783,7 +10788,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.19 + '@types/node': 18.18.5 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -16501,7 +16506,7 @@ packages: engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.5 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -16556,7 +16561,7 @@ packages: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /which-typed-array@1.1.14: resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} From 5c53d9ca1cedbca1bb8147ed4c693f005dc089ac Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:17:27 -0400 Subject: [PATCH 33/53] chore: use latest koa-bodyparser --- pnpm-lock.yaml | 17 ++++++++++++++--- test/integration/package.json | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00e0c7900b..54dd774324 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -623,6 +623,9 @@ importers: '@interledger/open-payments': specifier: ^6.7.1 version: 6.7.1 + '@koa/bodyparser': + specifier: ^5.0.0 + version: 5.0.0 '@types/koa': specifier: 2.14.0 version: 2.14.0 @@ -641,9 +644,6 @@ importers: koa: specifier: ^2.15.0 version: 2.15.0 - koa-bodyparser: - specifier: ^4.4.1 - version: 4.4.1 mock-account-servicing-lib: specifier: workspace:* version: link:../../packages/mock-account-servicing-lib @@ -3918,6 +3918,15 @@ packages: resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} dev: true + /@koa/bodyparser@5.0.0: + resolution: {integrity: sha512-JEiZVe2e85qPOqA+Nw/SJC5fkFw3XSekh0RSoqz5F6lFYuhEspgqAb972rQRCJesv27QUsz96vU/Vb92wF1GUg==} + engines: {node: '>= 16'} + dependencies: + co-body: 6.1.0 + lodash.merge: 4.6.2 + type-is: 1.6.18 + dev: true + /@koa/cors@5.0.0: resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} @@ -7116,6 +7125,7 @@ packages: /copy-to@2.0.1: resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + dev: false /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -11326,6 +11336,7 @@ packages: co-body: 6.1.0 copy-to: 2.0.1 type-is: 1.6.18 + dev: false /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} diff --git a/test/integration/package.json b/test/integration/package.json index a9dfa059ea..ca6caaeaa0 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -20,7 +20,7 @@ "@types/uuid": "^9.0.8", "dotenv": "^16.4.1", "koa": "^2.15.0", - "koa-bodyparser": "^4.4.1", + "@koa/bodyparser": "^5.0.0", "mock-account-servicing-lib": "workspace:*", "uuid": "^9.0.1", "yaml": "^2.3.4" From d31290050e90d7e83fcf2a3b6d175529783356c4 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:53:30 -0400 Subject: [PATCH 34/53] chore: rm engine strict --- .npmrc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.npmrc b/.npmrc index f8b3d7defa..f87a044348 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ -auto-install-peers=true -engine-strict=true +auto-install-peers=true \ No newline at end of file From b33ca1ff1a7acdb8b4b3d5e84370b4856eb73d1b Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:41:42 -0400 Subject: [PATCH 35/53] chore: revert rm engine strict - fixes netlify ci failure but ultimately not the correct fix --- .npmrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.npmrc b/.npmrc index f87a044348..f8b3d7defa 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ -auto-install-peers=true \ No newline at end of file +auto-install-peers=true +engine-strict=true From 36fd545110badcaa66978def7425f9eae0208d80 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:18:19 -0400 Subject: [PATCH 36/53] chore(integration): dont ignore env, rm example env --- .gitignore | 1 + .../integration/testenv/cloud-nine-wallet/{.env.example => .env} | 0 test/integration/testenv/happy-life-bank/{.env.example => .env} | 0 3 files changed, 1 insertion(+) rename test/integration/testenv/cloud-nine-wallet/{.env.example => .env} (100%) rename test/integration/testenv/happy-life-bank/{.env.example => .env} (100%) diff --git a/.gitignore b/.gitignore index 2233bbad8b..01c2c69f51 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ build # Env variables .env +!test/**/.env # AWS Lambda *.zip diff --git a/test/integration/testenv/cloud-nine-wallet/.env.example b/test/integration/testenv/cloud-nine-wallet/.env similarity index 100% rename from test/integration/testenv/cloud-nine-wallet/.env.example rename to test/integration/testenv/cloud-nine-wallet/.env diff --git a/test/integration/testenv/happy-life-bank/.env.example b/test/integration/testenv/happy-life-bank/.env similarity index 100% rename from test/integration/testenv/happy-life-bank/.env.example rename to test/integration/testenv/happy-life-bank/.env From 366d02f7108f3fda419d4341de3dfd6bc3f3d678 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:56:40 -0400 Subject: [PATCH 37/53] refactor: use docker healthcheck for running tests --- scripts/run-integration-tests.sh | 30 +------------------ .../cloud-nine-wallet/docker-compose.yml | 7 ++++- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/scripts/run-integration-tests.sh b/scripts/run-integration-tests.sh index 8458a6d6dd..4e06c22ae4 100755 --- a/scripts/run-integration-tests.sh +++ b/scripts/run-integration-tests.sh @@ -6,7 +6,6 @@ # ./script.sh # Run the script with default options # ./script.sh --build # Re-build the docker images (-b or --build) -timeout=30 log_file="/tmp/rafiki_integration_logs.txt" build_flag="" @@ -25,34 +24,7 @@ while [[ $# -gt 0 ]]; do done pnpm --filter integration testenv:compose down --volumes -pnpm --filter integration testenv:compose up -d $build_flag +pnpm --filter integration testenv:compose up -d --wait $build_flag pnpm --filter integration testenv:compose logs -f --tail=0 > "$log_file" 2>&1 & - -# perform health check until OK, or errors if timeout. -function pollUrl() { - local url="$1" - local start_time=$(date +%s) - - while true; do - response=$(curl -s -o /dev/null -w "%{http_code}" "$url") - - if [ "$response" == "200" ]; then - echo "Health check successful! Response: OK" - break - fi - - current_time=$(date +%s) - elapsed_time=$((current_time - start_time)) - - if [ "$elapsed_time" -ge "$timeout" ]; then - echo "Timeout reached. Health check failed." - exit 1 - fi - - sleep 1 - done -} - -pollUrl "http://localhost:4000/healthz" pnpm --filter integration test pnpm --filter integration testenv:compose down --volumes diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index aa2d7ae53b..c846a6f06e 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -63,4 +63,9 @@ services: AUTH_PORT: 3006 ADMIN_PORT: 3003 depends_on: - - shared-database \ No newline at end of file + - shared-database + healthcheck: + test: ["CMD", "wget", "http://host.docker.internal:4000/healthz"] + interval: 5s + retries: 10 + timeout: 3s \ No newline at end of file From f85a80472a06e00241ae5503401b5a20473537e6 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Wed, 13 Mar 2024 14:03:19 -0400 Subject: [PATCH 38/53] chore: move healthcheck to last started docker container --- .../testenv/cloud-nine-wallet/docker-compose.yml | 7 +------ .../integration/testenv/happy-life-bank/docker-compose.yml | 5 +++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml index c846a6f06e..aa2d7ae53b 100644 --- a/test/integration/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/integration/testenv/cloud-nine-wallet/docker-compose.yml @@ -63,9 +63,4 @@ services: AUTH_PORT: 3006 ADMIN_PORT: 3003 depends_on: - - shared-database - healthcheck: - test: ["CMD", "wget", "http://host.docker.internal:4000/healthz"] - interval: 5s - retries: 10 - timeout: 3s \ No newline at end of file + - shared-database \ No newline at end of file diff --git a/test/integration/testenv/happy-life-bank/docker-compose.yml b/test/integration/testenv/happy-life-bank/docker-compose.yml index 69fa767131..cc15f65446 100644 --- a/test/integration/testenv/happy-life-bank/docker-compose.yml +++ b/test/integration/testenv/happy-life-bank/docker-compose.yml @@ -37,6 +37,11 @@ services: - ../private-key.pem:/workspace/private-key.pem depends_on: - cloud-nine-wallet-test-backend + healthcheck: + test: ["CMD", "wget", "http://localhost:4000/healthz"] + interval: 5s + retries: 10 + timeout: 3s happy-life-auth: hostname: happy-life-bank-test-auth image: rafiki-auth From 1320b988c18be9de8df2d00a43218a72734a2f64 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:46:29 -0400 Subject: [PATCH 39/53] feat: use latest open payments pkg, no body requird on continuation --- packages/auth/package.json | 2 +- packages/backend/package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- scripts/fetch-schemas.sh | 2 +- test/integration/integration.test.ts | 12 ++++-------- test/integration/package.json | 2 +- 6 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/auth/package.json b/packages/auth/package.json index 2e17a66b23..1071811724 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -26,7 +26,7 @@ "@graphql-tools/load": "^8.0.2", "@graphql-tools/schema": "^10.0.3", "@interledger/http-signature-utils": "2.0.2", - "@interledger/open-payments": "6.7.1", + "@interledger/open-payments": "6.7.2", "@interledger/openapi": "1.2.1", "@koa/cors": "^5.0.0", "@koa/router": "^12.0.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index f9332b4069..c796851e0a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -51,7 +51,7 @@ "@graphql-tools/load": "^8.0.2", "@graphql-tools/schema": "^10.0.3", "@interledger/http-signature-utils": "2.0.2", - "@interledger/open-payments": "6.7.1", + "@interledger/open-payments": "6.7.2", "@interledger/openapi": "1.2.1", "@interledger/pay": "0.4.0-alpha.9", "@interledger/stream-receiver": "^0.3.3-alpha.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54dd774324..dafa13ee37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,8 +133,8 @@ importers: specifier: 2.0.2 version: 2.0.2 '@interledger/open-payments': - specifier: 6.7.1 - version: 6.7.1 + specifier: 6.7.2 + version: 6.7.2 '@interledger/openapi': specifier: 1.2.1 version: 1.2.1 @@ -272,8 +272,8 @@ importers: specifier: 2.0.2 version: 2.0.2 '@interledger/open-payments': - specifier: 6.7.1 - version: 6.7.1 + specifier: 6.7.2 + version: 6.7.2 '@interledger/openapi': specifier: 1.2.1 version: 1.2.1 @@ -621,8 +621,8 @@ importers: specifier: 2.0.2 version: 2.0.2 '@interledger/open-payments': - specifier: ^6.7.1 - version: 6.7.1 + specifier: ^6.7.2 + version: 6.7.2 '@koa/bodyparser': specifier: ^5.0.0 version: 5.0.0 @@ -3541,8 +3541,8 @@ packages: jose: 4.13.1 uuid: 9.0.1 - /@interledger/open-payments@6.7.1: - resolution: {integrity: sha512-wrSe0Z9ogn6WpLvZQTnacyTBbHbiiXP78anAxQsPAvXh2degj82RSQJiSboSAWkC4yYPyIu7JMo3PVGC0ZTl2w==} + /@interledger/open-payments@6.7.2: + resolution: {integrity: sha512-/f+t3DRuB4x2ojxkTjkg6Ql2Y+Y8iXYgiGo6YMzW4eKoCAfKSrb3RbkM5jKAElD61b4VBlXvymX0An0V+P1LSg==} dependencies: '@interledger/http-signature-utils': 2.0.2 '@interledger/openapi': 1.2.1 diff --git a/scripts/fetch-schemas.sh b/scripts/fetch-schemas.sh index 8d78328426..af9cffbed2 100755 --- a/scripts/fetch-schemas.sh +++ b/scripts/fetch-schemas.sh @@ -1,7 +1,7 @@ #!/bin/bash REPO_ROOT=$(git rev-parse --show-toplevel) -BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.7.1}" +BRANCH_OR_TAG="${1:-%40interledger/open-payments%406.7.2}" BASE_URL="https://raw.githubusercontent.com/interledger/open-payments/$BRANCH_OR_TAG" OUT_DIR="$REPO_ROOT/openapi" diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 5827669102..9f6baa7984 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -372,14 +372,10 @@ describe('Integration tests', (): void => { const { access_token, uri } = outgoingPaymentGrant.continue const grantContinue_ = await poll( async () => - c9.opClient.grant.continue( - { - accessToken: access_token.value, - url: uri - }, - // TODO: pull in latest from OP (when merged) which shouldn't need body at all - { interact_ref: undefined } - ), + c9.opClient.grant.continue({ + accessToken: access_token.value, + url: uri + }), (responseData) => 'access_token' in responseData, 20, 5 diff --git a/test/integration/package.json b/test/integration/package.json index ca6caaeaa0..740d870972 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.2", - "@interledger/open-payments": "^6.7.1", + "@interledger/open-payments": "^6.7.2", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", "@types/node": "^18.19.19", From 636832d6c60a266666bf3ad4db5858318c933671 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:54:01 -0400 Subject: [PATCH 40/53] chore: pnpm i, fix broken lockfile (no apollo version) --- pnpm-lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d192a3969..3d32a6595e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -582,7 +582,7 @@ importers: devDependencies: '@apollo/client': specifier: ^3.8.10 - version: 3.9.6(@types/react@18.2.64)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + version: 3.9.7(@types/react@18.2.65)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@types/node': specifier: ^18.7.12 version: 18.19.19 @@ -616,7 +616,7 @@ importers: devDependencies: '@apollo/client': specifier: ^3.8.10 - version: 3.9.6(@types/react@18.2.64)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + version: 3.9.7(@types/react@18.2.65)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@interledger/http-signature-utils': specifier: 2.0.2 version: 2.0.2 From f4ad75c2941b0a7603a9574646e356f55c3c6067 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:28:24 -0400 Subject: [PATCH 41/53] refactor: move webhook event enum to types --- .../src/WebhookEventType.ts | 11 ----------- packages/mock-account-servicing-lib/src/index.ts | 3 +-- packages/mock-account-servicing-lib/src/types.ts | 13 ++++++++++++- 3 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 packages/mock-account-servicing-lib/src/WebhookEventType.ts diff --git a/packages/mock-account-servicing-lib/src/WebhookEventType.ts b/packages/mock-account-servicing-lib/src/WebhookEventType.ts deleted file mode 100644 index b9d80978a9..0000000000 --- a/packages/mock-account-servicing-lib/src/WebhookEventType.ts +++ /dev/null @@ -1,11 +0,0 @@ -export enum WebhookEventType { - IncomingPaymentCreated = 'incoming_payment.created', - IncomingPaymentCompleted = 'incoming_payment.completed', - IncomingPaymentExpired = 'incoming_payment.expired', - OutgoingPaymentCreated = 'outgoing_payment.created', - OutgoingPaymentCompleted = 'outgoing_payment.completed', - OutgoingPaymentFailed = 'outgoing_payment.failed', - WalletAddressNotFound = 'wallet_address.not_found', - AssetLiquidityLow = 'asset.liquidity_low', - PeerLiquidityLow = 'peer.liquidity_low' -} diff --git a/packages/mock-account-servicing-lib/src/index.ts b/packages/mock-account-servicing-lib/src/index.ts index db6d2486b2..02fbf37407 100644 --- a/packages/mock-account-servicing-lib/src/index.ts +++ b/packages/mock-account-servicing-lib/src/index.ts @@ -1,5 +1,4 @@ -export { Peering, Account, Config, Webhook } from './types' +export { Peering, Account, Config, Webhook, WebhookEventType } from './types' export { AccountProvider } from './AccountProvider' export { setupFromSeed } from './setupFromSeed' -export { WebhookEventType } from './WebhookEventType' diff --git a/packages/mock-account-servicing-lib/src/types.ts b/packages/mock-account-servicing-lib/src/types.ts index 2f505a461a..829351a78d 100644 --- a/packages/mock-account-servicing-lib/src/types.ts +++ b/packages/mock-account-servicing-lib/src/types.ts @@ -1,5 +1,4 @@ import type { KeyObject } from 'crypto' -import { WebhookEventType } from './WebhookEventType' interface Asset { code: string @@ -55,3 +54,15 @@ export interface Webhook { type: WebhookEventType data: Record } + +export enum WebhookEventType { + IncomingPaymentCreated = 'incoming_payment.created', + IncomingPaymentCompleted = 'incoming_payment.completed', + IncomingPaymentExpired = 'incoming_payment.expired', + OutgoingPaymentCreated = 'outgoing_payment.created', + OutgoingPaymentCompleted = 'outgoing_payment.completed', + OutgoingPaymentFailed = 'outgoing_payment.failed', + WalletAddressNotFound = 'wallet_address.not_found', + AssetLiquidityLow = 'asset.liquidity_low', + PeerLiquidityLow = 'peer.liquidity_low' +} From 9c19b9ab5140b028a53226ae971c41fbd4d769c6 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:29:45 -0400 Subject: [PATCH 42/53] refactor: move run integration script to test/integration --- test/integration/package.json | 3 ++- .../integration/scripts/run-tests.sh | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) rename scripts/run-integration-tests.sh => test/integration/scripts/run-tests.sh (84%) diff --git a/test/integration/package.json b/test/integration/package.json index 740d870972..83d9471200 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -5,7 +5,8 @@ "description": "", "scripts": { "testenv:compose": "docker-compose -f ./testenv/cloud-nine-wallet/docker-compose.yml -f ./testenv/happy-life-bank/docker-compose.yml -f ./testenv/docker-compose.yml", - "test": "jest" + "test": "jest", + "run-tests": "./scripts/run-tests.sh" }, "keywords": [], "author": "", diff --git a/scripts/run-integration-tests.sh b/test/integration/scripts/run-tests.sh similarity index 84% rename from scripts/run-integration-tests.sh rename to test/integration/scripts/run-tests.sh index 4e06c22ae4..ef7401b92e 100755 --- a/scripts/run-integration-tests.sh +++ b/test/integration/scripts/run-tests.sh @@ -6,7 +6,7 @@ # ./script.sh # Run the script with default options # ./script.sh --build # Re-build the docker images (-b or --build) -log_file="/tmp/rafiki_integration_logs.txt" +log_file="./tmp/rafiki_integration_logs.txt" build_flag="" # Parse cli args @@ -25,6 +25,9 @@ done pnpm --filter integration testenv:compose down --volumes pnpm --filter integration testenv:compose up -d --wait $build_flag -pnpm --filter integration testenv:compose logs -f --tail=0 > "$log_file" 2>&1 & + +mkdir -p ./tmp +pnpm --filter integration testenv:compose logs -f > "$log_file" 2>&1 & + pnpm --filter integration test pnpm --filter integration testenv:compose down --volumes From 6085663341128d24f48f0afd052db5a5fd68b63b Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:33:33 -0400 Subject: [PATCH 43/53] Update packages/mock-account-servicing-lib/package.json Co-authored-by: Sabine Schaller --- packages/mock-account-servicing-lib/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mock-account-servicing-lib/package.json b/packages/mock-account-servicing-lib/package.json index fb4c26a704..0c75dd5428 100644 --- a/packages/mock-account-servicing-lib/package.json +++ b/packages/mock-account-servicing-lib/package.json @@ -1,6 +1,6 @@ { "name": "mock-account-servicing-lib", - "description": "Common library for mock account servicing", + "description": "Common library for mock account service", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ From 8994ead1bc635d5a0d51accf67f3e0f01832a1f6 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:50:56 -0400 Subject: [PATCH 44/53] refactor: simplify mock-account-servicing-entity ci step --- .github/workflows/lint_test_build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/lint_test_build.yml b/.github/workflows/lint_test_build.yml index faddf45eeb..78946e898a 100644 --- a/.github/workflows/lint_test_build.yml +++ b/.github/workflows/lint_test_build.yml @@ -84,9 +84,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup - - run: pnpm --filter mock-account-servicing-entity build:deps - - run: pnpm --filter mock-account-servicing-entity typecheck - run: pnpm --filter mock-account-servicing-entity build + - run: pnpm --filter mock-account-servicing-entity typecheck token-introspection: runs-on: ubuntu-22.04 From bb98b70f7402fee1d098d3cf9f0ae85cde5c0294 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Sat, 16 Mar 2024 16:13:17 -0400 Subject: [PATCH 45/53] feat(integration): exit run-tests early if containers fail to start --- test/integration/scripts/run-tests.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/integration/scripts/run-tests.sh b/test/integration/scripts/run-tests.sh index ef7401b92e..3199ca78ce 100755 --- a/test/integration/scripts/run-tests.sh +++ b/test/integration/scripts/run-tests.sh @@ -26,6 +26,11 @@ done pnpm --filter integration testenv:compose down --volumes pnpm --filter integration testenv:compose up -d --wait $build_flag +if [ $? -ne 0 ]; then + echo "Error: Failed to start containers." + exit 1 +fi + mkdir -p ./tmp pnpm --filter integration testenv:compose logs -f > "$log_file" 2>&1 & From 0ab584413e29dad8e486abe8e1f888755cd9e0e1 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Sat, 16 Mar 2024 22:39:24 -0400 Subject: [PATCH 46/53] feat: use pino logger --- .../app/entry.server.tsx | 5 +- .../mock-account-servicing-lib/package.json | 4 +- .../src/requesters.ts | 77 ++++++++----------- .../src/setupFromSeed.ts | 52 ++++++------- pnpm-lock.yaml | 20 +++-- test/integration/package.json | 2 +- 6 files changed, 73 insertions(+), 87 deletions(-) diff --git a/localenv/mock-account-servicing-entity/app/entry.server.tsx b/localenv/mock-account-servicing-entity/app/entry.server.tsx index c16240a22b..0812bb6aa1 100644 --- a/localenv/mock-account-servicing-entity/app/entry.server.tsx +++ b/localenv/mock-account-servicing-entity/app/entry.server.tsx @@ -32,7 +32,10 @@ async function callWithRetry(fn: () => any, depth = 0): Promise { if (!global.__seeded) { callWithRetry(async () => { console.log('setting up from seed...') - return setupFromSeed(CONFIG, apolloClient, mockAccounts, { debug: true }) + return setupFromSeed(CONFIG, apolloClient, mockAccounts, { + logLevel: 'debug', + pinoPretty: true + }) }) .then(() => { global.__seeded = true diff --git a/packages/mock-account-servicing-lib/package.json b/packages/mock-account-servicing-lib/package.json index 0c75dd5428..35242eb35e 100644 --- a/packages/mock-account-servicing-lib/package.json +++ b/packages/mock-account-servicing-lib/package.json @@ -12,13 +12,15 @@ "test": "jest" }, "devDependencies": { - "@apollo/client": "^3.8.10", "@types/node": "^18.7.12", "@types/uuid": "^9.0.8" }, "dependencies": { + "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.2", "graphql": "^16.8.1", + "pino": "^8.19.0", + "pino-pretty": "^10.3.1", "uuid": "^9.0.1" } } diff --git a/packages/mock-account-servicing-lib/src/requesters.ts b/packages/mock-account-servicing-lib/src/requesters.ts index 506aa5e074..405155f0bf 100644 --- a/packages/mock-account-servicing-lib/src/requesters.ts +++ b/packages/mock-account-servicing-lib/src/requesters.ts @@ -1,4 +1,5 @@ import { gql, ApolloClient, NormalizedCacheObject } from '@apollo/client' +import { Logger } from 'pino' import type { AssetMutationResponse, CreatePeerMutationResponse, @@ -17,7 +18,7 @@ import { v4 as uuid } from 'uuid' export function createRequesters( apolloClient: ApolloClient, - debug: boolean + logger: Logger ): { createAsset: ( code: string, @@ -78,32 +79,32 @@ export function createRequesters( ) => createPeer( apolloClient, + logger, staticIlpAddress, outgoingEndpoint, assetId, assetCode, name, - liquidityThreshold, - debug + liquidityThreshold ), createAutoPeer: (peerUrl, assetId) => - createAutoPeer(apolloClient, peerUrl, assetId, debug), + createAutoPeer(apolloClient, logger, peerUrl, assetId), depositPeerLiquidity: (peerId, amount, transferUid) => - depositPeerLiquidity(apolloClient, peerId, amount, transferUid, debug), + depositPeerLiquidity(apolloClient, logger, peerId, amount, transferUid), depositAssetLiquidity: (assetId, amount, transferId) => - depositAssetLiquidity(apolloClient, assetId, amount, transferId, debug), + depositAssetLiquidity(apolloClient, logger, assetId, amount, transferId), createWalletAddress: (accountName, accountUrl, assetId) => createWalletAddress( apolloClient, + logger, accountName, accountUrl, - assetId, - debug + assetId ), createWalletAddressKey: ({ walletAddressId, jwk }) => - createWalletAddressKey(apolloClient, { walletAddressId, jwk }, debug), + createWalletAddressKey(apolloClient, logger, { walletAddressId, jwk }), setFee: (assetId, type, fixed, basisPoints) => - setFee(apolloClient, assetId, type, fixed, basisPoints, debug) + setFee(apolloClient, logger, assetId, type, fixed, basisPoints) } } @@ -150,13 +151,13 @@ export async function createAsset( export async function createPeer( apolloClient: ApolloClient, + logger: Logger, staticIlpAddress: string, outgoingEndpoint: string, assetId: string, assetCode: string, name: string, - liquidityThreshold: number, - debug: boolean + liquidityThreshold: number ): Promise { const createPeerMutation = gql` mutation CreatePeer($input: CreatePeerInput!) { @@ -188,9 +189,7 @@ export async function createPeer( variables: createPeerInput }) .then(({ data }): CreatePeerMutationResponse => { - if (debug) { - console.log(data) - } + logger.debug(data) if (!data.createPeer.success) { throw new Error('Data was empty') } @@ -200,9 +199,9 @@ export async function createPeer( export async function createAutoPeer( apolloClient: ApolloClient, + logger: Logger, peerUrl: string, - assetId: string, - debug: boolean + assetId: string ): Promise { const createAutoPeerMutation = gql` mutation CreateOrUpdatePeerByUrl($input: CreateOrUpdatePeerByUrlInput!) { @@ -239,9 +238,7 @@ export async function createAutoPeer( }) .then(({ data }): CreateOrUpdatePeerByUrlMutationResponse => { if (!data.createOrUpdatePeerByUrl.success) { - if (debug) { - console.log(data.createOrUpdatePeerByUrl) - } + logger.debug(data.createOrUpdatePeerByUrl) throw new Error(`Data was empty for assetId: ${assetId}`) } return data.createOrUpdatePeerByUrl @@ -250,10 +247,10 @@ export async function createAutoPeer( export async function depositPeerLiquidity( apolloClient: ApolloClient, + logger: Logger, peerId: string, amount: string, - transferUid: string, - debug: boolean + transferUid: string ): Promise { const depositPeerLiquidityMutation = gql` mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { @@ -279,9 +276,7 @@ export async function depositPeerLiquidity( variables: depositPeerLiquidityInput }) .then(({ data }): LiquidityMutationResponse => { - if (debug) { - console.log(data) - } + logger.debug(data) if (!data.depositPeerLiquidity.success) { throw new Error('Data was empty') } @@ -291,10 +286,10 @@ export async function depositPeerLiquidity( export async function depositAssetLiquidity( apolloClient: ApolloClient, + logger: Logger, assetId: string, amount: number, - transferId: string, - debug: boolean + transferId: string ): Promise { const depositAssetLiquidityMutation = gql` mutation DepositAssetLiquidity($input: DepositAssetLiquidityInput!) { @@ -320,9 +315,7 @@ export async function depositAssetLiquidity( variables: depositAssetLiquidityInput }) .then(({ data }): LiquidityMutationResponse => { - if (debug) { - console.log(data) - } + logger.debug(data) if (!data.depositAssetLiquidity.success) { throw new Error('Data was empty') } @@ -332,10 +325,10 @@ export async function depositAssetLiquidity( export async function createWalletAddress( apolloClient: ApolloClient, + logger: Logger, accountName: string, accountUrl: string, - assetId: string, - debug: boolean + assetId: string ): Promise { const createWalletAddressMutation = gql` mutation CreateWalletAddress($input: CreateWalletAddressInput!) { @@ -365,9 +358,7 @@ export async function createWalletAddress( } }) .then(({ data }) => { - if (debug) { - console.log(data) - } + logger.debug(data) if ( !data.createWalletAddress.success || @@ -382,14 +373,14 @@ export async function createWalletAddress( export async function createWalletAddressKey( apolloClient: ApolloClient, + logger: Logger, { walletAddressId, jwk }: { walletAddressId: string jwk: string - }, - debug: boolean + } ): Promise { const createWalletAddressKeyMutation = gql` mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { @@ -413,9 +404,7 @@ export async function createWalletAddressKey( } }) .then(({ data }): CreateWalletAddressKeyMutationResponse => { - if (debug) { - console.log(data) - } + logger.debug(data) if (!data.createWalletAddressKey.success) { throw new Error('Data was empty') } @@ -425,11 +414,11 @@ export async function createWalletAddressKey( export async function setFee( apolloClient: ApolloClient, + logger: Logger, assetId: string, type: FeeType, fixed: number, - basisPoints: number, - debug: boolean + basisPoints: number ): Promise { const setFeeMutation = gql` mutation SetFee($input: SetFeeInput!) { @@ -465,9 +454,7 @@ export async function setFee( } }) .then(({ data }): SetFeeResponse => { - if (debug) { - console.log(data) - } + logger.debug(data) if (!data.setFee) { throw new Error('Data was empty') } diff --git a/packages/mock-account-servicing-lib/src/setupFromSeed.ts b/packages/mock-account-servicing-lib/src/setupFromSeed.ts index 18026ab104..001e75386b 100644 --- a/packages/mock-account-servicing-lib/src/setupFromSeed.ts +++ b/packages/mock-account-servicing-lib/src/setupFromSeed.ts @@ -1,5 +1,6 @@ import { v4 } from 'uuid' import { ApolloClient, NormalizedCacheObject } from '@apollo/client' +import createLogger, { LevelWithSilent, LoggerOptions } from 'pino' import { generateJwk } from '@interledger/http-signature-utils' import { createRequesters } from './requesters' import { Config, Account, Peering } from './types' @@ -7,7 +8,8 @@ import { Asset, FeeType } from './generated/graphql' import { AccountProvider } from './AccountProvider' interface SetupFromSeedOptions { - debug?: boolean + logLevel?: LevelWithSilent + pinoPretty?: boolean } export async function setupFromSeed( @@ -16,7 +18,17 @@ export async function setupFromSeed( mockAccounts: AccountProvider, options: SetupFromSeedOptions = {} ): Promise { - const { debug = false } = options + const { logLevel = 'info', pinoPretty = false } = options + + const loggerOptions: LoggerOptions = { + level: logLevel + } + + if (pinoPretty) { + loggerOptions.transport = { target: 'pino-pretty' } + } + + const logger = createLogger(loggerOptions) const { createAsset, depositAssetLiquidity, @@ -26,7 +38,7 @@ export async function setupFromSeed( createAutoPeer, createWalletAddress, createWalletAddressKey - } = createRequesters(apolloClient, debug) + } = createRequesters(apolloClient, logger) const assets: Record = {} for (const { code, scale, liquidity, liquidityThreshold } of config.seed @@ -43,9 +55,7 @@ export async function setupFromSeed( ) assets[code] = asset - if (debug) { - console.log(JSON.stringify({ asset, initialLiquidity }, null, 2)) - } + logger.debug({ asset, initialLiquidity }) const { fees } = config.seed const fee = fees.find((fee) => fee.asset === code && fee.scale == scale) @@ -79,26 +89,18 @@ export async function setupFromSeed( }) ) - if (debug) { - console.log(JSON.stringify(peerResponses, null, 2)) - } + logger.debug(peerResponses) if (config.testnetAutoPeerUrl) { - if (debug) { - console.log('autopeering url: ', config.testnetAutoPeerUrl) - } + logger.debug('autopeering url: ', config.testnetAutoPeerUrl) const autoPeerResponse = await createAutoPeer( config.testnetAutoPeerUrl, assets[peeringAsset].id ).catch((e) => { - if (debug) { - console.log('error on autopeering: ', e) - } + logger.debug('error on autopeering: ', e) return }) - if (debug) { - console.log(JSON.stringify(autoPeerResponse, null, 2)) - } + logger.debug(autoPeerResponse) } // Clear the accounts before seeding. @@ -127,9 +129,7 @@ export async function setupFromSeed( return } - if (debug) { - console.log('hostname: ', config.publicHost) - } + logger.debug('hostname: ', config.publicHost) const walletAddress = await createWalletAddress( account.name, `${config.publicHost}/${account.path}`, @@ -153,15 +153,11 @@ export async function setupFromSeed( return walletAddress }) ) - if (debug) { - console.log('seed complete') - console.log(JSON.stringify(accountResponses, null, 2)) - } + logger.debug('seed complete') + logger.debug(accountResponses) const hostname = new URL(config.publicHost).hostname const envVarStrings = config.seed.accounts.map((account) => { return `${account.brunoEnvVar}: ${config.publicHost}/${account.path} hostname: ${hostname}` }) - if (debug) { - console.log(envVarStrings.join('\n')) - } + logger.debug(envVarStrings) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0835e0d5f1..b608a0eda0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -576,19 +576,25 @@ importers: packages/mock-account-servicing-lib: dependencies: + '@apollo/client': + specifier: ^3.8.10 + version: 3.9.7(@types/react@18.2.66)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@interledger/http-signature-utils': specifier: 2.0.2 version: 2.0.2 graphql: specifier: ^16.8.1 version: 16.8.1 + pino: + specifier: ^8.19.0 + version: 8.19.0 + pino-pretty: + specifier: ^10.3.1 + version: 10.3.1 uuid: specifier: ^9.0.1 version: 9.0.1 devDependencies: - '@apollo/client': - specifier: ^3.8.10 - version: 3.9.7(@types/react@18.2.66)(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@types/node': specifier: ^18.7.12 version: 18.19.19 @@ -7733,7 +7739,6 @@ packages: /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: true /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} @@ -9072,7 +9077,6 @@ packages: /fast-copy@3.0.0: resolution: {integrity: sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA==} - dev: true /fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -9123,7 +9127,6 @@ packages: /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -9985,7 +9988,6 @@ packages: /help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - dev: true /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -11254,7 +11256,6 @@ packages: /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - dev: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -13792,7 +13793,6 @@ packages: secure-json-parse: 2.5.0 sonic-boom: 3.7.0 strip-json-comments: 3.1.1 - dev: true /pino-std-serializers@6.0.0: resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==} @@ -14963,7 +14963,6 @@ packages: /secure-json-parse@2.5.0: resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==} - dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -15538,7 +15537,6 @@ packages: /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true /structured-headers@0.5.0: resolution: {integrity: sha512-oLnmXSsjhud+LxRJpvokwP8ImEB2wTg8sg30buwfVViKMuluTv3BlOJHUX9VW9pJ2nQOxmx87Z0kB86O4cphag==} diff --git a/test/integration/package.json b/test/integration/package.json index 83d9471200..79a4720d76 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -15,13 +15,13 @@ "@apollo/client": "^3.8.10", "@interledger/http-signature-utils": "2.0.2", "@interledger/open-payments": "^6.7.2", + "@koa/bodyparser": "^5.0.0", "@types/koa": "2.14.0", "@types/koa-bodyparser": "^4.3.12", "@types/node": "^18.19.19", "@types/uuid": "^9.0.8", "dotenv": "^16.4.1", "koa": "^2.15.0", - "@koa/bodyparser": "^5.0.0", "mock-account-servicing-lib": "workspace:*", "uuid": "^9.0.1", "yaml": "^2.3.4" From 43d536b7d9ed95c3e0a4ad2042e59e2a8b303e7f Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:35:06 -0400 Subject: [PATCH 47/53] refactor: rename mock account servicing lib --- localenv/mock-account-servicing-entity/Dockerfile | 10 +++++----- .../mock-account-servicing-entity/app/entry.server.tsx | 2 +- .../app/lib/accounts.server.ts | 2 +- .../app/lib/parse_config.server.ts | 2 +- .../app/lib/webhooks.server.ts | 2 +- .../app/routes/webhooks.ts | 2 +- localenv/mock-account-servicing-entity/package.json | 4 ++-- packages/backend/codegen.yml | 2 +- .../jest.config.js | 0 .../package.json | 2 +- .../src/AccountProvider.ts | 0 .../src/generated/graphql.ts | 0 .../src/index.ts | 0 .../src/requesters.ts | 0 .../src/setupFromSeed.ts | 0 .../src/types.ts | 0 .../tsconfig.json | 0 pnpm-lock.yaml | 10 +++++----- test/integration/integration.test.ts | 2 +- test/integration/lib/IntegrationServer.ts | 2 +- test/integration/lib/MockASE.ts | 2 +- test/integration/lib/config.ts | 2 +- test/integration/package.json | 2 +- 23 files changed, 24 insertions(+), 24 deletions(-) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/jest.config.js (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/package.json (93%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/src/AccountProvider.ts (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/src/generated/graphql.ts (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/src/index.ts (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/src/requesters.ts (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/src/setupFromSeed.ts (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/src/types.ts (100%) rename packages/{mock-account-servicing-lib => mock-account-service-lib}/tsconfig.json (100%) diff --git a/localenv/mock-account-servicing-entity/Dockerfile b/localenv/mock-account-servicing-entity/Dockerfile index 8ae5319d25..6718f73061 100644 --- a/localenv/mock-account-servicing-entity/Dockerfile +++ b/localenv/mock-account-servicing-entity/Dockerfile @@ -22,7 +22,7 @@ FROM base AS prod-deps COPY package.json pnpm-workspace.yaml .npmrc ./ COPY localenv/mock-account-servicing-entity/package.json ./localenv/mock-account-servicing-entity/package.json -COPY packages/mock-account-servicing-lib/package.json ./packages/mock-account-servicing-lib/package.json +COPY packages/mock-account-service-lib/package.json ./packages/mock-account-service-lib/package.json RUN pnpm clean RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ @@ -37,7 +37,7 @@ FROM base AS builder COPY package.json pnpm-workspace.yaml .npmrc tsconfig.json tsconfig.build.json ./ COPY localenv/mock-account-servicing-entity ./localenv/mock-account-servicing-entity -COPY packages/mock-account-servicing-lib ./packages/mock-account-servicing-lib +COPY packages/mock-account-service-lib ./packages/mock-account-service-lib RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install \ @@ -56,12 +56,12 @@ COPY localenv/happy-life-bank/seed.yml ./localenv/happy-life-bank/seed.yml COPY --from=prod-deps /home/rafiki/node_modules ./node_modules COPY --from=prod-deps /home/rafiki/localenv/mock-account-servicing-entity/node_modules ./localenv/mock-account-servicing-entity/node_modules COPY --from=prod-deps /home/rafiki/localenv/mock-account-servicing-entity/package.json ./localenv/mock-account-servicing-entity/package.json -COPY --from=prod-deps /home/rafiki/packages/mock-account-servicing-lib/node_modules ./packages/mock-account-servicing-lib/node_modules -COPY --from=prod-deps /home/rafiki/packages/mock-account-servicing-lib/package.json ./packages/mock-account-servicing-lib/package.json +COPY --from=prod-deps /home/rafiki/packages/mock-account-service-lib/node_modules ./packages/mock-account-service-lib/node_modules +COPY --from=prod-deps /home/rafiki/packages/mock-account-service-lib/package.json ./packages/mock-account-service-lib/package.json COPY --from=builder /home/rafiki/localenv/mock-account-servicing-entity/build ./localenv/mock-account-servicing-entity/build COPY --from=builder /home/rafiki/localenv/mock-account-servicing-entity/public ./localenv/mock-account-servicing-entity/public -COPY --from=builder /home/rafiki/packages/mock-account-servicing-lib/dist ./packages/mock-account-servicing-lib/dist +COPY --from=builder /home/rafiki/packages/mock-account-service-lib/dist ./packages/mock-account-service-lib/dist WORKDIR /home/rafiki/localenv/mock-account-servicing-entity CMD ["sh", "./node_modules/.bin/remix-serve", "./build/index.js"] \ No newline at end of file diff --git a/localenv/mock-account-servicing-entity/app/entry.server.tsx b/localenv/mock-account-servicing-entity/app/entry.server.tsx index 0812bb6aa1..0183875b14 100644 --- a/localenv/mock-account-servicing-entity/app/entry.server.tsx +++ b/localenv/mock-account-servicing-entity/app/entry.server.tsx @@ -3,7 +3,7 @@ import type { EntryContext } from '@remix-run/node' import { createReadableStreamFromReadable } from '@remix-run/node' import { RemixServer } from '@remix-run/react' import { renderToPipeableStream } from 'react-dom/server' -import { setupFromSeed } from 'mock-account-servicing-lib' +import { setupFromSeed } from 'mock-account-service-lib' import { CONFIG } from './lib/parse_config.server' import { apolloClient } from './lib/apolloClient' import { mockAccounts } from './lib/accounts.server' diff --git a/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts b/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts index 20f69075a6..50dd6f6570 100644 --- a/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/accounts.server.ts @@ -1,3 +1,3 @@ -import { AccountProvider } from 'mock-account-servicing-lib' +import { AccountProvider } from 'mock-account-service-lib' export const mockAccounts = new AccountProvider() diff --git a/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts b/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts index 826de08e3c..dcba8553b2 100644 --- a/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/parse_config.server.ts @@ -1,7 +1,7 @@ import { parse } from 'yaml' import { readFileSync } from 'fs' import { loadOrGenerateKey } from '@interledger/http-signature-utils' -import type { Config } from 'mock-account-servicing-lib' +import type { Config } from 'mock-account-service-lib' export const CONFIG: Config = { seed: parse( diff --git a/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts b/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts index dc0c4a35f4..b8cb327a65 100644 --- a/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts +++ b/localenv/mock-account-servicing-entity/app/lib/webhooks.server.ts @@ -9,7 +9,7 @@ import { depositPeerLiquidity, createWalletAddress } from './requesters' -import { Webhook, WebhookEventType } from 'mock-account-servicing-lib' +import { Webhook, WebhookEventType } from 'mock-account-service-lib' export interface AmountJSON { value: string diff --git a/localenv/mock-account-servicing-entity/app/routes/webhooks.ts b/localenv/mock-account-servicing-entity/app/routes/webhooks.ts index aca081f36e..fdc1aeab70 100644 --- a/localenv/mock-account-servicing-entity/app/routes/webhooks.ts +++ b/localenv/mock-account-servicing-entity/app/routes/webhooks.ts @@ -9,7 +9,7 @@ import { handleOutgoingPaymentCompletedFailed, handleIncomingPaymentCompletedExpired } from '~/lib/webhooks.server' -import { WebhookEventType, Webhook } from 'mock-account-servicing-lib' +import { WebhookEventType, Webhook } from 'mock-account-service-lib' export function parseError(e: unknown): string { return e instanceof Error && e.stack ? e.stack : String(e) diff --git a/localenv/mock-account-servicing-entity/package.json b/localenv/mock-account-servicing-entity/package.json index 2fc7e1e673..0f7eda322c 100644 --- a/localenv/mock-account-servicing-entity/package.json +++ b/localenv/mock-account-servicing-entity/package.json @@ -2,7 +2,7 @@ "name": "mock-account-servicing-entity", "sideEffects": false, "scripts": { - "build:deps": "pnpm --filter mock-account-servicing-lib build", + "build:deps": "pnpm --filter mock-account-service-lib build", "build": "pnpm build:deps && remix build", "dev": "PORT=3300 remix dev", "start": "remix-serve ./build/index.js", @@ -18,7 +18,7 @@ "@types/uuid": "^9.0.8", "axios": "^1.6.7", "graphql": "^16.8.1", - "mock-account-servicing-lib": "workspace:*", + "mock-account-service-lib": "workspace:*", "react": "^18.2.0", "react-dom": "^18.2.0", "uuid": "^9.0.1", diff --git a/packages/backend/codegen.yml b/packages/backend/codegen.yml index d6bdfe4225..1032be871c 100644 --- a/packages/backend/codegen.yml +++ b/packages/backend/codegen.yml @@ -40,7 +40,7 @@ generates: scalars: UInt8: number UInt64: bigint - ../mock-account-servicing-lib/src/generated/graphql.ts: + ../mock-account-service-lib/src/generated/graphql.ts: plugins: - 'typescript' - 'typescript-resolvers' diff --git a/packages/mock-account-servicing-lib/jest.config.js b/packages/mock-account-service-lib/jest.config.js similarity index 100% rename from packages/mock-account-servicing-lib/jest.config.js rename to packages/mock-account-service-lib/jest.config.js diff --git a/packages/mock-account-servicing-lib/package.json b/packages/mock-account-service-lib/package.json similarity index 93% rename from packages/mock-account-servicing-lib/package.json rename to packages/mock-account-service-lib/package.json index 35242eb35e..81e5557a75 100644 --- a/packages/mock-account-servicing-lib/package.json +++ b/packages/mock-account-service-lib/package.json @@ -1,5 +1,5 @@ { - "name": "mock-account-servicing-lib", + "name": "mock-account-service-lib", "description": "Common library for mock account service", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/mock-account-servicing-lib/src/AccountProvider.ts b/packages/mock-account-service-lib/src/AccountProvider.ts similarity index 100% rename from packages/mock-account-servicing-lib/src/AccountProvider.ts rename to packages/mock-account-service-lib/src/AccountProvider.ts diff --git a/packages/mock-account-servicing-lib/src/generated/graphql.ts b/packages/mock-account-service-lib/src/generated/graphql.ts similarity index 100% rename from packages/mock-account-servicing-lib/src/generated/graphql.ts rename to packages/mock-account-service-lib/src/generated/graphql.ts diff --git a/packages/mock-account-servicing-lib/src/index.ts b/packages/mock-account-service-lib/src/index.ts similarity index 100% rename from packages/mock-account-servicing-lib/src/index.ts rename to packages/mock-account-service-lib/src/index.ts diff --git a/packages/mock-account-servicing-lib/src/requesters.ts b/packages/mock-account-service-lib/src/requesters.ts similarity index 100% rename from packages/mock-account-servicing-lib/src/requesters.ts rename to packages/mock-account-service-lib/src/requesters.ts diff --git a/packages/mock-account-servicing-lib/src/setupFromSeed.ts b/packages/mock-account-service-lib/src/setupFromSeed.ts similarity index 100% rename from packages/mock-account-servicing-lib/src/setupFromSeed.ts rename to packages/mock-account-service-lib/src/setupFromSeed.ts diff --git a/packages/mock-account-servicing-lib/src/types.ts b/packages/mock-account-service-lib/src/types.ts similarity index 100% rename from packages/mock-account-servicing-lib/src/types.ts rename to packages/mock-account-service-lib/src/types.ts diff --git a/packages/mock-account-servicing-lib/tsconfig.json b/packages/mock-account-service-lib/tsconfig.json similarity index 100% rename from packages/mock-account-servicing-lib/tsconfig.json rename to packages/mock-account-service-lib/tsconfig.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b608a0eda0..53569d94f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,9 +83,9 @@ importers: graphql: specifier: ^16.8.1 version: 16.8.1 - mock-account-servicing-lib: + mock-account-service-lib: specifier: workspace:* - version: link:../../packages/mock-account-servicing-lib + version: link:../../packages/mock-account-service-lib react: specifier: ^18.2.0 version: 18.2.0 @@ -574,7 +574,7 @@ importers: specifier: ^3.4.1 version: 3.4.1 - packages/mock-account-servicing-lib: + packages/mock-account-service-lib: dependencies: '@apollo/client': specifier: ^3.8.10 @@ -656,9 +656,9 @@ importers: koa: specifier: ^2.15.0 version: 2.15.0 - mock-account-servicing-lib: + mock-account-service-lib: specifier: workspace:* - version: link:../../packages/mock-account-servicing-lib + version: link:../../packages/mock-account-service-lib uuid: specifier: ^9.0.1 version: 9.0.1 diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 9f6baa7984..21d9d8427c 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -12,7 +12,7 @@ import { } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/MockASE' -import { WebhookEventType } from 'mock-account-servicing-lib' +import { WebhookEventType } from 'mock-account-service-lib' import { parseCookies, poll, wait } from './lib/utils' import { Receiver as ReceiverGql, diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index 644cc92020..5441f1b814 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -6,7 +6,7 @@ import { AccountProvider, WebhookEventType, Webhook -} from 'mock-account-servicing-lib' +} from 'mock-account-service-lib' import { TestConfig } from './config' import { AdminClient } from './AdminClient' diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index 1fbd3dae82..562eae307c 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -3,7 +3,7 @@ import { AuthenticatedClient, createAuthenticatedClient } from '@interledger/open-payments' -import { AccountProvider, setupFromSeed } from 'mock-account-servicing-lib' +import { AccountProvider, setupFromSeed } from 'mock-account-service-lib' import { createApolloClient } from './apolloClient' import { AdminClient } from './AdminClient' import { IntegrationServer } from './IntegrationServer' diff --git a/test/integration/lib/config.ts b/test/integration/lib/config.ts index 95abbdb116..683fa708c7 100644 --- a/test/integration/lib/config.ts +++ b/test/integration/lib/config.ts @@ -1,7 +1,7 @@ import { parse } from 'yaml' import { readFileSync } from 'fs' import { loadKey } from '@interledger/http-signature-utils' -import type { Config } from 'mock-account-servicing-lib' +import type { Config } from 'mock-account-service-lib' import { parse as envParse } from 'dotenv' import { resolve } from 'path' diff --git a/test/integration/package.json b/test/integration/package.json index 79a4720d76..a06b8bb6a3 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -22,7 +22,7 @@ "@types/uuid": "^9.0.8", "dotenv": "^16.4.1", "koa": "^2.15.0", - "mock-account-servicing-lib": "workspace:*", + "mock-account-service-lib": "workspace:*", "uuid": "^9.0.1", "yaml": "^2.3.4" } From c4262bb7266a45f8ef1cbc3a6e613020dc2b09da Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:04:25 -0400 Subject: [PATCH 48/53] refactor: rename class files to camel case --- packages/mock-account-service-lib/src/index.ts | 2 +- packages/mock-account-service-lib/src/setupFromSeed.ts | 2 +- test/integration/integration.test.ts | 2 +- test/integration/lib/IntegrationServer.ts | 2 +- test/integration/lib/MockASE.ts | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mock-account-service-lib/src/index.ts b/packages/mock-account-service-lib/src/index.ts index 02fbf37407..3bb474c228 100644 --- a/packages/mock-account-service-lib/src/index.ts +++ b/packages/mock-account-service-lib/src/index.ts @@ -1,4 +1,4 @@ export { Peering, Account, Config, Webhook, WebhookEventType } from './types' -export { AccountProvider } from './AccountProvider' +export { AccountProvider } from './accountProvider' export { setupFromSeed } from './setupFromSeed' diff --git a/packages/mock-account-service-lib/src/setupFromSeed.ts b/packages/mock-account-service-lib/src/setupFromSeed.ts index 001e75386b..9832d16f8d 100644 --- a/packages/mock-account-service-lib/src/setupFromSeed.ts +++ b/packages/mock-account-service-lib/src/setupFromSeed.ts @@ -5,7 +5,7 @@ import { generateJwk } from '@interledger/http-signature-utils' import { createRequesters } from './requesters' import { Config, Account, Peering } from './types' import { Asset, FeeType } from './generated/graphql' -import { AccountProvider } from './AccountProvider' +import { AccountProvider } from './accountProvider' interface SetupFromSeedOptions { logLevel?: LevelWithSilent diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 21d9d8427c..dfe209f5a1 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -11,7 +11,7 @@ import { OutgoingPayment } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' -import { MockASE } from './lib/MockASE' +import { MockASE } from './lib/mockASE' import { WebhookEventType } from 'mock-account-service-lib' import { parseCookies, poll, wait } from './lib/utils' import { diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index 5441f1b814..f07b8f10e5 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -8,7 +8,7 @@ import { Webhook } from 'mock-account-service-lib' import { TestConfig } from './config' -import { AdminClient } from './AdminClient' +import { AdminClient } from './adminClient' export class IntegrationServer { private config: TestConfig diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts index 562eae307c..8736570d28 100644 --- a/test/integration/lib/MockASE.ts +++ b/test/integration/lib/MockASE.ts @@ -5,8 +5,8 @@ import { } from '@interledger/open-payments' import { AccountProvider, setupFromSeed } from 'mock-account-service-lib' import { createApolloClient } from './apolloClient' -import { AdminClient } from './AdminClient' -import { IntegrationServer } from './IntegrationServer' +import { AdminClient } from './adminClient' +import { IntegrationServer } from './integrationServer' import { TestConfig } from './config' /** Mock Account Servicing Entity */ From 7f39cd44b8fa693af74efc90dfb7c93dd87897d7 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:23:52 -0400 Subject: [PATCH 49/53] fix: import correct body parser --- test/integration/lib/IntegrationServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/IntegrationServer.ts index f07b8f10e5..9cfae4f810 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/IntegrationServer.ts @@ -1,5 +1,5 @@ import Koa from 'koa' -import bodyParser from 'koa-bodyparser' +import bodyParser from '@koa/bodyparser' import http from 'http' import { v4 as uuid } from 'uuid' import { From a6b937e2da29b1463b30a97d3167b9e4972dbcf4 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:01:07 -0400 Subject: [PATCH 50/53] refactor: poll instead of delay --- test/integration/integration.test.ts | 67 ++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index dfe209f5a1..13849541ff 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -149,8 +149,17 @@ describe('Integration tests', (): void => { } ) - // Delay gives time for webhook to be received - await wait(1000) + await poll( + () => Promise.resolve(), // no request, just check webhook + () => { + return handleWebhookEventSpy.mock.calls.some( + (call) => call[0]?.type === WebhookEventType.IncomingPaymentCreated + ) + }, + 5, + 0.5 + ) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ type: WebhookEventType.IncomingPaymentCreated, @@ -402,8 +411,25 @@ describe('Integration tests', (): void => { quoteId: quote.id } ) - // Delay gives time for webhooks to be received - await wait(1000) + + await poll( + () => Promise.resolve(), // no request, just check webhook + () => { + return ( + handleWebhookEventSpy.mock.calls.some( + (call) => + call[0]?.type === WebhookEventType.OutgoingPaymentCreated + ) && + handleWebhookEventSpy.mock.calls.some( + (call) => + call[0]?.type === WebhookEventType.OutgoingPaymentCompleted + ) + ) + }, + 5, + 0.5 + ) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ type: WebhookEventType.OutgoingPaymentCreated, @@ -472,8 +498,17 @@ describe('Integration tests', (): void => { receiver = response.receiver - // Delay gives time for webhook to be received - await wait(1000) + await poll( + () => Promise.resolve(), // no request, just check webhook + () => { + return handleWebhookEventSpy.mock.calls.some( + (call) => call[0]?.type === WebhookEventType.IncomingPaymentCreated + ) + }, + 5, + 0.5 + ) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ type: WebhookEventType.IncomingPaymentCreated, @@ -508,8 +543,24 @@ describe('Integration tests', (): void => { outgoingPayment = response.payment - // Delay gives time for payment to complete and for webhooks to be received - await wait(1000) + await poll( + () => Promise.resolve(), // no request, just check webhook + () => { + return ( + handleWebhookEventSpy.mock.calls.some( + (call) => + call[0]?.type === WebhookEventType.OutgoingPaymentCreated + ) && + handleWebhookEventSpy.mock.calls.some( + (call) => + call[0]?.type === WebhookEventType.OutgoingPaymentCompleted + ) + ) + }, + 5, + 0.5 + ) + expect(handleWebhookEventSpy).toHaveBeenCalledWith( expect.objectContaining({ type: WebhookEventType.OutgoingPaymentCreated, From 53c3f30488b42c08151d6e341bbac977c27222a4 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:24:30 -0400 Subject: [PATCH 51/53] refactor: simplify call to poll condition only --- test/integration/integration.test.ts | 14 +++++--------- test/integration/lib/utils.ts | 26 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 13849541ff..cfca6af1c2 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -13,7 +13,7 @@ import { import { C9_CONFIG, HLB_CONFIG } from './lib/config' import { MockASE } from './lib/mockASE' import { WebhookEventType } from 'mock-account-service-lib' -import { parseCookies, poll, wait } from './lib/utils' +import { parseCookies, poll, pollCondition, wait } from './lib/utils' import { Receiver as ReceiverGql, Quote as QuoteGql, @@ -149,8 +149,7 @@ describe('Integration tests', (): void => { } ) - await poll( - () => Promise.resolve(), // no request, just check webhook + await pollCondition( () => { return handleWebhookEventSpy.mock.calls.some( (call) => call[0]?.type === WebhookEventType.IncomingPaymentCreated @@ -412,8 +411,7 @@ describe('Integration tests', (): void => { } ) - await poll( - () => Promise.resolve(), // no request, just check webhook + await pollCondition( () => { return ( handleWebhookEventSpy.mock.calls.some( @@ -498,8 +496,7 @@ describe('Integration tests', (): void => { receiver = response.receiver - await poll( - () => Promise.resolve(), // no request, just check webhook + await pollCondition( () => { return handleWebhookEventSpy.mock.calls.some( (call) => call[0]?.type === WebhookEventType.IncomingPaymentCreated @@ -543,8 +540,7 @@ describe('Integration tests', (): void => { outgoingPayment = response.payment - await poll( - () => Promise.resolve(), // no request, just check webhook + await pollCondition( () => { return ( handleWebhookEventSpy.mock.calls.some( diff --git a/test/integration/lib/utils.ts b/test/integration/lib/utils.ts index 815e47b012..2a8f58a02c 100644 --- a/test/integration/lib/utils.ts +++ b/test/integration/lib/utils.ts @@ -3,7 +3,7 @@ export function wait(ms: number): Promise { } export async function poll( - requestFn: () => Promise, + fn: () => Promise, successCondition: (responseData: T) => boolean, pollDurationSeconds: number, pollIntervalSeconds: number @@ -13,7 +13,7 @@ export async function poll( while (Date.now() - startTime < pollDurationSeconds * 1000) { try { - responseData = await requestFn() + responseData = await fn() if (successCondition(responseData)) { return responseData @@ -28,6 +28,28 @@ export async function poll( throw new Error('Poll completed without success') } +export async function pollCondition( + successCondition: () => boolean, + pollDurationSeconds: number, + pollIntervalSeconds: number +): Promise { + const startTime = Date.now() + + while (Date.now() - startTime < pollDurationSeconds * 1000) { + try { + if (successCondition()) { + return + } + } catch (error) { + console.error('Error during polling:', error) + } + + await wait(pollIntervalSeconds * 1000) + } + + throw new Error('Poll completed without success') +} + export function parseCookies(response: Response) { return response.headers .getSetCookie() From ba612ebf2fb07edc429e2e767a601796377f778d Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:37:22 -0400 Subject: [PATCH 52/53] fix: update filenames --- .../src/accountProvider.ts | 271 ++++++++++++++++++ test/integration/lib/adminClient.ts | 238 +++++++++++++++ test/integration/lib/integrationServer.ts | 182 ++++++++++++ test/integration/lib/mockASE.ts | 58 ++++ 4 files changed, 749 insertions(+) create mode 100644 packages/mock-account-service-lib/src/accountProvider.ts create mode 100644 test/integration/lib/adminClient.ts create mode 100644 test/integration/lib/integrationServer.ts create mode 100644 test/integration/lib/mockASE.ts diff --git a/packages/mock-account-service-lib/src/accountProvider.ts b/packages/mock-account-service-lib/src/accountProvider.ts new file mode 100644 index 0000000000..5be375a920 --- /dev/null +++ b/packages/mock-account-service-lib/src/accountProvider.ts @@ -0,0 +1,271 @@ +interface Account { + id: string + name: string + path: string + walletAddressID: string + walletAddress: string + debitsPending: bigint + debitsPosted: bigint + creditsPending: bigint + creditsPosted: bigint + assetCode: string + assetScale: number + assetId: string +} + +interface AccountsServer { + clearAccounts(): Promise + setWalletAddress( + id: string, + walletID: string, + walletAddress: string + ): Promise + create( + id: string, + path: string, + name: string, + assetCode: string, + assetScale: number, + assetId: string + ): Promise + listAll(): Promise + get(id: string): Promise + getByWalletAddressId(walletAddressId: string): Promise + getByPath(path: string): Promise + getByWalletAddressUrl(walletAddressUrl: string): Promise + voidPendingDebit(id: string, amount: bigint): Promise + voidPendingCredit(id: string, amount: bigint): Promise + pendingDebit(id: string, amount: bigint): Promise + pendingCredit(id: string, amount: bigint): Promise + debit(id: string, amount: bigint, clearPending: boolean): Promise + credit(id: string, amount: bigint, clearPending: boolean): Promise +} + +export class AccountProvider implements AccountsServer { + accounts = new Map() + + async clearAccounts(): Promise { + this.accounts.clear() + } + + async setWalletAddress( + id: string, + walletID: string, + walletAddress: string + ): Promise { + if (!this.accounts.has(id)) { + throw new Error('account already exists') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + acc.walletAddress = walletAddress + acc.walletAddressID = walletID + } + + async create( + id: string, + path: string, + name: string, + assetCode: string, + assetScale: number, + assetId: string + ): Promise { + if (this.accounts.has(id)) { + throw new Error('account already exists') + } + this.accounts.set(id, { + id, + name, + path, + walletAddress: '', + walletAddressID: '', + creditsPending: BigInt(0), + creditsPosted: BigInt(0), + debitsPending: BigInt(0), + debitsPosted: BigInt(0), + assetCode, + assetScale, + assetId + }) + } + + async listAll(): Promise { + return [...this.accounts.values()] + } + + async get(id: string): Promise { + return this.accounts.get(id) + } + + async getByWalletAddressId( + walletAddressId: string + ): Promise { + for (const acc of this.accounts.values()) { + if (acc.walletAddressID == walletAddressId) { + return acc + } + } + } + + async getByWalletAddressUrl( + walletAddressUrl: string + ): Promise { + return (await this.listAll()).find( + (acc) => acc.walletAddress === walletAddressUrl + ) + } + + async getByPath(path: string): Promise { + return (await this.listAll()).find((acc) => acc.path === path) + } + + async credit( + id: string, + amount: bigint, + clearPending: boolean + ): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid credit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (clearPending && acc.creditsPending - amount < 0) { + throw new Error('invalid amount, credits pending cannot be less than 0') + } + + acc.creditsPosted += amount + if (clearPending) { + acc.creditsPending -= amount + } + } + + async debit( + id: string, + amount: bigint, + clearPending: boolean + ): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid debit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if ( + (clearPending && acc.debitsPending - amount < 0) || + acc.debitsPosted + amount < 0 + ) { + throw new Error('invalid amount, debits pending cannot be less than 0') + } + + if ( + !clearPending && + acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount + ) { + throw new Error('invalid debit, insufficient funds') + } + acc.debitsPosted += amount + if (clearPending) { + acc.debitsPending -= amount + } + } + + async pendingCredit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid pending credit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + acc.creditsPending += amount + } + + async pendingDebit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid pending debit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount) { + throw new Error('invalid pending debit amount, insufficient funds') + } + + acc.debitsPending += amount + } + + async voidPendingDebit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid void pending debit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (acc.debitsPending - amount < 0) { + throw new Error('invalid amount, debits pending cannot be less than 0') + } + + acc.debitsPending -= amount + } + + async voidPendingCredit(id: string, amount: bigint): Promise { + if (!this.accounts.has(id)) { + throw new Error('account does not exist') + } + if (amount < 0) { + throw new Error('invalid void pending credit amount') + } + + const acc = this.accounts.get(id) + + if (!acc) { + throw new Error() + } + + if (acc.debitsPending - amount < 0) { + throw new Error('invalid amount, credits pending cannot be less than 0') + } + + acc.creditsPending -= amount + } +} diff --git a/test/integration/lib/adminClient.ts b/test/integration/lib/adminClient.ts new file mode 100644 index 0000000000..6f848d2fcc --- /dev/null +++ b/test/integration/lib/adminClient.ts @@ -0,0 +1,238 @@ +import type { NormalizedCacheObject } from '@apollo/client' +import { ApolloClient, gql } from '@apollo/client' +import { + CreateOutgoingPaymentInput, + CreateQuoteInput, + CreateReceiverInput, + CreateReceiverResponse, + CreateWalletAddressInput, + CreateWalletAddressMutationResponse, + DepositOutgoingPaymentLiquidityInput, + LiquidityMutationResponse, + OutgoingPayment, + OutgoingPaymentResponse, + QuoteResponse +} from './generated/graphql' + +export class AdminClient { + private apolloClient: ApolloClient + + constructor(apolloClient: ApolloClient) { + this.apolloClient = apolloClient + } + + async createReceiver( + input: CreateReceiverInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateReceiver($input: CreateReceiverInput!) { + createReceiver(input: $input) { + code + message + receiver { + completed + createdAt + expiresAt + metadata + id + incomingAmount { + assetCode + assetScale + value + } + walletAddressUrl + receivedAmount { + assetCode + assetScale + value + } + updatedAt + } + success + } + } + `, + variables: { input } + }) + .then(({ data }): CreateReceiverResponse => { + return data.createReceiver + }) + } + + async createQuote(input: CreateQuoteInput): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateQuote($input: CreateQuoteInput!) { + createQuote(input: $input) { + code + message + quote { + createdAt + expiresAt + highEstimatedExchangeRate + id + lowEstimatedExchangeRate + maxPacketAmount + minExchangeRate + walletAddressId + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + } + } + } + `, + variables: { input } + }) + .then(({ data }): QuoteResponse => { + return data.createQuote + }) + } + + async createOutgoingPayment( + input: CreateOutgoingPaymentInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateOutgoingPayment($input: CreateOutgoingPaymentInput!) { + createOutgoingPayment(input: $input) { + code + message + payment { + createdAt + error + metadata + id + walletAddressId + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + sentAmount { + assetCode + assetScale + value + } + state + stateAttempts + } + success + } + } + `, + variables: { input } + }) + .then(({ data }): OutgoingPaymentResponse => { + return data.createOutgoingPayment + }) + } + + async getOutgoingPayment(id: string): Promise { + return await this.apolloClient + .query({ + query: gql` + query GetOutgoingPayment($id: String!) { + outgoingPayment(id: $id) { + createdAt + error + metadata + id + walletAddressId + quote { + id + } + receiveAmount { + assetCode + assetScale + value + } + receiver + debitAmount { + assetCode + assetScale + value + } + sentAmount { + assetCode + assetScale + value + } + state + stateAttempts + } + } + `, + variables: { id } + }) + .then((response): OutgoingPayment => { + return response.data.outgoingPayment + }) + } + + async depositOutgoingPaymentLiquidity( + input: DepositOutgoingPaymentLiquidityInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation DepositOutgoingPaymentLiquidity( + $input: DepositOutgoingPaymentLiquidityInput! + ) { + depositOutgoingPaymentLiquidity(input: $input) { + code + success + message + error + } + } + `, + variables: { input } + }) + .then(({ data }): LiquidityMutationResponse => { + return data.depositOutgoingPaymentLiquidity + }) + } + + async createWalletAddress( + input: CreateWalletAddressInput + ): Promise { + return await this.apolloClient + .mutate({ + mutation: gql` + mutation CreateWalletAddress($input: CreateWalletAddressInput!) { + createWalletAddress(input: $input) { + success + walletAddress { + id + url + publicName + } + } + } + `, + variables: { input } + }) + .then(({ data }): CreateWalletAddressMutationResponse => { + return data.createWalletAddress + }) + } +} diff --git a/test/integration/lib/integrationServer.ts b/test/integration/lib/integrationServer.ts new file mode 100644 index 0000000000..9cfae4f810 --- /dev/null +++ b/test/integration/lib/integrationServer.ts @@ -0,0 +1,182 @@ +import Koa from 'koa' +import bodyParser from '@koa/bodyparser' +import http from 'http' +import { v4 as uuid } from 'uuid' +import { + AccountProvider, + WebhookEventType, + Webhook +} from 'mock-account-service-lib' +import { TestConfig } from './config' +import { AdminClient } from './adminClient' + +export class IntegrationServer { + private config: TestConfig + private app: Koa + private server?: http.Server + public webhookEventHandler: WebhookEventHandler + + constructor( + config: TestConfig, + adminClient: AdminClient, + accounts: AccountProvider + ) { + this.config = config + this.app = new Koa() + this.app.use(bodyParser()) + this.webhookEventHandler = new WebhookEventHandler(adminClient, accounts) + } + + public start(port: number): void { + this.app.use(async (ctx) => { + if (ctx.path === '/webhooks' && ctx.method === 'POST') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { body } = ctx.request as Koa.Request & { body?: any } + + if (this.isWebhookEvent(body)) { + this.webhookEventHandler.handleWebhookEvent(body) + ctx.status = 200 + ctx.body = 'Webhook received' + } else { + ctx.status = 400 + ctx.body = 'Invalid WebhookEvent payload' + } + } + + if (ctx.path === '/rates' && ctx.method === 'GET') { + const { base } = ctx.query + ctx.body = { + base, + rates: { + ...this.config.seed.rates[base as string] + } + } + } + }) + + this.server = this.app.listen(port, () => { + console.log(`Integration server listening on port ${port}`) + }) + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private isWebhookEvent(body: any): body is Webhook { + return ( + typeof body === 'object' && + typeof body.id === 'string' && + typeof body.type === 'string' && + typeof body.data === 'object' + ) + } + + public async close(): Promise { + return new Promise((resolve, reject) => { + if (!this.server) return resolve() + + this.server.close((err) => { + if (err) { + reject(err) + } + + resolve() + }) + }) + } +} + +export class WebhookEventHandler { + private adminClient: AdminClient + private accounts: AccountProvider + + constructor(adminClient: AdminClient, accounts: AccountProvider) { + this.adminClient = adminClient + this.accounts = accounts + } + + public async handleWebhookEvent(webhookEvent: Webhook) { + switch (webhookEvent.type) { + case WebhookEventType.WalletAddressNotFound: + await this.handleWalletAddressNotFound(webhookEvent) + break + case WebhookEventType.IncomingPaymentCreated: + break + case WebhookEventType.OutgoingPaymentCreated: + await this.handleOutgoingPaymentCreated(webhookEvent) + break + case WebhookEventType.OutgoingPaymentCompleted: + break + default: + console.log(`unknown event type: ${webhookEvent.type}`) + } + } + + private async handleWalletAddressNotFound(webhookEvent: Webhook) { + const url = webhookEvent.data['walletAddressUrl'] + + if (!url || typeof url !== 'string') { + throw new Error('No walletAddressUrl found') + } + + const accountPath = new URL(url).pathname.substring(1) + const account = await this.accounts.getByPath(accountPath) + + if (!account) { + throw new Error('No account found for wallet address') + } + + const { assetId, name: publicName } = account + + const response = await this.adminClient.createWalletAddress({ + assetId, + publicName, + url + }) + const { walletAddress } = response + + if (!response.success) { + throw new Error('Failed to create wallet address') + } + if (!walletAddress) { + throw new Error('Could not get wallet address') + } + + await this.accounts.setWalletAddress( + account.id, + walletAddress.id, + walletAddress.url + ) + } + + private async handleOutgoingPaymentCreated(webhookEvent: Webhook) { + const payment = webhookEvent.data + const walletAddressId = payment['walletAddressId'] as string + const account = await this.accounts.getByWalletAddressId(walletAddressId) + + if (!account) { + throw new Error('No account found for wallet address') + } + + if (typeof payment.id !== 'string' || !payment.id) { + throw new Error('No payment id found') + } + + let amount: bigint + try { + amount = BigInt((payment.debitAmount as { value: string }).value) + } catch (err) { + throw new Error('Invalid debitAmount on payment') + } + + await this.accounts.pendingDebit(account.id, amount) + + const response = await this.adminClient.depositOutgoingPaymentLiquidity({ + outgoingPaymentId: payment.id, + idempotencyKey: uuid() + }) + + if (response.code !== '200') { + const msg = 'Deposit outgoing payment liquidity failed' + throw new Error(msg) + } + } +} diff --git a/test/integration/lib/mockASE.ts b/test/integration/lib/mockASE.ts new file mode 100644 index 0000000000..8736570d28 --- /dev/null +++ b/test/integration/lib/mockASE.ts @@ -0,0 +1,58 @@ +import { ApolloClient, NormalizedCacheObject } from '@apollo/client' +import { + AuthenticatedClient, + createAuthenticatedClient +} from '@interledger/open-payments' +import { AccountProvider, setupFromSeed } from 'mock-account-service-lib' +import { createApolloClient } from './apolloClient' +import { AdminClient } from './adminClient' +import { IntegrationServer } from './integrationServer' +import { TestConfig } from './config' + +/** Mock Account Servicing Entity */ +export class MockASE { + private config: TestConfig + private apolloClient: ApolloClient + + public adminClient: AdminClient + public accounts: AccountProvider + public opClient!: AuthenticatedClient + public integrationServer: IntegrationServer + + // Use .create factory because async construction + public static async create(config: TestConfig): Promise { + const mase = new MockASE(config) + await mase.initAsync() + return mase + } + + // Private to ensure it doesnt get called directly. + // Use static MockASE.create instead. + private constructor(config: TestConfig) { + this.config = config + this.apolloClient = createApolloClient(config.graphqlUrl) + this.adminClient = new AdminClient(this.apolloClient) + this.accounts = new AccountProvider() + this.integrationServer = new IntegrationServer( + this.config, + this.adminClient, + this.accounts + ) + this.integrationServer.start(this.config.integrationServerPort) + } + + private async initAsync() { + await setupFromSeed(this.config, this.apolloClient, this.accounts) + + this.opClient = await createAuthenticatedClient({ + privateKey: this.config.key, + keyId: this.config.keyId, + walletAddressUrl: this.config.walletAddressUrl, + useHttp: true + }) + } + + public async shutdown() { + await this.integrationServer.close() + } +} From 20c135fcd06c025fb850ea611d2d9b14def34ade Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:27:43 -0400 Subject: [PATCH 53/53] refactor: change filename name to kebab case --- ...AccountProvider.ts => account-provider.ts} | 0 .../src/accountProvider.ts | 271 ------------------ .../mock-account-service-lib/src/index.ts | 2 +- .../src/setupFromSeed.ts | 2 +- test/integration/integration.test.ts | 2 +- test/integration/lib/MockASE.ts | 58 ---- .../lib/{AdminClient.ts => admin-client.ts} | 0 test/integration/lib/adminClient.ts | 238 --------------- ...grationServer.ts => integration-server.ts} | 2 +- test/integration/lib/integrationServer.ts | 182 ------------ .../lib/{mockASE.ts => mock-ase.ts} | 4 +- 11 files changed, 6 insertions(+), 755 deletions(-) rename packages/mock-account-service-lib/src/{AccountProvider.ts => account-provider.ts} (100%) delete mode 100644 packages/mock-account-service-lib/src/accountProvider.ts delete mode 100644 test/integration/lib/MockASE.ts rename test/integration/lib/{AdminClient.ts => admin-client.ts} (100%) delete mode 100644 test/integration/lib/adminClient.ts rename test/integration/lib/{IntegrationServer.ts => integration-server.ts} (99%) delete mode 100644 test/integration/lib/integrationServer.ts rename test/integration/lib/{mockASE.ts => mock-ase.ts} (94%) diff --git a/packages/mock-account-service-lib/src/AccountProvider.ts b/packages/mock-account-service-lib/src/account-provider.ts similarity index 100% rename from packages/mock-account-service-lib/src/AccountProvider.ts rename to packages/mock-account-service-lib/src/account-provider.ts diff --git a/packages/mock-account-service-lib/src/accountProvider.ts b/packages/mock-account-service-lib/src/accountProvider.ts deleted file mode 100644 index 5be375a920..0000000000 --- a/packages/mock-account-service-lib/src/accountProvider.ts +++ /dev/null @@ -1,271 +0,0 @@ -interface Account { - id: string - name: string - path: string - walletAddressID: string - walletAddress: string - debitsPending: bigint - debitsPosted: bigint - creditsPending: bigint - creditsPosted: bigint - assetCode: string - assetScale: number - assetId: string -} - -interface AccountsServer { - clearAccounts(): Promise - setWalletAddress( - id: string, - walletID: string, - walletAddress: string - ): Promise - create( - id: string, - path: string, - name: string, - assetCode: string, - assetScale: number, - assetId: string - ): Promise - listAll(): Promise - get(id: string): Promise - getByWalletAddressId(walletAddressId: string): Promise - getByPath(path: string): Promise - getByWalletAddressUrl(walletAddressUrl: string): Promise - voidPendingDebit(id: string, amount: bigint): Promise - voidPendingCredit(id: string, amount: bigint): Promise - pendingDebit(id: string, amount: bigint): Promise - pendingCredit(id: string, amount: bigint): Promise - debit(id: string, amount: bigint, clearPending: boolean): Promise - credit(id: string, amount: bigint, clearPending: boolean): Promise -} - -export class AccountProvider implements AccountsServer { - accounts = new Map() - - async clearAccounts(): Promise { - this.accounts.clear() - } - - async setWalletAddress( - id: string, - walletID: string, - walletAddress: string - ): Promise { - if (!this.accounts.has(id)) { - throw new Error('account already exists') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - acc.walletAddress = walletAddress - acc.walletAddressID = walletID - } - - async create( - id: string, - path: string, - name: string, - assetCode: string, - assetScale: number, - assetId: string - ): Promise { - if (this.accounts.has(id)) { - throw new Error('account already exists') - } - this.accounts.set(id, { - id, - name, - path, - walletAddress: '', - walletAddressID: '', - creditsPending: BigInt(0), - creditsPosted: BigInt(0), - debitsPending: BigInt(0), - debitsPosted: BigInt(0), - assetCode, - assetScale, - assetId - }) - } - - async listAll(): Promise { - return [...this.accounts.values()] - } - - async get(id: string): Promise { - return this.accounts.get(id) - } - - async getByWalletAddressId( - walletAddressId: string - ): Promise { - for (const acc of this.accounts.values()) { - if (acc.walletAddressID == walletAddressId) { - return acc - } - } - } - - async getByWalletAddressUrl( - walletAddressUrl: string - ): Promise { - return (await this.listAll()).find( - (acc) => acc.walletAddress === walletAddressUrl - ) - } - - async getByPath(path: string): Promise { - return (await this.listAll()).find((acc) => acc.path === path) - } - - async credit( - id: string, - amount: bigint, - clearPending: boolean - ): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid credit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (clearPending && acc.creditsPending - amount < 0) { - throw new Error('invalid amount, credits pending cannot be less than 0') - } - - acc.creditsPosted += amount - if (clearPending) { - acc.creditsPending -= amount - } - } - - async debit( - id: string, - amount: bigint, - clearPending: boolean - ): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid debit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if ( - (clearPending && acc.debitsPending - amount < 0) || - acc.debitsPosted + amount < 0 - ) { - throw new Error('invalid amount, debits pending cannot be less than 0') - } - - if ( - !clearPending && - acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount - ) { - throw new Error('invalid debit, insufficient funds') - } - acc.debitsPosted += amount - if (clearPending) { - acc.debitsPending -= amount - } - } - - async pendingCredit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid pending credit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - acc.creditsPending += amount - } - - async pendingDebit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid pending debit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (acc.creditsPosted < acc.debitsPosted + acc.debitsPending + amount) { - throw new Error('invalid pending debit amount, insufficient funds') - } - - acc.debitsPending += amount - } - - async voidPendingDebit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid void pending debit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (acc.debitsPending - amount < 0) { - throw new Error('invalid amount, debits pending cannot be less than 0') - } - - acc.debitsPending -= amount - } - - async voidPendingCredit(id: string, amount: bigint): Promise { - if (!this.accounts.has(id)) { - throw new Error('account does not exist') - } - if (amount < 0) { - throw new Error('invalid void pending credit amount') - } - - const acc = this.accounts.get(id) - - if (!acc) { - throw new Error() - } - - if (acc.debitsPending - amount < 0) { - throw new Error('invalid amount, credits pending cannot be less than 0') - } - - acc.creditsPending -= amount - } -} diff --git a/packages/mock-account-service-lib/src/index.ts b/packages/mock-account-service-lib/src/index.ts index 3bb474c228..ec2bdb2298 100644 --- a/packages/mock-account-service-lib/src/index.ts +++ b/packages/mock-account-service-lib/src/index.ts @@ -1,4 +1,4 @@ export { Peering, Account, Config, Webhook, WebhookEventType } from './types' -export { AccountProvider } from './accountProvider' +export { AccountProvider } from './account-provider' export { setupFromSeed } from './setupFromSeed' diff --git a/packages/mock-account-service-lib/src/setupFromSeed.ts b/packages/mock-account-service-lib/src/setupFromSeed.ts index 9832d16f8d..50a82a2615 100644 --- a/packages/mock-account-service-lib/src/setupFromSeed.ts +++ b/packages/mock-account-service-lib/src/setupFromSeed.ts @@ -5,7 +5,7 @@ import { generateJwk } from '@interledger/http-signature-utils' import { createRequesters } from './requesters' import { Config, Account, Peering } from './types' import { Asset, FeeType } from './generated/graphql' -import { AccountProvider } from './accountProvider' +import { AccountProvider } from './account-provider' interface SetupFromSeedOptions { logLevel?: LevelWithSilent diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index cfca6af1c2..3ae69d7811 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -11,7 +11,7 @@ import { OutgoingPayment } from '@interledger/open-payments' import { C9_CONFIG, HLB_CONFIG } from './lib/config' -import { MockASE } from './lib/mockASE' +import { MockASE } from './lib/mock-ase' import { WebhookEventType } from 'mock-account-service-lib' import { parseCookies, poll, pollCondition, wait } from './lib/utils' import { diff --git a/test/integration/lib/MockASE.ts b/test/integration/lib/MockASE.ts deleted file mode 100644 index 8736570d28..0000000000 --- a/test/integration/lib/MockASE.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' -import { - AuthenticatedClient, - createAuthenticatedClient -} from '@interledger/open-payments' -import { AccountProvider, setupFromSeed } from 'mock-account-service-lib' -import { createApolloClient } from './apolloClient' -import { AdminClient } from './adminClient' -import { IntegrationServer } from './integrationServer' -import { TestConfig } from './config' - -/** Mock Account Servicing Entity */ -export class MockASE { - private config: TestConfig - private apolloClient: ApolloClient - - public adminClient: AdminClient - public accounts: AccountProvider - public opClient!: AuthenticatedClient - public integrationServer: IntegrationServer - - // Use .create factory because async construction - public static async create(config: TestConfig): Promise { - const mase = new MockASE(config) - await mase.initAsync() - return mase - } - - // Private to ensure it doesnt get called directly. - // Use static MockASE.create instead. - private constructor(config: TestConfig) { - this.config = config - this.apolloClient = createApolloClient(config.graphqlUrl) - this.adminClient = new AdminClient(this.apolloClient) - this.accounts = new AccountProvider() - this.integrationServer = new IntegrationServer( - this.config, - this.adminClient, - this.accounts - ) - this.integrationServer.start(this.config.integrationServerPort) - } - - private async initAsync() { - await setupFromSeed(this.config, this.apolloClient, this.accounts) - - this.opClient = await createAuthenticatedClient({ - privateKey: this.config.key, - keyId: this.config.keyId, - walletAddressUrl: this.config.walletAddressUrl, - useHttp: true - }) - } - - public async shutdown() { - await this.integrationServer.close() - } -} diff --git a/test/integration/lib/AdminClient.ts b/test/integration/lib/admin-client.ts similarity index 100% rename from test/integration/lib/AdminClient.ts rename to test/integration/lib/admin-client.ts diff --git a/test/integration/lib/adminClient.ts b/test/integration/lib/adminClient.ts deleted file mode 100644 index 6f848d2fcc..0000000000 --- a/test/integration/lib/adminClient.ts +++ /dev/null @@ -1,238 +0,0 @@ -import type { NormalizedCacheObject } from '@apollo/client' -import { ApolloClient, gql } from '@apollo/client' -import { - CreateOutgoingPaymentInput, - CreateQuoteInput, - CreateReceiverInput, - CreateReceiverResponse, - CreateWalletAddressInput, - CreateWalletAddressMutationResponse, - DepositOutgoingPaymentLiquidityInput, - LiquidityMutationResponse, - OutgoingPayment, - OutgoingPaymentResponse, - QuoteResponse -} from './generated/graphql' - -export class AdminClient { - private apolloClient: ApolloClient - - constructor(apolloClient: ApolloClient) { - this.apolloClient = apolloClient - } - - async createReceiver( - input: CreateReceiverInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateReceiver($input: CreateReceiverInput!) { - createReceiver(input: $input) { - code - message - receiver { - completed - createdAt - expiresAt - metadata - id - incomingAmount { - assetCode - assetScale - value - } - walletAddressUrl - receivedAmount { - assetCode - assetScale - value - } - updatedAt - } - success - } - } - `, - variables: { input } - }) - .then(({ data }): CreateReceiverResponse => { - return data.createReceiver - }) - } - - async createQuote(input: CreateQuoteInput): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateQuote($input: CreateQuoteInput!) { - createQuote(input: $input) { - code - message - quote { - createdAt - expiresAt - highEstimatedExchangeRate - id - lowEstimatedExchangeRate - maxPacketAmount - minExchangeRate - walletAddressId - receiveAmount { - assetCode - assetScale - value - } - receiver - debitAmount { - assetCode - assetScale - value - } - } - } - } - `, - variables: { input } - }) - .then(({ data }): QuoteResponse => { - return data.createQuote - }) - } - - async createOutgoingPayment( - input: CreateOutgoingPaymentInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateOutgoingPayment($input: CreateOutgoingPaymentInput!) { - createOutgoingPayment(input: $input) { - code - message - payment { - createdAt - error - metadata - id - walletAddressId - receiveAmount { - assetCode - assetScale - value - } - receiver - debitAmount { - assetCode - assetScale - value - } - sentAmount { - assetCode - assetScale - value - } - state - stateAttempts - } - success - } - } - `, - variables: { input } - }) - .then(({ data }): OutgoingPaymentResponse => { - return data.createOutgoingPayment - }) - } - - async getOutgoingPayment(id: string): Promise { - return await this.apolloClient - .query({ - query: gql` - query GetOutgoingPayment($id: String!) { - outgoingPayment(id: $id) { - createdAt - error - metadata - id - walletAddressId - quote { - id - } - receiveAmount { - assetCode - assetScale - value - } - receiver - debitAmount { - assetCode - assetScale - value - } - sentAmount { - assetCode - assetScale - value - } - state - stateAttempts - } - } - `, - variables: { id } - }) - .then((response): OutgoingPayment => { - return response.data.outgoingPayment - }) - } - - async depositOutgoingPaymentLiquidity( - input: DepositOutgoingPaymentLiquidityInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation DepositOutgoingPaymentLiquidity( - $input: DepositOutgoingPaymentLiquidityInput! - ) { - depositOutgoingPaymentLiquidity(input: $input) { - code - success - message - error - } - } - `, - variables: { input } - }) - .then(({ data }): LiquidityMutationResponse => { - return data.depositOutgoingPaymentLiquidity - }) - } - - async createWalletAddress( - input: CreateWalletAddressInput - ): Promise { - return await this.apolloClient - .mutate({ - mutation: gql` - mutation CreateWalletAddress($input: CreateWalletAddressInput!) { - createWalletAddress(input: $input) { - success - walletAddress { - id - url - publicName - } - } - } - `, - variables: { input } - }) - .then(({ data }): CreateWalletAddressMutationResponse => { - return data.createWalletAddress - }) - } -} diff --git a/test/integration/lib/IntegrationServer.ts b/test/integration/lib/integration-server.ts similarity index 99% rename from test/integration/lib/IntegrationServer.ts rename to test/integration/lib/integration-server.ts index 9cfae4f810..2c0dcd2d76 100644 --- a/test/integration/lib/IntegrationServer.ts +++ b/test/integration/lib/integration-server.ts @@ -8,7 +8,7 @@ import { Webhook } from 'mock-account-service-lib' import { TestConfig } from './config' -import { AdminClient } from './adminClient' +import { AdminClient } from './admin-client' export class IntegrationServer { private config: TestConfig diff --git a/test/integration/lib/integrationServer.ts b/test/integration/lib/integrationServer.ts deleted file mode 100644 index 9cfae4f810..0000000000 --- a/test/integration/lib/integrationServer.ts +++ /dev/null @@ -1,182 +0,0 @@ -import Koa from 'koa' -import bodyParser from '@koa/bodyparser' -import http from 'http' -import { v4 as uuid } from 'uuid' -import { - AccountProvider, - WebhookEventType, - Webhook -} from 'mock-account-service-lib' -import { TestConfig } from './config' -import { AdminClient } from './adminClient' - -export class IntegrationServer { - private config: TestConfig - private app: Koa - private server?: http.Server - public webhookEventHandler: WebhookEventHandler - - constructor( - config: TestConfig, - adminClient: AdminClient, - accounts: AccountProvider - ) { - this.config = config - this.app = new Koa() - this.app.use(bodyParser()) - this.webhookEventHandler = new WebhookEventHandler(adminClient, accounts) - } - - public start(port: number): void { - this.app.use(async (ctx) => { - if (ctx.path === '/webhooks' && ctx.method === 'POST') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { body } = ctx.request as Koa.Request & { body?: any } - - if (this.isWebhookEvent(body)) { - this.webhookEventHandler.handleWebhookEvent(body) - ctx.status = 200 - ctx.body = 'Webhook received' - } else { - ctx.status = 400 - ctx.body = 'Invalid WebhookEvent payload' - } - } - - if (ctx.path === '/rates' && ctx.method === 'GET') { - const { base } = ctx.query - ctx.body = { - base, - rates: { - ...this.config.seed.rates[base as string] - } - } - } - }) - - this.server = this.app.listen(port, () => { - console.log(`Integration server listening on port ${port}`) - }) - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private isWebhookEvent(body: any): body is Webhook { - return ( - typeof body === 'object' && - typeof body.id === 'string' && - typeof body.type === 'string' && - typeof body.data === 'object' - ) - } - - public async close(): Promise { - return new Promise((resolve, reject) => { - if (!this.server) return resolve() - - this.server.close((err) => { - if (err) { - reject(err) - } - - resolve() - }) - }) - } -} - -export class WebhookEventHandler { - private adminClient: AdminClient - private accounts: AccountProvider - - constructor(adminClient: AdminClient, accounts: AccountProvider) { - this.adminClient = adminClient - this.accounts = accounts - } - - public async handleWebhookEvent(webhookEvent: Webhook) { - switch (webhookEvent.type) { - case WebhookEventType.WalletAddressNotFound: - await this.handleWalletAddressNotFound(webhookEvent) - break - case WebhookEventType.IncomingPaymentCreated: - break - case WebhookEventType.OutgoingPaymentCreated: - await this.handleOutgoingPaymentCreated(webhookEvent) - break - case WebhookEventType.OutgoingPaymentCompleted: - break - default: - console.log(`unknown event type: ${webhookEvent.type}`) - } - } - - private async handleWalletAddressNotFound(webhookEvent: Webhook) { - const url = webhookEvent.data['walletAddressUrl'] - - if (!url || typeof url !== 'string') { - throw new Error('No walletAddressUrl found') - } - - const accountPath = new URL(url).pathname.substring(1) - const account = await this.accounts.getByPath(accountPath) - - if (!account) { - throw new Error('No account found for wallet address') - } - - const { assetId, name: publicName } = account - - const response = await this.adminClient.createWalletAddress({ - assetId, - publicName, - url - }) - const { walletAddress } = response - - if (!response.success) { - throw new Error('Failed to create wallet address') - } - if (!walletAddress) { - throw new Error('Could not get wallet address') - } - - await this.accounts.setWalletAddress( - account.id, - walletAddress.id, - walletAddress.url - ) - } - - private async handleOutgoingPaymentCreated(webhookEvent: Webhook) { - const payment = webhookEvent.data - const walletAddressId = payment['walletAddressId'] as string - const account = await this.accounts.getByWalletAddressId(walletAddressId) - - if (!account) { - throw new Error('No account found for wallet address') - } - - if (typeof payment.id !== 'string' || !payment.id) { - throw new Error('No payment id found') - } - - let amount: bigint - try { - amount = BigInt((payment.debitAmount as { value: string }).value) - } catch (err) { - throw new Error('Invalid debitAmount on payment') - } - - await this.accounts.pendingDebit(account.id, amount) - - const response = await this.adminClient.depositOutgoingPaymentLiquidity({ - outgoingPaymentId: payment.id, - idempotencyKey: uuid() - }) - - if (response.code !== '200') { - const msg = 'Deposit outgoing payment liquidity failed' - throw new Error(msg) - } - } -} diff --git a/test/integration/lib/mockASE.ts b/test/integration/lib/mock-ase.ts similarity index 94% rename from test/integration/lib/mockASE.ts rename to test/integration/lib/mock-ase.ts index 8736570d28..5115989475 100644 --- a/test/integration/lib/mockASE.ts +++ b/test/integration/lib/mock-ase.ts @@ -5,8 +5,8 @@ import { } from '@interledger/open-payments' import { AccountProvider, setupFromSeed } from 'mock-account-service-lib' import { createApolloClient } from './apolloClient' -import { AdminClient } from './adminClient' -import { IntegrationServer } from './integrationServer' +import { AdminClient } from './admin-client' +import { IntegrationServer } from './integration-server' import { TestConfig } from './config' /** Mock Account Servicing Entity */