From 3ceb226c9978c566426339a798134b3c389ac277 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Sat, 18 Nov 2023 08:06:15 +0530 Subject: [PATCH 01/53] Initial commit --- .gitignore | 130 ++++++++++++++++++++++++++++++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + 3 files changed, 333 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c6bba591 --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..5462c820 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# graph-service +A service enabling easy interaction with DSNP private and public graphs on Frequency From c8bd4b950323c424df9ce3a2716515e4d485ba19 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Tue, 5 Dec 2023 23:28:09 +0530 Subject: [PATCH 02/53] Scaffolding (#6) * set up boiletplate and scaffolding * scaffolding * fix swagger placeholder --- .dockerignore | 7 + .env.dev | 13 + .eslintrc.json | 64 + .github/workflows/build.yml | 83 + .../common/is-full-release/action.yml | 22 + .github/workflows/release.yml | 78 + .gitignore copy | 6 + .prettierrc | 10 + .tool-versions | 1 + Dockerfile | 26 + Makefile | 33 + README.md | 3 +- apps/api/src/api.controller.ts | 19 + apps/api/src/api.module.ts | 81 + apps/api/src/api.service.ts | 12 + apps/api/src/generate-metadata.ts | 10 + apps/api/src/main.ts | 38 + apps/api/tsconfig.app.json | 9 + dev.Dockerfile | 10 + docker-compose.dev.yaml | 58 + env.template | 14 + .../src/blockchain/blockchain-constants.ts | 41 + .../src/blockchain/blockchain.module.ts | 15 + .../src/blockchain/blockchain.service.spec.ts | 18 + .../src/blockchain/blockchain.service.ts | 129 + libs/common/src/blockchain/create-keys.ts | 15 + libs/common/src/blockchain/event-error.ts | 34 + libs/common/src/blockchain/extrinsic.ts | 83 + libs/common/src/config/config.module.ts | 12 + libs/common/src/config/config.service.spec.ts | 124 + libs/common/src/config/config.service.ts | 58 + libs/common/src/config/env.config.ts | 27 + libs/common/src/constants.ts | 26 + libs/common/src/index.ts | 4 + libs/common/src/utils/base-consumer.ts | 58 + libs/common/src/utils/processing.ts | 8 + libs/common/src/utils/redis.ts | 26 + libs/common/tsconfig.lib.json | 9 + nest-cli.json | 32 + package-lock.json | 15490 ++++++++++++++++ package.json | 144 + swagger.yaml | 13 + tsconfig.build.json | 7 + tsconfig.json | 34 + 44 files changed, 17003 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 .env.dev create mode 100644 .eslintrc.json create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/common/is-full-release/action.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore copy create mode 100644 .prettierrc create mode 100644 .tool-versions create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 apps/api/src/api.controller.ts create mode 100644 apps/api/src/api.module.ts create mode 100644 apps/api/src/api.service.ts create mode 100644 apps/api/src/generate-metadata.ts create mode 100644 apps/api/src/main.ts create mode 100644 apps/api/tsconfig.app.json create mode 100644 dev.Dockerfile create mode 100644 docker-compose.dev.yaml create mode 100644 env.template create mode 100644 libs/common/src/blockchain/blockchain-constants.ts create mode 100644 libs/common/src/blockchain/blockchain.module.ts create mode 100644 libs/common/src/blockchain/blockchain.service.spec.ts create mode 100644 libs/common/src/blockchain/blockchain.service.ts create mode 100644 libs/common/src/blockchain/create-keys.ts create mode 100644 libs/common/src/blockchain/event-error.ts create mode 100644 libs/common/src/blockchain/extrinsic.ts create mode 100644 libs/common/src/config/config.module.ts create mode 100644 libs/common/src/config/config.service.spec.ts create mode 100644 libs/common/src/config/config.service.ts create mode 100644 libs/common/src/config/env.config.ts create mode 100644 libs/common/src/constants.ts create mode 100644 libs/common/src/index.ts create mode 100644 libs/common/src/utils/base-consumer.ts create mode 100644 libs/common/src/utils/processing.ts create mode 100644 libs/common/src/utils/redis.ts create mode 100644 libs/common/tsconfig.lib.json create mode 100644 nest-cli.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 swagger.yaml create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..b1f29d38 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +dist +.env* +env.template diff --git a/.env.dev b/.env.dev new file mode 100644 index 00000000..d152fe73 --- /dev/null +++ b/.env.dev @@ -0,0 +1,13 @@ +# Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development +FREQUENCY_URL=ws://0.0.0.0:9944 +REDIS_URL=redis://0.0.0.0:6379 +QUEUE_HIGH_WATER=1000 +API_PORT=3000 + +# Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. +GRAPH_ENVIRONMENT_TYPE=Dev + +# [NOTE]: The following config is only used for Dev environments. +# Add the graph environment config in JSON format only used for Dev environments. +# Be careful to escape any inner quotes as this is in a .env file. +GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..98fe9ce2 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,64 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "airbnb-base", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "sourceType": "module" + }, + "settings": { + "import/extensions": [ + "error", + "ignorePackages", + { + "js": "never", + "jsx": "never", + "ts": "never", + "tsx": "never" + } + ], + "import/parsers": { + "@typescript-eslint/parser": [".ts", ".tsx"] + }, + "import/resolver": { + "typescript": { + "directory": "./tsconfig.json" + }, + "node": { + "extensions": [".js", ".jsx", ".ts", ".d.ts", ".tsx"] + } + }, + "react": { + "version": "999.99.99" + } + }, + "rules": { + "no-console": "off", + "import/extensions": [ + "error", + "ignorePackages", + { + "js": "never", + "jsx": "never", + "ts": "never", + "tsx": "never" + } + ], + "import/no-unresolved": [2, { "commonjs": true, "amd": true }], + "import/named": 2, + "import/namespace": 2, + "import/default": 2, + "import/export": 2, + "import/prefer-default-export": "off", + "indent": "off", + "no-unused-vars": "off", + "prettier/prettier": 2 + }, + "plugins": ["import", "prettier"] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..cb59d7c8 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,83 @@ +name: Build And Test Graph Service +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + build_Nest_js: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + registry-url: 'https://registry.npmjs.org' + cache-dependency-path: package-lock.json + - name: Install dependencies + run: npm ci + - name: Build Nest.js + run: npm run build + test_jest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + registry-url: 'https://registry.npmjs.org' + cache-dependency-path: package-lock.json + - name: Install dependencies + run: npm ci + - name: Run Jest + run: npm run test + check_licenses: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + registry-url: 'https://registry.npmjs.org' + cache-dependency-path: package-lock.json + - name: Install dependencies + run: npm ci + - name: License Check + # List all the licenses and error out if it is not one of the supported licenses + run: npx license-report --fields=name --fields=licenseType | jq 'map(select(.licenseType | IN("MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "(Apache-2.0 AND MIT)") | not)) | if length == 0 then halt else halt_error(1) end' + + publish: + runs-on: ubuntu-latest + needs: [build_Nest_js, test_jest, check_licenses] + steps: + - uses: actions/checkout@v3 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + registry-url: 'https://registry.npmjs.org' + cache-dependency-path: package-lock.json + - name: Install dependencies + run: npm ci + - name: Generate Swagger UI + run: npm run generate-swagger-ui + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Publish generated swagger.html to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs diff --git a/.github/workflows/common/is-full-release/action.yml b/.github/workflows/common/is-full-release/action.yml new file mode 100644 index 00000000..9e17770c --- /dev/null +++ b/.github/workflows/common/is-full-release/action.yml @@ -0,0 +1,22 @@ +name: Is Full Release? +description: Determines whether the version tag represents a full release +inputs: + version-tag: + description: "Version tag in v#.#.#[-*] format" + required: true +outputs: + is-full-release: + description: "'true' if full release, 'false' otherwise" + value: ${{steps.is-full-release.outputs.is_full_release}} +runs: + using: "composite" + steps: + - name: Full Release? + id: is-full-release + shell: bash + run: | + version_tag=${{inputs.version-tag}} + is_full_release=$([[ "$version_tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]] && \ + echo 'true' || echo 'false') + echo "is_full_release: $is_full_release" + echo "is_full_release=$is_full_release" >> $GITHUB_OUTPUT diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..73427977 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,78 @@ +name: Release +run-name: Cut Release ${{github.event.inputs.release-version || github.ref_name}} +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' # ex. v1.0.0 + - 'v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+' # ex. v1.1.0-rc1 + - 'v0.0.1' # used for testing only + - 'v0.0.1-rc[0-9]+' # used for testing only + workflow_dispatch: + inputs: + release-version: + description: 'Release version (v#.#.#[-rc#])' + required: true + +env: + NEW_RELEASE_TAG_FROM_UI: ${{github.event.inputs.release-version}} + TEST_RUN: ${{startsWith(github.event.inputs.release-version || github.ref_name, 'v0.0.1')}} + DOCKER_HUB_PROFILE: amplicalabs + IMAGE_NAME: graph-service-service + +jobs: + build-and-publish-container-image: + name: Build and publish container image + runs-on: ubuntu-20.04 + container: ghcr.io/libertydsnp/frequency/ci-base-image + steps: + - name: Validate Version Tag + if: env.NEW_RELEASE_TAG_FROM_UI != '' + shell: bash + run: | + version=${{env.NEW_RELEASE_TAG_FROM_UI}} + echo "Release version entered in UI: $version" + regex='^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-rc[1-9]\d*)?$' + if [[ ! $version =~ $regex ]]; then + echo "ERROR: Entered version $version is not valid." + echo "Please use v#.#.#[-rc#] format." + exit 1 + fi + echo "valid-version=true" >> $GITHUB_OUTPUT + - name: Check Out Repo + uses: actions/checkout@v3 + with: + ref: ${{env.NEW_RELEASE_TAG_FROM_UI}} + - name: Set up tags for cp image + id: cp-tags + uses: docker/metadata-action@v4 + with: + flavor: | + latest=auto + prefix=api-,onlatest=true + images: | + ${{env.DOCKER_HUB_PROFILE}}/${{env.IMAGE_NAME}} + tags: | + type=semver,pattern={{version}} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + with: + platforms: | + linux/amd64 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{secrets.DOCKERHUB_USERNAME_FC}} + password: ${{secrets.DOCKERHUB_TOKEN_FC}} + - name: Build and Push graph-service-service Image + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64 + push: ${{env.TEST_RUN != 'true'}} + file: ./Dockerfile + tags: ${{ steps.cp-tags.outputs.tags }} diff --git a/.gitignore copy b/.gitignore copy new file mode 100644 index 00000000..b859bff7 --- /dev/null +++ b/.gitignore copy @@ -0,0 +1,6 @@ +node_modules +dist +.env +.vscode +coverage +.idea diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..8a1a0966 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 180, + "tabWidth": 2, + "useTabs": false +} diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 00000000..8ead549e --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +nodejs 18.16.0 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..131a8896 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +# Use a multi-stage build for efficiency +FROM node:18 AS builder + +WORKDIR /usr/src/app + +COPY package*.json ./ + +RUN npm install + +COPY . . + +# Build the application +RUN npm run build + +# Production stage +FROM node:18 + +WORKDIR /usr/src/app + +COPY --from=builder /usr/src/app/dist ./dist +COPY package*.json ./ + +RUN npm install --only=production +EXPOSE 3000 + +CMD ["sh", "-c", "npm run start:api:prod"] diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..2e2ae091 --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ +###### +###### Build targets +###### + +.PHONY: build +build: build-graph-service + +.PHONY: build-graph-service +build-graph-service: + @(npm run build) + +clean: clean-graph-service + @cat /dev/null + +.PHONY: clean-graph-service +clean-graph-service: + @rm -rf dist + +###### +###### Running apps targets +###### + +.PHONY: start-graph-service +start-graph-service: + @(nest start api --watch) + +###### +###### Misc targets +###### + +.PHONY: lint +lint: + @(npm run lint ) diff --git a/README.md b/README.md index 5462c820..2be17b0f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# graph-service +# Graph-Service + A service enabling easy interaction with DSNP private and public graphs on Frequency diff --git a/apps/api/src/api.controller.ts b/apps/api/src/api.controller.ts new file mode 100644 index 00000000..215298f6 --- /dev/null +++ b/apps/api/src/api.controller.ts @@ -0,0 +1,19 @@ +import { Controller, Get, HttpStatus, Logger } from '@nestjs/common'; +import { ApiService } from './api.service'; + +@Controller('api') +export class ApiController { + private readonly logger: Logger; + + constructor(private apiService: ApiService) { + this.logger = new Logger(this.constructor.name); + } + + // eslint-disable-next-line class-methods-use-this + @Get('health') + health() { + return { + status: HttpStatus.OK, + }; + } +} diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts new file mode 100644 index 00000000..b77dcf65 --- /dev/null +++ b/apps/api/src/api.module.ts @@ -0,0 +1,81 @@ +import { Module } from '@nestjs/common'; +import { EventEmitterModule } from '@nestjs/event-emitter'; +import { BullModule } from '@nestjs/bullmq'; +import { ScheduleModule } from '@nestjs/schedule'; +import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { BullBoardModule } from '@bull-board/nestjs'; +import { ExpressAdapter } from '@bull-board/express'; +import { ApiController } from './api.controller'; +import { ApiService } from './api.service'; +import { ConfigModule } from '../../../libs/common/src/config/config.module'; +import { ConfigService } from '../../../libs/common/src/config/config.service'; +import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; + +@Module({ + imports: [ + ConfigModule, + BlockchainModule, + RedisModule.forRootAsync( + { + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + config: [{ url: configService.redisUrl.toString() }], + }), + inject: [ConfigService], + }, + true, // isGlobal + ), + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: (configService: ConfigService) => { + // Note: BullMQ doesn't honor a URL for the Redis connection, and + // JS URL doesn't parse 'redis://' as a valid protocol, so we fool + // it by changing the URL to use 'http://' in order to parse out + // the host, port, username, password, etc. + // We could pass REDIS_HOST, REDIS_PORT, etc, in the environment, but + // trying to keep the # of environment variables from proliferating + const url = new URL(configService.redisUrl.toString().replace(/^redis[s]*/, 'http')); + const { hostname, port, username, password, pathname } = url; + return { + connection: { + host: hostname || undefined, + port: port ? Number(port) : undefined, + username: username || undefined, + password: password || undefined, + db: pathname?.length > 1 ? Number(pathname.slice(1)) : undefined, + }, + }; + }, + inject: [ConfigService], + }), + + // Bullboard UI + BullBoardModule.forRoot({ + route: '/queues', + adapter: ExpressAdapter, + }), + EventEmitterModule.forRoot({ + // Use this instance throughout the application + global: true, + // set this to `true` to use wildcards + wildcard: false, + // the delimiter used to segment namespaces + delimiter: '.', + // set this to `true` if you want to emit the newListener event + newListener: false, + // set this to `true` if you want to emit the removeListener event + removeListener: false, + // the maximum amount of listeners that can be assigned to an event + maxListeners: 10, + // show event name in memory leak message when more than maximum amount of listeners is assigned + verboseMemoryLeak: false, + // disable throwing uncaughtException if an error event is emitted and it has no listeners + ignoreErrors: false, + }), + ScheduleModule.forRoot(), + ], + providers: [ApiService], + controllers: [ApiController], + exports: [], +}) +export class ApiModule {} diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts new file mode 100644 index 00000000..a73d5819 --- /dev/null +++ b/apps/api/src/api.service.ts @@ -0,0 +1,12 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import Redis from 'ioredis'; + +@Injectable() +export class ApiService { + private readonly logger: Logger; + + constructor(@InjectRedis() private redis: Redis) { + this.logger = new Logger(this.constructor.name); + } +} diff --git a/apps/api/src/generate-metadata.ts b/apps/api/src/generate-metadata.ts new file mode 100644 index 00000000..10f263f1 --- /dev/null +++ b/apps/api/src/generate-metadata.ts @@ -0,0 +1,10 @@ +import { PluginMetadataGenerator } from '@nestjs/cli/lib/compiler/plugins'; +import { ReadonlyVisitor } from '@nestjs/swagger/dist/plugin'; + +const generator = new PluginMetadataGenerator(); +generator.generate({ + visitors: [new ReadonlyVisitor({ introspectComments: true, pathToSource: __dirname })], + outputDir: __dirname, + watch: false, + tsconfigPath: 'apps/api/tsconfig.app.json', +}); diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts new file mode 100644 index 00000000..e67297ca --- /dev/null +++ b/apps/api/src/main.ts @@ -0,0 +1,38 @@ +import { NestFactory } from '@nestjs/core'; +import { Logger, ValidationPipe } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { ApiModule } from './api.module'; + +const logger = new Logger('main'); + +// Monkey-patch BigInt so that JSON.stringify will work +// eslint-disable-next-line +BigInt.prototype['toJSON'] = function () { return this.toString() }; + +async function bootstrap() { + const app = await NestFactory.create(ApiModule, { + logger: process.env.DEBUG ? ['error', 'warn', 'log', 'verbose', 'debug'] : ['error', 'warn', 'log'], + }); + + // Get event emitter & register a shutdown listener + const eventEmitter = app.get(EventEmitter2); + eventEmitter.on('shutdown', async () => { + logger.warn('Received shutdown event'); + await app.close(); + }); + + try { + app.enableShutdownHooks(); + app.useGlobalPipes(new ValidationPipe()); + await app.listen(process.env.API_PORT ?? 3000); + } catch (e) { + await app.close(); + logger.log('****** MAIN CATCH ********'); + logger.error(e); + if (e instanceof Error) { + logger.error(e.stack); + } + } +} + +bootstrap(); diff --git a/apps/api/tsconfig.app.json b/apps/api/tsconfig.app.json new file mode 100644 index 00000000..e2e0b2ff --- /dev/null +++ b/apps/api/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/api" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/dev.Dockerfile b/dev.Dockerfile new file mode 100644 index 00000000..99fcb102 --- /dev/null +++ b/dev.Dockerfile @@ -0,0 +1,10 @@ +FROM node:18 + +WORKDIR /app +COPY . . + +RUN npm install +EXPOSE 3000 +ENV START_PROCESS="api" + +CMD ["sh", "-c", "if [ \"$START_PROCESS\" = \"api\" ]; then npm run start:api; else npm run start:worker; fi"] diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml new file mode 100644 index 00000000..c355efb6 --- /dev/null +++ b/docker-compose.dev.yaml @@ -0,0 +1,58 @@ +version: '3' + +services: + redis: + image: redis:latest + ports: + - 6379:6379 + volumes: + - redis_data:/data/redis + networks: + - graph-service-service + + frequency: + image: frequencychain/instant-seal-node:latest + ports: + - 9944:9944 + profiles: ['', 'instant'] + networks: + - graph-service-service + container_name: frequency + volumes: + - chainstorage:/data + + frequency-interval: + image: frequencychain/instant-seal-node:latest + command: --sealing=interval --sealing-interval 3 --sealing-create-empty-blocks + ports: + - 9944:9944 + profiles: + - 'interval' + networks: + - graph-service-service + container_name: frequency-interval-node + volumes: + - chainstorage:/data + + frequency-manual: + image: frequencychain/instant-seal-node:latest + command: --sealing=manual + ports: + - 9944:9944 + profiles: + - 'manual' + networks: + - graph-service-service + container_name: frequency-manual-node + volumes: + - chainstorage:/data + +volumes: + redis_data: + chainstorage: + external: false + +networks: + graph-service-service: + + diff --git a/env.template b/env.template new file mode 100644 index 00000000..53bada42 --- /dev/null +++ b/env.template @@ -0,0 +1,14 @@ +# Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development +FREQUENCY_URL=ws://0.0.0.0:9944 +REDIS_URL=redis://0.0.0.0:6379 +QUEUE_HIGH_WATER=1000 +API_PORT=3000 + +# Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. +GRAPH_ENVIRONMENT_TYPE=Dev + +# [NOTE]: The following config is only used for Dev environments. +# Add the graph environment config in JSON format only used for Dev environments. +# Be careful to escape any inner quotes as this is in a .env file. +GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' + diff --git a/libs/common/src/blockchain/blockchain-constants.ts b/libs/common/src/blockchain/blockchain-constants.ts new file mode 100644 index 00000000..7172599b --- /dev/null +++ b/libs/common/src/blockchain/blockchain-constants.ts @@ -0,0 +1,41 @@ +export namespace BlockchainConstants { + interface IExtrinsicCall { + pallet: string; + extrinsic: string; + } + + interface IChainEvent { + eventPallet: string; + event: string; + } + + interface IChainQuery { + queryPallet: string; + query: string; + } + + interface IChainRpc { + rpcPallet: string; + rpc: string; + } + const PALLET_FREQ_TX_PYMT = 'frequencyTxPayment'; + const PALLET_STATEFUL_STORAGE = 'statefulStorage'; + + const EX_PAY_CAPACITY_BATCH = 'payWithCapacityBatchAll'; + const EX_UPSERT_PAGE = 'upsertPage'; + + const PAY_WITH_CAPACITY_BATCH: IExtrinsicCall = { pallet: PALLET_FREQ_TX_PYMT, extrinsic: EX_PAY_CAPACITY_BATCH }; + + /** + * The number of blocks to crawl for a given job + * @type {number} + * @memberof BlockchainConstants + * @static + * @readonly + * @public + * @constant + * @description + * The number of blocks to crawl for a given job + */ + export const NUMBER_BLOCKS_TO_CRAWL = 32n; // TODO: take from tx, keeping it constant to default tx mortality +} diff --git a/libs/common/src/blockchain/blockchain.module.ts b/libs/common/src/blockchain/blockchain.module.ts new file mode 100644 index 00000000..facacf9c --- /dev/null +++ b/libs/common/src/blockchain/blockchain.module.ts @@ -0,0 +1,15 @@ +/* +https://docs.nestjs.com/modules +*/ + +import { Module } from '@nestjs/common'; +import { BlockchainService } from './blockchain.service'; +import { ConfigModule } from '../config/config.module'; + +@Module({ + imports: [ConfigModule], + controllers: [], + providers: [BlockchainService], + exports: [BlockchainService], +}) +export class BlockchainModule {} diff --git a/libs/common/src/blockchain/blockchain.service.spec.ts b/libs/common/src/blockchain/blockchain.service.spec.ts new file mode 100644 index 00000000..1a172bf9 --- /dev/null +++ b/libs/common/src/blockchain/blockchain.service.spec.ts @@ -0,0 +1,18 @@ +import { describe, it, beforeEach } from '@jest/globals'; +import { BlockchainService } from './blockchain.service'; + +describe('BlockchainService', () => { + let blockchainService: BlockchainService; + + beforeEach(async () => {}); + + describe('createExtrinsicCall', () => { + it('should return an extrinsic call', async () => { + const pallet = 'messages'; + const extrinsic = 'addIpfsMessage'; + const schemaId = 1; + const cid = 'QmRgJZmR6Z6yB5k9aLXjzJ6jG8L6tq4v4J9zQfDz7p3J9v'; + const payloadLength = 100; + }); + }); +}); diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts new file mode 100644 index 00000000..43f30308 --- /dev/null +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -0,0 +1,129 @@ +/* eslint-disable no-underscore-dangle */ +import { Injectable, Logger, OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common'; +import { ApiPromise, ApiRx, HttpProvider, WsProvider } from '@polkadot/api'; +import { firstValueFrom, from } from 'rxjs'; +import { options } from '@frequency-chain/api-augment'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { BlockHash, BlockNumber, DispatchError, DispatchInfo, Hash, SignedBlock } from '@polkadot/types/interfaces'; +import { SubmittableExtrinsic } from '@polkadot/api/types'; +import { AnyNumber, ISubmittableResult, RegistryError } from '@polkadot/types/types'; +import { u32, Option, u128, u16 } from '@polkadot/types'; +import { PalletCapacityCapacityDetails, PalletCapacityEpochInfo, PalletSchemasSchema } from '@polkadot/types/lookup'; +import { ConfigService } from '../config/config.service'; +import { Extrinsic } from './extrinsic'; + +@Injectable() +export class BlockchainService implements OnApplicationBootstrap, OnApplicationShutdown { + public api: ApiRx; + + public apiPromise: ApiPromise; + + private configService: ConfigService; + + private logger: Logger; + + public async onApplicationBootstrap() { + const providerUrl = this.configService.frequencyUrl!; + let provider: any; + if (/^ws/.test(providerUrl.toString())) { + provider = new WsProvider(providerUrl.toString()); + } else if (/^http/.test(providerUrl.toString())) { + provider = new HttpProvider(providerUrl.toString()); + } else { + this.logger.error(`Unrecognized chain URL type: ${providerUrl.toString()}`); + throw new Error('Unrecognized chain URL type'); + } + this.api = await firstValueFrom(ApiRx.create({ provider, ...options })); + this.apiPromise = await ApiPromise.create({ provider, ...options }); + await Promise.all([firstValueFrom(this.api.isReady), this.apiPromise.isReady]); + this.logger.log('Blockchain API ready.'); + } + + public async isReady(): Promise { + await this.apiPromise.isReady; + return true; + } + + public async onApplicationShutdown(signal?: string | undefined) { + const promises: Promise[] = []; + if (this.api) { + promises.push(this.api.disconnect()); + } + + if (this.apiPromise) { + promises.push(this.apiPromise.disconnect()); + } + await Promise.all(promises); + } + + constructor(configService: ConfigService) { + this.configService = configService; + this.logger = new Logger(this.constructor.name); + } + + public getBlockHash(block: BlockNumber | AnyNumber): Promise { + return firstValueFrom(this.api.rpc.chain.getBlockHash(block)); + } + + public getBlock(block: BlockHash): Promise { + return firstValueFrom(this.api.rpc.chain.getBlock(block)); + } + + public async getLatestFinalizedBlockHash(): Promise { + return (await this.apiPromise.rpc.chain.getFinalizedHead()) as BlockHash; + } + + public async getLatestFinalizedBlockNumber(): Promise { + return (await this.apiPromise.rpc.chain.getBlock()).block.header.number.toBigInt(); + } + + public async getBlockNumberForHash(hash: string): Promise { + const block = await this.apiPromise.rpc.chain.getBlock(hash); + if (block) { + return block.block.header.number.toNumber(); + } + + this.logger.error(`No block found corresponding to hash ${hash}`); + return undefined; + } + + public createType(type: string, ...args: (any | undefined)[]) { + return this.api.registry.createType(type, ...args); + } + + public createExtrinsicCall({ pallet, extrinsic }: { pallet: string; extrinsic: string }, ...args: (any | undefined)[]): SubmittableExtrinsic<'rxjs', ISubmittableResult> { + return this.api.tx[pallet][extrinsic](...args); + } + + public createExtrinsic( + { pallet, extrinsic }: { pallet: string; extrinsic: string }, + { eventPallet, event }: { eventPallet?: string; event?: string }, + keys: KeyringPair, + ...args: (any | undefined)[] + ): Extrinsic { + const targetEvent = eventPallet && event ? this.api.events[eventPallet][event] : undefined; + return new Extrinsic(this.api, this.api.tx[pallet][extrinsic](...args), keys, targetEvent); + } + + public rpc(pallet: string, rpc: string, ...args: (any | undefined)[]): Promise { + return this.apiPromise.rpc[pallet][rpc](...args); + } + + public query(pallet: string, extrinsic: string, ...args: (any | undefined)[]): Promise { + return args ? this.apiPromise.query[pallet][extrinsic](...args) : this.apiPromise.query[pallet][extrinsic](); + } + + public async queryAt(blockHash: BlockHash, pallet: string, extrinsic: string, ...args: (any | undefined)[]): Promise { + const newApi = await this.apiPromise.at(blockHash); + return newApi.query[pallet][extrinsic](...args); + } + + public async getNonce(account: Uint8Array): Promise { + return this.rpc('system', 'accountNextIndex', account); + } + + public async getSchema(schemaId: number): Promise { + const schema: PalletSchemasSchema = await this.query('schemas', 'schemas', schemaId); + return schema; + } +} diff --git a/libs/common/src/blockchain/create-keys.ts b/libs/common/src/blockchain/create-keys.ts new file mode 100644 index 00000000..b6fca978 --- /dev/null +++ b/libs/common/src/blockchain/create-keys.ts @@ -0,0 +1,15 @@ +import { Keyring } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; + +// eslint-disable-next-line import/no-mutable-exports +export let keyring: Keyring; + +export function createKeys(uri: string): KeyringPair { + if (!keyring) { + keyring = new Keyring({ type: 'sr25519' }); + } + + const keys = keyring.addFromUri(uri); + + return keys; +} diff --git a/libs/common/src/blockchain/event-error.ts b/libs/common/src/blockchain/event-error.ts new file mode 100644 index 00000000..fdaedcd2 --- /dev/null +++ b/libs/common/src/blockchain/event-error.ts @@ -0,0 +1,34 @@ +import { DispatchError } from '@polkadot/types/interfaces'; +import { SpRuntimeDispatchError } from '@polkadot/types/lookup'; + +export class EventError extends Error { + name: string = ''; + + message: string = ''; + + stack?: string = ''; + + section?: string = ''; + + rawError: DispatchError | SpRuntimeDispatchError; + + constructor(source: DispatchError | SpRuntimeDispatchError) { + super(); + + if (source.isModule) { + const decoded = source.registry.findMetaError(source.asModule); + this.name = decoded.name; + this.message = decoded.docs.join(' '); + this.section = decoded.section; + } else { + this.name = source.type; + this.message = source.type; + this.section = ''; + } + this.rawError = source; + } + + public toString() { + return `${this.section}.${this.name}: ${this.message}`; + } +} diff --git a/libs/common/src/blockchain/extrinsic.ts b/libs/common/src/blockchain/extrinsic.ts new file mode 100644 index 00000000..d40cdc13 --- /dev/null +++ b/libs/common/src/blockchain/extrinsic.ts @@ -0,0 +1,83 @@ +/** + * These helpers return a map of events, some of which contain useful data, some of which don't. + * Extrinsics that "create" records typically contain an ID of the entity they created, and this + * would be a useful value to return. However, this data seems to be nested inside an array of arrays. + * + * Ex: schemaId = events["schemas.SchemaCreated"][] + * + * To get the value associated with an event key, we would need to query inside that nested array with + * a set of arbitrary indices. Should an object at any level of that querying be undefined, the helper + * will throw an unchecked exception. + * + * To get type checking and cast a returned event as a specific event type, you can utilize TypeScripts + * type guard functionality like so: + * + * const msaCreatedEvent = events.defaultEvent; + * if (this.api.events.msa.MsaCreated.is(msaCreatedEvent)) { + * msaId = msaCreatedEvent.data.msaId; + * } + * + * Normally, I'd say the best experience is for the helper to return both the ID of the created entity + * along with a map of emitted events. But in this case, returning that value will increase the complexity + * of each helper, since each would have to check for undefined values at every lookup. So, this may be + * a rare case when it is best to simply return the map of emitted events and trust the user to look them + * up in the test. + */ + +import { ApiRx } from '@polkadot/api'; +import { SubmittableExtrinsic, ApiTypes, AugmentedEvent } from '@polkadot/api/types'; +import { Call, Event, EventRecord, Hash } from '@polkadot/types/interfaces'; +import { IsEvent } from '@polkadot/types/metadata/decorate/types'; +import { Codec, ISubmittableResult, AnyTuple } from '@polkadot/types/types'; +import { filter, firstValueFrom, map, pipe, tap } from 'rxjs'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { EventError } from './event-error'; + +export type EventMap = { [key: string]: Event }; + +function eventKey(event: Event): string { + return `${event.section}.${event.method}`; +} + +export type ParsedEventResult = [any, EventMap]; + +export class Extrinsic { + private event?: IsEvent; + + private extrinsic: SubmittableExtrinsic<'rxjs', T>; + + // private call: Call; + private keys: KeyringPair; + + public api: ApiRx; + + constructor(api: ApiRx, extrinsic: SubmittableExtrinsic<'rxjs', T>, keys: KeyringPair, targetEvent?: IsEvent) { + this.extrinsic = extrinsic; + this.keys = keys; + this.event = targetEvent; + this.api = api; + } + + public get targetEvent() { + return this.event; + } + + public signAndSend(nonce?: number): Promise<[Hash, EventMap]> { + return firstValueFrom(this.extrinsic.signAndSend(this.keys, { nonce })).then(({ status, events, txHash }) => { + if (status.isFinalized || status.isInBlock) { + const eventMap: EventMap = {}; + events.forEach((record: EventRecord) => { + const { event } = record; + eventMap[eventKey(event)] = event; + }); + return [txHash, eventMap]; + } + return [txHash, {}]; + }); + } + + public getCall(): Call { + const call = this.api.createType('Call', this.extrinsic); + return call; + } +} diff --git a/libs/common/src/config/config.module.ts b/libs/common/src/config/config.module.ts new file mode 100644 index 00000000..0b28661f --- /dev/null +++ b/libs/common/src/config/config.module.ts @@ -0,0 +1,12 @@ +import { ConfigModule as NestConfigModule } from '@nestjs/config'; +import { Module } from '@nestjs/common'; +import { ConfigService } from './config.service'; +import { configModuleOptions } from './env.config'; + +@Module({ + imports: [NestConfigModule.forRoot(configModuleOptions)], + controllers: [], + providers: [ConfigService], + exports: [ConfigService], +}) +export class ConfigModule {} diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts new file mode 100644 index 00000000..ea3eedee --- /dev/null +++ b/libs/common/src/config/config.service.spec.ts @@ -0,0 +1,124 @@ +/* eslint-disable import/no-extraneous-dependencies */ +/* +https://docs.nestjs.com/fundamentals/testing#unit-testing +*/ + +import { Test } from '@nestjs/testing'; +import { describe, it, expect, beforeAll, jest } from '@jest/globals'; +import { ConfigModule } from '@nestjs/config'; +import { ConfigService } from './config.service'; +import { configModuleOptions } from './env.config'; + +const setupConfigService = async (envObj: any): Promise => { + jest.resetModules(); + Object.keys(process.env).forEach((key) => { + delete process.env[key]; + }); + process.env = { + ...envObj, + }; + const moduleRef = await Test.createTestingModule({ + imports: [ + ConfigModule.forRoot({ + ...configModuleOptions, + ignoreEnvFile: true, + load: [() => process.env], + }), + ], + controllers: [], + providers: [ConfigService], + }).compile(); + + await ConfigModule.envVariablesLoaded; + + return moduleRef.get(ConfigService); +}; + +describe('GraphSericeConfig', () => { + const ALL_ENV: { [key: string]: string | undefined } = { + REDIS_URL: undefined, + FREQUENCY_URL: undefined, + QUEUE_HIGH_WATER: undefined, + API_PORT: undefined, + GRAPH_ENVIRONMENT_TYPE: undefined, + GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, + }; + + beforeAll(() => { + Object.keys(ALL_ENV).forEach((key) => { + ALL_ENV[key] = process.env[key]; + }); + }); + + describe('invalid environment', () => { + it('missing redis url should fail', async () => { + const { REDIS_URL: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ ...env })).rejects.toBeDefined(); + }); + + it('invalid redis url should fail', async () => { + const { REDIS_URL: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ REDIS_URL: 'invalid url', ...env })).rejects.toBeDefined(); + }); + + it('missing frequency url should fail', async () => { + const { FREQUENCY_URL: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ ...env })).rejects.toBeDefined(); + }); + + it('invalid frequency url should fail', async () => { + const { FREQUENCY_URL: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ FREQUENCY_URL: 'invalid url', ...env })).rejects.toBeDefined(); + }); + + it('invalid api port should fail', async () => { + const { API_PORT: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ API_PORT: -1, ...env })).rejects.toBeDefined(); + }); + + it('missing graph environment dev config should fail', async () => { + const { GRAPH_ENVIRONMENT_TYPE: dummy, GRAPH_ENVIRONMENT_DEV_CONFIG: dummy2, ...env } = ALL_ENV; + await expect(setupConfigService({ GRAPH_ENVIRONMENT_TYPE: 'Dev', GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, ...env })).rejects.toBeDefined(); + }); + + it('invalid graph environment dev config should fail', async () => { + const { GRAPH_ENVIRONMENT_TYPE: dummy, GRAPH_ENVIRONMENT_DEV_CONFIG: dummy2, ...env } = ALL_ENV; + await expect(setupConfigService({ GRAPH_ENVIRONMENT_TYPE: 'Dev', GRAPH_ENVIRONMENT_DEV_CONFIG: 'invalid json', ...env })).rejects.toBeDefined(); + }); + }); + + describe('valid environment', () => { + let graphServiceConfig: ConfigService; + beforeAll(async () => { + graphServiceConfig = await setupConfigService(ALL_ENV); + }); + + it('should be defined', () => { + expect(graphServiceConfig).toBeDefined(); + }); + + it('should get redis url', () => { + expect(graphServiceConfig.redisUrl?.toString()).toStrictEqual(ALL_ENV.REDIS_URL?.toString()); + }); + + it('should get frequency url', () => { + expect(graphServiceConfig.frequencyUrl?.toString()).toStrictEqual(ALL_ENV.FREQUENCY_URL?.toString()); + }); + + it('should get queue high water mark', () => { + expect(graphServiceConfig.getQueueHighWater()).toStrictEqual(parseInt(ALL_ENV.QUEUE_HIGH_WATER as string, 10)); + }); + + it('should get api port', () => { + expect(graphServiceConfig.getApiPort()).toStrictEqual(parseInt(ALL_ENV.API_PORT as string, 10)); + }); + + it('should get graph environment type', () => { + expect(graphServiceConfig.getGraphEnvironmentType()).toStrictEqual(ALL_ENV.GRAPH_ENVIRONMENT_TYPE); + }); + + it('should get graph environment dev config', () => { + expect(graphServiceConfig.getGraphEnvironmentConfig()).toStrictEqual(ALL_ENV.GRAPH_ENVIRONMENT_DEV_CONFIG); + }); + }); +}); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts new file mode 100644 index 00000000..316e5e2a --- /dev/null +++ b/libs/common/src/config/config.service.ts @@ -0,0 +1,58 @@ +/* +https://docs.nestjs.com/providers#services +*/ + +import { EnvironmentType } from '@dsnp/graph-sdk'; +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService as NestConfigService } from '@nestjs/config'; + +export interface ConfigEnvironmentVariables { + REDIS_URL: URL; + FREQUENCY_URL: URL; + QUEUE_HIGH_WATER: number; + API_PORT: number; + GRAPH_ENVIRONMENT_TYPE: keyof EnvironmentType; + GRAPH_ENVIRONMENT_DEV_CONFIG?: string; +} + +/// Config service to get global app and provider-specific config values. +@Injectable() +export class ConfigService { + private logger: Logger; + + constructor(private nestConfigService: NestConfigService) { + this.logger = new Logger(this.constructor.name); + } + + public getQueueHighWater(): number { + return this.nestConfigService.get('QUEUE_HIGH_WATER')!; + } + + public getApiPort(): number { + return this.nestConfigService.get('API_PORT')!; + } + + public getRedisUrl(): URL { + return this.nestConfigService.get('REDIS_URL')!; + } + + public getFrequencyUrl(): URL { + return this.nestConfigService.get('FREQUENCY_URL')!; + } + + public getGraphEnvironmentType(): keyof EnvironmentType { + return this.nestConfigService.get('GRAPH_ENVIRONMENT_TYPE')!; + } + + public getGraphEnvironmentConfig(): string { + return this.nestConfigService.get('GRAPH_ENVIRONMENT_DEV_CONFIG')!; + } + + public get redisUrl(): URL { + return this.nestConfigService.get('REDIS_URL')!; + } + + public get frequencyUrl(): URL { + return this.nestConfigService.get('FREQUENCY_URL')!; + } +} diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts new file mode 100644 index 00000000..ef8896d7 --- /dev/null +++ b/libs/common/src/config/env.config.ts @@ -0,0 +1,27 @@ +import Joi from 'joi'; +import { ConfigModuleOptions } from '@nestjs/config'; + +export const configModuleOptions: ConfigModuleOptions = { + isGlobal: true, + validationSchema: Joi.object({ + REDIS_URL: Joi.string().uri().required(), + FREQUENCY_URL: Joi.string().uri().required(), + QUEUE_HIGH_WATER: Joi.number().min(100).default(1000), + API_PORT: Joi.number().min(0).default(3000), + GRAPH_ENVIRONMENT_TYPE: Joi.string().required().valid('Mainnet', 'Rococo', 'Dev'), + // GRAPH_ENVIRONMENT_DEV_CONFIG is optional, but if it is set, it must be a valid JSON string + GRAPH_ENVIRONMENT_DEV_CONFIG: Joi.string().when('GRAPH_ENVIRONMENT_TYPE', { + is: 'Dev', + then: Joi.string() + .required() + .custom((value: string, helpers) => { + try { + JSON.parse(value); + } catch (e) { + return helpers.error('any.invalid'); + } + return value; + }), + }), + }), +}; diff --git a/libs/common/src/constants.ts b/libs/common/src/constants.ts new file mode 100644 index 00000000..c9856cdd --- /dev/null +++ b/libs/common/src/constants.ts @@ -0,0 +1,26 @@ +/** + * Number of seconds to create a block in Frequency chain + */ +export const SECONDS_PER_BLOCK = 12; +/** + * Name of timeout event used for in memory scheduler + */ +export const CAPACITY_EPOCH_TIMEOUT_NAME = 'capacity-epoch-timeout'; + +/** + * Last seen block number key for Redis + * @type {string} + */ +export const LAST_SEEN_BLOCK_NUMBER_SCANNER_KEY: string = 'lastSeenBlockNumberScanner'; + +/** + * Filters and Events to watch key for Redis + * @type {string} + */ +export const EVENTS_TO_WATCH_KEY: string = 'eventsToWatch'; + +/** + * Registered Webhook key for Redis + * @type {string} + */ +export const REGISTERED_WEBHOOK_KEY: string = 'registeredWebhook'; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts new file mode 100644 index 00000000..69b6b73b --- /dev/null +++ b/libs/common/src/index.ts @@ -0,0 +1,4 @@ +export * from './utils/processing'; +export * from './utils/redis'; +export * from './utils/base-consumer'; +export * from './constants'; diff --git a/libs/common/src/utils/base-consumer.ts b/libs/common/src/utils/base-consumer.ts new file mode 100644 index 00000000..cc752f09 --- /dev/null +++ b/libs/common/src/utils/base-consumer.ts @@ -0,0 +1,58 @@ +import { OnWorkerEvent, WorkerHost } from '@nestjs/bullmq'; +import { Logger, OnModuleDestroy } from '@nestjs/common'; +import { Job, Worker } from 'bullmq'; +import { ProcessingUtils } from './processing'; + +export abstract class BaseConsumer extends WorkerHost implements OnModuleDestroy { + protected logger: Logger; + + private actives: Set; + + protected constructor() { + super(); + this.logger = new Logger(this.constructor.name); + this.actives = new Set(); + } + + trackJob(jobId: string) { + this.actives.add(jobId); + } + + unTrackJob(jobId: string) { + this.actives.delete(jobId); + } + + async onModuleDestroy(): Promise { + await this.worker?.close(false); + let maxWaitMs = ProcessingUtils.MAX_WAIT_FOR_GRACE_FULL_SHUTDOWN_MS; + while (this.actives.size > 0 && maxWaitMs > 0) { + // eslint-disable-next-line no-await-in-loop + await ProcessingUtils.delay(ProcessingUtils.DELAY_TO_CHECK_FOR_SHUTDOWN_MS); + maxWaitMs -= ProcessingUtils.DELAY_TO_CHECK_FOR_SHUTDOWN_MS; + } + } + + /** + * any method overriding this method should call this method directly, so we are able to track the executing jobs + */ + @OnWorkerEvent('active') + onActive(job: Job) { + this.trackJob(job.id!); + } + + /** + * any method overriding this method should call this method directly, so we are able to track the executing jobs + */ + @OnWorkerEvent('completed') + onCompleted(job: Job) { + this.unTrackJob(job.id!); + } + + /** + * any method overriding this method should call this method directly, so we are able to track the executing jobs + */ + @OnWorkerEvent('failed') + onFailed(job: Job) { + this.unTrackJob(job.id!); + } +} diff --git a/libs/common/src/utils/processing.ts b/libs/common/src/utils/processing.ts new file mode 100644 index 00000000..060fa6b6 --- /dev/null +++ b/libs/common/src/utils/processing.ts @@ -0,0 +1,8 @@ +export namespace ProcessingUtils { + export const MAX_WAIT_FOR_GRACE_FULL_SHUTDOWN_MS = 6 * 1000; + export const DELAY_TO_CHECK_FOR_SHUTDOWN_MS = 300; + export async function delay(ms): Promise { + // eslint-disable-next-line no-promise-executor-return + return new Promise((resolve) => setTimeout(resolve, ms)); + } +} diff --git a/libs/common/src/utils/redis.ts b/libs/common/src/utils/redis.ts new file mode 100644 index 00000000..80c9c7e9 --- /dev/null +++ b/libs/common/src/utils/redis.ts @@ -0,0 +1,26 @@ +export namespace RedisUtils { + /** + * 45 days upper limit to avoid keeping abandoned data forever + */ + export const STORAGE_EXPIRE_UPPER_LIMIT_SECONDS = 45 * 24 * 60 * 60; + /** + * batch Lock expire time which applies during closing operation + */ + export const BATCH_LOCK_EXPIRE_SECONDS = 6; + /** + * To be able to provide mostly unique nonces to submit transactions on chain we would need to check a number of + * temporarily locked keys on redis side and get the first available one. This number defines the number of keys + * we should look into before giving up + */ + export const NUMBER_OF_NONCE_KEYS_TO_CHECK = 50; + /** + * Nonce keys have to get expired shortly so that if any of nonce numbers get skipped we would still have a way to + * submit them after expiration + */ + export const NONCE_KEY_EXPIRE_SECONDS = 2; + const CHAIN_NONCE_KEY = 'chain:nonce'; + + export function getNonceKey(suffix: string) { + return `${CHAIN_NONCE_KEY}:${suffix}`; + } +} diff --git a/libs/common/tsconfig.lib.json b/libs/common/tsconfig.lib.json new file mode 100644 index 00000000..8fdbf52b --- /dev/null +++ b/libs/common/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/common" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/nest-cli.json b/nest-cli.json new file mode 100644 index 00000000..b7cbf061 --- /dev/null +++ b/nest-cli.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "apps/api/src", + "compilerOptions": { + "deleteOutDir": true, + "webpack": true, + "tsConfigPath": "apps/api/tsconfig.app.json" + }, + "monorepo": true, + "root": "apps/api", + "projects": { + "common": { + "type": "library", + "root": "libs/common", + "entryFile": "index", + "sourceRoot": "libs/common/src", + "compilerOptions": { + "tsConfigPath": "libs/common/tsconfig.lib.json" + } + }, + "api": { + "type": "application", + "root": "apps/api", + "entryFile": "main", + "sourceRoot": "apps/api/src", + "compilerOptions": { + "tsConfigPath": "apps/api/tsconfig.app.json" + } + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..89c6a713 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15490 @@ +{ + "name": "graph-service", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "graph-service", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@bull-board/api": "^5.8.3", + "@bull-board/express": "^5.8.3", + "@bull-board/nestjs": "^5.8.3", + "@bull-board/ui": "^5.8.3", + "@dsnp/frequency-schemas": "^1.0.2", + "@dsnp/graph-sdk": "^1.0.1", + "@frequency-chain/api-augment": "1.7.0", + "@jest/globals": "^29.5.0", + "@liaoliaots/nestjs-redis": "^9.0.5", + "@multiformats/blake2": "^1.0.13", + "@nestjs/axios": "^2.0.0", + "@nestjs/bullmq": "^10.0.0", + "@nestjs/cli": "^10.1.14", + "@nestjs/common": "^9.4.0", + "@nestjs/config": "^2.3.1", + "@nestjs/core": "^9.4.0", + "@nestjs/event-emitter": "^1.4.1", + "@nestjs/platform-express": "^9.4.0", + "@nestjs/schedule": "^3.0.3", + "@nestjs/swagger": "^7.1.8", + "@nestjs/testing": "^9.4.0", + "@nestjs/typeorm": "^9.0.1", + "@polkadot/api": "^10.9.1", + "@polkadot/api-base": "^10.9.1", + "@polkadot/keyring": "^12.3.2", + "@polkadot/types": "^10.9.1", + "@polkadot/util": "^12.3.2", + "@polkadot/util-crypto": "^12.3.2", + "@types/multer": "^1.4.7", + "@types/uuid": "^9.0.2", + "axios": "^1.3.6", + "bullmq": "^3.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "ioredis": "^5.3.2", + "joi": "^17.9.1", + "mime-types": "^2.1.35", + "multiformats": "9.9.0", + "rxjs": "^7.8.1", + "time-constants": "^1.0.3" + }, + "devDependencies": { + "@polkadot/typegen": "10.9.1", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.2", + "@types/node": "^20.3.1", + "@types/supertest": "^2.0.12", + "@types/time-constants": "^1.0.0", + "@typescript-eslint/parser": "^5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "dotenv": "^16.3.1", + "eslint": "^8.42.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-nestjs": "^1.2.3", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1", + "ioredis-mock": "^8.8.3", + "jest": "^29.5.0", + "license-report": "^6.4.0", + "nock": "^13.3.8", + "prettier": "^3.0.2", + "redoc-cli": "^0.13.21", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "trace-unhandled": "^2.0.1", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.0.tgz", + "integrity": "sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@angular-devkit/core/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.0.tgz", + "integrity": "sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==", + "dependencies": { + "@angular-devkit/core": "16.2.0", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-16.2.0.tgz", + "integrity": "sha512-f3HjrDvSrRMvESogLsqsZXsEg//trIBySCHRXCglPrWLVdBbIRctGOhXqZoclRxXimIKUx14zLsOWzDwZG8+HQ==", + "dependencies": { + "@angular-devkit/core": "16.2.0", + "@angular-devkit/schematics": "16.2.0", + "ansi-colors": "4.1.3", + "inquirer": "8.2.4", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "license": "MIT" + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.3", + "license": "MIT", + "peer": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@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.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@bull-board/api": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-5.8.3.tgz", + "integrity": "sha512-xiVSXc99WQIhrsXTo/rCVxmV9uphyJA4a6ytBP7RyTGO/+IGTg7zLo2yrnYdv3p8RYw4YzdJ4aY1E+MgP5mj8Q==", + "dependencies": { + "redis-info": "^3.0.8" + }, + "peerDependencies": { + "@bull-board/ui": "5.8.3" + } + }, + "node_modules/@bull-board/express": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-5.8.3.tgz", + "integrity": "sha512-zZicV35gRfnojtx+Ypg02xuk/JSSmfDaMUgGbrXfXKvq1OdQCKPkhIa9uPyHP6a7d/QLHKqzQFgJknqgQVBkxw==", + "dependencies": { + "@bull-board/api": "5.8.3", + "@bull-board/ui": "5.8.3", + "ejs": "3.1.7", + "express": "4.17.3" + } + }, + "node_modules/@bull-board/express/node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bull-board/express/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@bull-board/express/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/express/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/@bull-board/express/node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/@bull-board/express/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bull-board/express/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@bull-board/express/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bull-board/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/@bull-board/express/node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@bull-board/express/node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bull-board/express/node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@bull-board/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/@bull-board/express/node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@bull-board/express/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/nestjs": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-5.8.3.tgz", + "integrity": "sha512-Jyr9EhHrsv1OsjZlJeInHrTR5u3UVoEYbT2WLRr1YmQmQlqIbjMjH2B7G+E6JKk5jggVEJkLi06gSN8lV9y6uw==", + "dependencies": { + "@nestjs/bull-shared": "^10.0.0" + }, + "peerDependencies": { + "@bull-board/api": "^5.8.3", + "@bull-board/express": "^5.8.3", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.1" + } + }, + "node_modules/@bull-board/ui": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-5.8.3.tgz", + "integrity": "sha512-pQhmboukRZccs6WaTkRVGPZucL1ND8/+7JdK1pNKa0RVGVkpshH7QaHdfI30DR0h/Jv/VFaenWV1vS3KnvqeHw==", + "dependencies": { + "@bull-board/api": "5.8.3" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@dsnp/frequency-schemas": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@dsnp/frequency-schemas/-/frequency-schemas-1.0.2.tgz", + "integrity": "sha512-+u2Fwv9aYbMn7MI5LbiDn92dWK+YxcJJEwdy6r/wdQwFVz/jZtE5lR56KqPYS2piun/vINMJU+HNZUVYL4zkOg==", + "dependencies": { + "@frequency-chain/api-augment": "0.0.0-45e306", + "@polkadot/api": "^10.7.3", + "json-stringify-pretty-compact": "^4.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.0.4" + }, + "optionalDependencies": { + "@dsnp/parquetjs": "^1.3.0" + } + }, + "node_modules/@dsnp/frequency-schemas/node_modules/@frequency-chain/api-augment": { + "version": "0.0.0-45e306", + "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-0.0.0-45e306.tgz", + "integrity": "sha512-VzZIFwMX8LaY6dJfzsJ6t9WKZ28DzGA4+lEKys0OR6O+CIAV/fVWNb8FaHG9c6It0GmSz2Os0ehvn5p/rgWfug==", + "dependencies": { + "@polkadot/api": "^10.7.3", + "@polkadot/rpc-provider": "^10.7.3", + "@polkadot/types": "^10.7.3" + } + }, + "node_modules/@dsnp/graph-sdk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.0.1.tgz", + "integrity": "sha512-kzrk0OpCLRzcIpqrKiC4Ij+qyxYEp9wDmHgp70eIBRd+gQup2nZHNesHppi4Ua7HdENd20a6k+KCaRIqvcVAOw==", + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/@dsnp/parquetjs": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@dsnp/parquetjs/-/parquetjs-1.3.4.tgz", + "integrity": "sha512-DKRtMi+EZaoF/IUalz0UhSqRJ4P2/SCcL1aTwCJ5ZAgZGKFHKvOUYcCjM2XrMlsykfKcL3IMlJ4EZZONCGmRIQ==", + "optional": true, + "dependencies": { + "@types/long": "^4.0.2", + "@types/node-int64": "^0.4.29", + "@types/thrift": "^0.10.11", + "browserify-zlib": "^0.2.0", + "bson": "4.6.3", + "cross-fetch": "^3.1.4", + "int53": "^0.2.4", + "long": "^4.0.0", + "snappyjs": "^0.6.1", + "thrift": "0.16.0", + "varint": "^6.0.0", + "wasm-brotli": "^2.0.2", + "xxhash-wasm": "^1.0.2" + }, + "engines": { + "node": ">=16.15.1" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.42.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@frequency-chain/api-augment": { + "version": "1.7.0", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api": "^10.7.3", + "@polkadot/rpc-provider": "^10.7.3", + "@polkadot/types": "^10.7.3" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@ioredis/as-callback": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@ioredis/as-callback/-/as-callback-3.0.0.tgz", + "integrity": "sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg==", + "dev": true + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@kessler/tableify": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@liaoliaots/nestjs-redis": { + "version": "9.0.5", + "license": "MIT", + "dependencies": { + "tslib": "2.4.1" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "ioredis": "^5.0.0" + } + }, + "node_modules/@liaoliaots/nestjs-redis/node_modules/tslib": { + "version": "2.4.1", + "license": "0BSD" + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@multiformats/blake2": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@multiformats/blake2/-/blake2-1.0.13.tgz", + "integrity": "sha512-T1Kzya0wjj85CaVeRSpJ858EnSvW1pw94GSitxYf84VsNdv5XYbJ6QG8y26Ft1bVALzrUCmqkQrR53QHSyu6RA==", + "dependencies": { + "blakejs": "^1.1.1", + "multiformats": "^9.5.4" + } + }, + "node_modules/@nestjs/axios": { + "version": "2.0.0", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "axios": "^1.3.1", + "reflect-metadata": "^0.1.12", + "rxjs": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@nestjs/bull-shared": { + "version": "10.0.0", + "license": "MIT", + "dependencies": { + "tslib": "2.5.3" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@nestjs/bullmq": { + "version": "10.0.0", + "license": "MIT", + "dependencies": { + "@nestjs/bull-shared": "^10.0.0", + "tslib": "2.5.3" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "bullmq": "^3.0.0" + } + }, + "node_modules/@nestjs/cli": { + "version": "10.1.14", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.1.14.tgz", + "integrity": "sha512-oxfoebzrq6g+MKc6FRx2O8D86Vk0ViEmlP4B1E3dzwC3X5yjxlA1IDulLrVz3VIpGjuyuXmrQjjd8l0NUVZiKg==", + "dependencies": { + "@angular-devkit/core": "16.2.0", + "@angular-devkit/schematics": "16.2.0", + "@angular-devkit/schematics-cli": "16.2.0", + "@nestjs/schematics": "^10.0.1", + "chalk": "4.1.2", + "chokidar": "3.5.3", + "cli-table3": "0.6.3", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "8.0.0", + "inquirer": "8.2.6", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "os-name": "4.0.1", + "rimraf": "4.4.1", + "shelljs": "0.8.5", + "source-map-support": "0.5.21", + "tree-kill": "1.2.2", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.1.0", + "typescript": "5.1.6", + "webpack": "5.88.2", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.62" + }, + "peerDependenciesMeta": { + "@swc/cli": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nestjs/cli/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/common": { + "version": "9.4.3", + "license": "MIT", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.5.3", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "cache-manager": "<=5", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "cache-manager": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/config": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "dotenv": "16.1.4", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^6.0.0 || ^7.2.0" + } + }, + "node_modules/@nestjs/config/node_modules/dotenv": { + "version": "16.1.4", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/@nestjs/core": { + "version": "9.4.3", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.2.0", + "tslib": "2.5.3", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/microservices": "^9.0.0", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/websockets": "^9.0.0", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/event-emitter": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "eventemitter2": "6.4.9" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.12" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express": { + "version": "9.4.3", + "license": "MIT", + "dependencies": { + "body-parser": "1.20.2", + "cors": "2.8.5", + "express": "4.18.2", + "multer": "1.4.4-lts.1", + "tslib": "2.5.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0" + } + }, + "node_modules/@nestjs/schedule": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-3.0.3.tgz", + "integrity": "sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==", + "dependencies": { + "cron": "2.4.1", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.12" + } + }, + "node_modules/@nestjs/schematics": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.0.2.tgz", + "integrity": "sha512-DaZZjymYoIfRqC5W62lnYXIIods1PDY6CGc8+IpRwyinzffjKxZ3DF3exu+mdyvllzkXo9DTXkoX4zOPSJHCkw==", + "dependencies": { + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", + "comment-json": "4.2.3", + "jsonc-parser": "3.2.0", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.8.tgz", + "integrity": "sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.8.tgz", + "integrity": "sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==", + "dependencies": { + "@angular-devkit/core": "16.1.8", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/schematics/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nestjs/schematics/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@nestjs/schematics/node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nestjs/schematics/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nestjs/swagger": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.8.tgz", + "integrity": "sha512-Jpl3laGAqvyWccc3auLU0mMjl5hJ2kqzzDb63ynJi5NMbFlgBwrR8FCGBVstSsqL9YSJWLR4L1BZzVmVExcY+g==", + "dependencies": { + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.3.1" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "9.4.3", + "license": "MIT", + "dependencies": { + "tslib": "2.5.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "@nestjs/microservices": "^9.0.0", + "@nestjs/platform-express": "^9.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/typeorm": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "uuid": "8.3.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, + "node_modules/@nestjs/typeorm/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/node-fetch": { + "version": "2.6.11", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@polkadot/api": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api-augment": "10.9.1", + "@polkadot/api-base": "10.9.1", + "@polkadot/api-derive": "10.9.1", + "@polkadot/keyring": "^12.3.1", + "@polkadot/rpc-augment": "10.9.1", + "@polkadot/rpc-core": "10.9.1", + "@polkadot/rpc-provider": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-augment": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/types-create": "10.9.1", + "@polkadot/types-known": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "eventemitter3": "^5.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/api-augment": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api-base": "10.9.1", + "@polkadot/rpc-augment": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-augment": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/api-base": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/rpc-core": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/util": "^12.3.1", + "rxjs": "^7.8.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/api-derive": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api": "10.9.1", + "@polkadot/api-augment": "10.9.1", + "@polkadot/api-base": "10.9.1", + "@polkadot/rpc-core": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "rxjs": "^7.8.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/keyring": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "12.3.2", + "@polkadot/util-crypto": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "12.3.2", + "@polkadot/util-crypto": "12.3.2" + } + }, + "node_modules/@polkadot/networks": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "12.3.2", + "@substrate/ss58-registry": "^1.40.0", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/rpc-augment": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/rpc-core": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/rpc-core": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/rpc-augment": "10.9.1", + "@polkadot/rpc-provider": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/util": "^12.3.1", + "rxjs": "^7.8.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/rpc-provider": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/keyring": "^12.3.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-support": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "@polkadot/x-fetch": "^12.3.1", + "@polkadot/x-global": "^12.3.1", + "@polkadot/x-ws": "^12.3.1", + "eventemitter3": "^5.0.1", + "mock-socket": "^9.2.1", + "nock": "^13.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@substrate/connect": "0.7.26" + } + }, + "node_modules/@polkadot/typegen": { + "version": "10.9.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api": "10.9.1", + "@polkadot/api-augment": "10.9.1", + "@polkadot/rpc-augment": "10.9.1", + "@polkadot/rpc-provider": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-augment": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/types-create": "10.9.1", + "@polkadot/types-support": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "@polkadot/x-ws": "^12.3.1", + "handlebars": "^4.7.7", + "tslib": "^2.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "polkadot-types-chain-info": "scripts/polkadot-types-chain-info.mjs", + "polkadot-types-from-chain": "scripts/polkadot-types-from-chain.mjs", + "polkadot-types-from-defs": "scripts/polkadot-types-from-defs.mjs", + "polkadot-types-internal-interfaces": "scripts/polkadot-types-internal-interfaces.mjs", + "polkadot-types-internal-metadata": "scripts/polkadot-types-internal-metadata.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/keyring": "^12.3.1", + "@polkadot/types-augment": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/types-create": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "rxjs": "^7.8.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types-augment": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types-codec": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "^12.3.1", + "@polkadot/x-bigint": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types-codec/node_modules/@polkadot/x-bigint": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types-create": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types-known": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/networks": "^12.3.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/types-create": "10.9.1", + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/types-support": { + "version": "10.9.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/util": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-bigint": "12.3.2", + "@polkadot/x-global": "12.3.2", + "@polkadot/x-textdecoder": "12.3.2", + "@polkadot/x-textencoder": "12.3.2", + "@types/bn.js": "^5.1.1", + "bn.js": "^5.2.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/util-crypto": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@polkadot/networks": "12.3.2", + "@polkadot/util": "12.3.2", + "@polkadot/wasm-crypto": "^7.2.1", + "@polkadot/wasm-util": "^7.2.1", + "@polkadot/x-bigint": "12.3.2", + "@polkadot/x-randomvalues": "12.3.2", + "@scure/base": "1.1.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "12.3.2" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/wasm-bridge": { + "version": "7.2.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-util": "7.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/wasm-crypto": { + "version": "7.2.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-bridge": "7.2.1", + "@polkadot/wasm-crypto-asmjs": "7.2.1", + "@polkadot/wasm-crypto-init": "7.2.1", + "@polkadot/wasm-crypto-wasm": "7.2.1", + "@polkadot/wasm-util": "7.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/wasm-crypto-init": { + "version": "7.2.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-bridge": "7.2.1", + "@polkadot/wasm-crypto-asmjs": "7.2.1", + "@polkadot/wasm-crypto-wasm": "7.2.1", + "@polkadot/wasm-util": "7.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-bigint": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/util/node_modules/@polkadot/x-bigint": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "7.2.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "7.2.1", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-util": "7.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-util": { + "version": "7.2.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/x-fetch": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "node-fetch": "^3.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/x-global": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/x-randomvalues": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@polkadot/util": "12.3.2", + "@polkadot/wasm-util": "*" + } + }, + "node_modules/@polkadot/x-textdecoder": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/x-textencoder": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/x-ws": { + "version": "12.3.2", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "12.3.2", + "tslib": "^2.5.3", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.8", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.3", + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "license": "MIT", + "peer": true + }, + "node_modules/@substrate/connect": { + "version": "0.7.26", + "license": "GPL-3.0-only", + "optional": true, + "dependencies": { + "@substrate/connect-extension-protocol": "^1.0.1", + "eventemitter3": "^4.0.7", + "smoldot": "1.0.4" + } + }, + "node_modules/@substrate/connect-extension-protocol": { + "version": "1.0.1", + "license": "GPL-3.0-only", + "optional": true + }, + "node_modules/@substrate/connect/node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT", + "optional": true + }, + "node_modules/@substrate/ss58-registry": { + "version": "1.40.0", + "license": "Apache-2.0" + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/ioredis-mock": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ioredis-mock/-/ioredis-mock-8.2.2.tgz", + "integrity": "sha512-bnbPHOjxy4TUDjRh61MMoK2QvDNZqrMDXJYrEDZP/HPFvBubR24CQ0DBi5lgWhLxG4lvVsXPRDXtZ03+JgonoQ==", + "dev": true, + "peer": true, + "dependencies": { + "ioredis": ">=5" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "optional": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + }, + "node_modules/@types/node-int64": { + "version": "0.4.29", + "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz", + "integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "optional": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", + "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/thrift": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@types/thrift/-/thrift-0.10.13.tgz", + "integrity": "sha512-zNapgGgZP2tOC8zhS10LPKdJxH+U0owZ1WWwDZASgyb5HZGj03P4Wm+Yd3YDXDQEjSRqO2XQznUH13tcG4dkIA==", + "optional": true, + "dependencies": { + "@types/node": "*", + "@types/node-int64": "*", + "@types/q": "*" + } + }, + "node_modules/@types/time-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.2.tgz", + "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==" + }, + "node_modules/@types/validator": { + "version": "13.7.17", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.9", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.11", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.8", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { + "version": "5.59.8", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.11", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT", + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "optional": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "license": "MIT", + "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.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-or-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz", + "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==", + "optional": true + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "optional": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserify-zlib/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "optional": true + }, + "node_modules/browserslist": { + "version": "4.21.8", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001502", + "electron-to-chromium": "^1.4.428", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.3.tgz", + "integrity": "sha512-rAqP5hcUVJhXP2MCSNVsf0oM2OGU1So6A9pVRDYayvJ5+hygXHQApf87wd5NlhPM1J9RJnbqxIG/f8QTzRoQ4A==", + "optional": true, + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/bson/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bullmq": { + "version": "3.15.8", + "license": "MIT", + "dependencies": { + "cron-parser": "^4.6.0", + "glob": "^8.0.3", + "ioredis": "^5.3.2", + "lodash": "^4.17.21", + "msgpackr": "^1.6.2", + "semver": "^7.3.7", + "tslib": "^2.0.0", + "uuid": "^9.0.0" + } + }, + "node_modules/bullmq/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/bullmq/node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/bullmq/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-manager": { + "version": "4.1.0", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "async": "3.2.3", + "lodash.clonedeep": "^4.5.0", + "lru-cache": "^7.10.1" + } + }, + "node_modules/cache-manager/node_modules/lru-cache": { + "version": "7.18.3", + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001502", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "license": "MIT" + }, + "node_modules/class-validator": { + "version": "0.14.0", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", + "validator": "^13.7.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "license": "ISC", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "2.15.3", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/cron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.1.tgz", + "integrity": "sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==", + "dependencies": { + "luxon": "^3.2.1" + } + }, + "node_modules/cron-parser": { + "version": "4.8.1", + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "optional": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.429", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eol": { + "version": "0.9.1", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "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.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "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-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.42.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-nestjs": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "npm": ">=3" + } + }, + "node_modules/eslint-plugin-nestjs/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.9", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "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.11.0", + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fengari": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.4.tgz", + "integrity": "sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", + "dev": true, + "dependencies": { + "readline-sync": "^1.4.9", + "sprintf-js": "^1.1.1", + "tmp": "^0.0.33" + } + }, + "node_modules/fengari-interop": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fengari-interop/-/fengari-interop-0.1.3.tgz", + "integrity": "sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==", + "dev": true, + "peerDependencies": { + "fengari": "^0.1.0" + } + }, + "node_modules/fengari/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/globals": { + "version": "13.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/haxec": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/haxec/-/haxec-2.0.1.tgz", + "integrity": "sha512-2DaSqGZIzgVkZ4YFHbk9Su0Q6gm7YbzNX9njOHK/D/XklOdvgTemsPmjcyExlLdkl7lRlNIW0Wxo6niVfpWedw==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "spawn-wrap": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/int53": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/int53/-/int53-0.2.4.tgz", + "integrity": "sha512-a5jlKftS7HUOhkUyYD7j2sJ/ZnvWiNlZS1ldR+g1ifQ+/UuZXIE+YTc/lK1qGj/GwAU5F8Z0e1eVq2t1J5Ob2g==", + "optional": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ioredis": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis-mock": { + "version": "8.8.3", + "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-8.8.3.tgz", + "integrity": "sha512-LkF17WIyYkPfUhvp0fjIZ+HKhILEoq1J2b71vv+9EOW054UlkySVEvgQ2RolXM+eI759MteHtXQvv0oRn0lkUg==", + "dev": true, + "dependencies": { + "@ioredis/as-callback": "^3.0.0", + "@ioredis/commands": "^1.2.0", + "fengari": "^0.1.4", + "fengari-interop": "^0.1.3", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12.22" + }, + "peerDependencies": { + "@types/ioredis-mock": "^8", + "ioredis": "^5" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "optional": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-circus": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "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 + } + } + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.9.2", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.10.34", + "license": "MIT" + }, + "node_modules/license-report": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@kessler/tableify": "^1.0.2", + "debug": "^4.3.4", + "eol": "^0.9.1", + "got": "^12.6.0", + "rc": "^1.2.8", + "semver": "^7.3.8", + "tablemark": "^3.0.0", + "text-table": "^0.2.0", + "visit-values": "^2.0.0" + }, + "bin": { + "license-report": "index.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "optional": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/macos-release": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mock-socket": { + "version": "9.2.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.9.5", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.2", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.7" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" + } + }, + "node_modules/multer": { + "version": "1.4.4-lts.1", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/mz": { + "version": "2.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/nock": { + "version": "13.3.8", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.8.tgz", + "integrity": "sha512-96yVFal0c/W1lG7mmfRe7eO+hovrhJYd2obzzOZ90f6fjpeU/XNvd9cYHZKZAQJumDfhXgoTpkpJ9pvMj+hqHw==", + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.0.7", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.12", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "license": "(MIT AND Zlib)", + "optional": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "license": "MIT", + "peer": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "license": "MIT", + "peer": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "3.2.0", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.5.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "optional": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redis": { + "version": "4.6.7", + "license": "MIT", + "optional": true, + "peer": true, + "workspaces": [ + "./packages/*" + ], + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.8", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.3", + "@redis/time-series": "1.0.4" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-info": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redis-info/-/redis-info-3.1.0.tgz", + "integrity": "sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==", + "dependencies": { + "lodash": "^4.17.11" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli": { + "version": "0.13.21", + "resolved": "https://registry.npmjs.org/redoc-cli/-/redoc-cli-0.13.21.tgz", + "integrity": "sha512-pjuPf0HkKqo9qtoHxMK4x5dhC/lJ08O0hO0rJISbSRCf19bPBjQ5lb2mHRu9j6vypTMltyaLtFIfVNveuyF5fQ==", + "dev": true, + "hasShrinkwrap": true, + "dependencies": { + "boxen": "5.1.2", + "chokidar": "^3.5.1", + "handlebars": "^4.7.7", + "mkdirp": "^1.0.4", + "mobx": "^6.3.2", + "node-libs-browser": "^2.2.1", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "redoc": "2.0.0", + "styled-components": "^5.3.0", + "yargs": "^17.3.1" + }, + "bin": { + "redoc-cli": "index.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/redoc-cli/node_modules/@babel/generator": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", + "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/redoc-cli/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/redoc-cli/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/redoc-cli/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/redoc-cli/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/redoc-cli/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/redoc-cli/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/redoc-cli/node_modules/@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dev": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/redoc-cli/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@exodus/schemasafe": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", + "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/redoc-cli/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/redoc-cli/node_modules/@redocly/ajv": { + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.4.tgz", + "integrity": "sha512-y9qNj0//tZtWB2jfXNK3BX18BSBp9zNR7KE7lMysVHwbZtY392OJCjm6Rb/h4UHH2r1AqjNEHFD6bRn+DqU9Mw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/redoc-cli/node_modules/@redocly/openapi-core": { + "version": "1.0.0-beta.105", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.105.tgz", + "integrity": "sha512-8uYDMcqBOPhFgjRlg5uetW/E2uTVVRpk+YsJhaH78ZNuzBkQP5Waw5s8P8ym6myvHs5me8l5AdniY/ePLMT5xg==", + "dev": true, + "dependencies": { + "@redocly/ajv": "^8.6.4", + "@types/node": "^14.11.8", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/redoc-cli/node_modules/@redocly/openapi-core/node_modules/@types/node": { + "version": "14.18.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz", + "integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/redoc-cli/node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/redoc-cli/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/@types/mkdirp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", + "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", + "extraneous": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/redoc-cli/node_modules/@types/node": { + "version": "15.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/redoc-cli/node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/redoc-cli/node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/redoc-cli/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/redoc-cli/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/redoc-cli/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/redoc-cli/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/redoc-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/redoc-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/redoc-cli/node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/redoc-cli/node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/redoc-cli/node_modules/babel-plugin-styled-components": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz", + "integrity": "sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-module-imports": "^7.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/redoc-cli/node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/redoc-cli/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/redoc-cli/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/redoc-cli/node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/redoc-cli/node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/redoc-cli/node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/redoc-cli/node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/redoc-cli/node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redoc-cli/node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/redoc-cli/node_modules/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/redoc-cli/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/redoc-cli/node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redoc-cli/node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/caniuse-lite": { + "version": "1.0.30001390", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001390.tgz", + "integrity": "sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "peer": true + }, + "node_modules/redoc-cli/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/redoc-cli/node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/redoc-cli/node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/redoc-cli/node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/redoc-cli/node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/redoc-cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/redoc-cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/core-js": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", + "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/redoc-cli/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/redoc-cli/node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/redoc-cli/node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/redoc-cli/node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/redoc-cli/node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "dev": true, + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/redoc-cli/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/redoc-cli/node_modules/decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha1-/UPHNelnuAEzBohKVvvmZZlraBc=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/redoc-cli/node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/redoc-cli/node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/redoc-cli/node_modules/dompurify": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.5.tgz", + "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/electron-to-chromium": { + "version": "1.4.242", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.242.tgz", + "integrity": "sha512-nPdgMWtjjWGCtreW/2adkrB2jyHjClo9PtVhR6rW+oxa4E4Wom642Tn+5LslHP3XPL5MCpkn5/UEY60EXylNeQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/redoc-cli/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/redoc-cli/node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/redoc-cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/redoc-cli/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/redoc-cli/node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/redoc-cli/node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/redoc-cli/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/redoc-cli/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/redoc-cli/node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/redoc-cli/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/redoc-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/redoc-cli/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redoc-cli/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/redoc-cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redoc-cli/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/redoc-cli/node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/redoc-cli/node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/redoc-cli/node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/redoc-cli/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/redoc-cli/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redoc-cli/node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/redoc-cli/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dev": true, + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/redoc-cli/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/redoc-cli/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/redoc-cli/node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha1-GA8fnr74sOY45BZq1S24eb6y/8U=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/marked": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.15.tgz", + "integrity": "sha512-esX5lPdTfG4p8LDkv+obbRCyOKzB+820ZZyMOXJZygZBHrH9b3xXR64X4kT3sPe9Nx8qQXbmcz6kFSMt4Nfk6Q==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/redoc-cli/node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/redoc-cli/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/redoc-cli/node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/redoc-cli/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/redoc-cli/node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/redoc-cli/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/redoc-cli/node_modules/mobx": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.3.2.tgz", + "integrity": "sha512-xGPM9dIE1qkK9Nrhevp0gzpsmELKU4MFUJRORW/jqxVFIHHWIoQrjDjL8vkwoJYY3C2CeVJqgvl38hgKTalTWg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/redoc-cli/node_modules/mobx-react": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.2.1.tgz", + "integrity": "sha512-LZS99KFLn75VWDXPdRJhILzVQ7qLcRjQbzkK+wVs0Qg4kWw5hOI2USp7tmu+9zP9KYsVBmKyx2k/8cTTBfsymw==", + "dev": true, + "dependencies": { + "mobx-react-lite": "^3.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/redoc-cli/node_modules/mobx-react-lite": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.3.tgz", + "integrity": "sha512-7exWp1FV0M9dP08H9PIeHlJqDw4IdkQVRMfLYaZFMmlbzSS6ZU6p/kx392KN+rVf81hH3IQYewvRGQ70oiwmbw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/redoc-cli/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/redoc-cli/node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/redoc-cli/node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/redoc-cli/node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=", + "dev": true, + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/redoc-cli/node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/redoc-cli/node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "dev": true, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/openapi-sampler": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.0.tgz", + "integrity": "sha512-2QfjK1oM9Sv0q82Ae1RrUe3yfFmAyjF548+6eAeb+h/cL1Uj51TW4UezraBEvwEdzoBgfo4AaTLVFGTKj+yYDw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "json-pointer": "0.6.2" + } + }, + "node_modules/redoc-cli/node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/redoc-cli/node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/redoc-cli/node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/redoc-cli/node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/polished": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.4.tgz", + "integrity": "sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/redoc-cli/node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/redoc-cli/node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/redoc-cli/node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/redoc-cli/node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/redoc-cli/node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/redoc-cli/node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/redoc-cli/node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/redoc-cli/node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/redoc-cli/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/redoc-cli/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "peer": true + }, + "node_modules/redoc-cli/node_modules/react-tabs": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", + "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", + "dev": true, + "dependencies": { + "clsx": "^1.1.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0-0" + } + }, + "node_modules/redoc-cli/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/redoc-cli/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/redoc-cli/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redoc-cli/node_modules/redoc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz", + "integrity": "sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag==", + "dev": true, + "dependencies": { + "@redocly/openapi-core": "^1.0.0-beta.104", + "classnames": "^2.3.1", + "decko": "^1.2.0", + "dompurify": "^2.2.8", + "eventemitter3": "^4.0.7", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.0.15", + "mobx-react": "^7.2.0", + "openapi-sampler": "^1.3.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.1.3", + "prismjs": "^1.27.0", + "prop-types": "^15.7.2", + "react-tabs": "^3.2.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "style-loader": "^3.3.1", + "swagger2openapi": "^7.0.6", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0", + "styled-components": "^4.1.1 || ^5.1.1" + } + }, + "node_modules/redoc-cli/node_modules/redoc/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/redoc-cli/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/redoc-cli/node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/redoc-cli/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/redoc-cli/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/redoc-cli/node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/redoc-cli/node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/redoc-cli/node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/redoc-cli/node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/redoc-cli/node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/redoc-cli/node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/redoc-cli/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redoc-cli/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/redoc-cli/node_modules/stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/redoc-cli/node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/redoc-cli/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/redoc-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/redoc-cli/node_modules/styled-components": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.0.tgz", + "integrity": "sha512-bPJKwZCHjJPf/hwTJl6TbkSZg/3evha+XPEizrZUGb535jLImwDUdjTNxXqjjaASt2M4qO4AVfoHJNe3XB/tpQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/redoc-cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/redoc-cli/node_modules/terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/redoc-cli/node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/redoc-cli/node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/redoc-cli/node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redoc-cli/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/redoc-cli/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redoc-cli/node_modules/uglify-js": { + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz", + "integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/redoc-cli/node_modules/update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/redoc-cli/node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/redoc-cli/node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/redoc-cli/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/redoc-cli/node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/redoc-cli/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/redoc-cli/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/redoc-cli/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/redoc-cli/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/redoc-cli/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc-cli/node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/redoc-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/redoc-cli/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/redoc-cli/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/redoc-cli/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/redoc-cli/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redoc-cli/node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true + }, + "node_modules/redoc-cli/node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/redoc-cli/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT", + "peer": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "license": "(MIT AND BSD-3-Clause)", + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smoldot": { + "version": "1.0.4", + "license": "GPL-3.0-or-later WITH Classpath-exception-2.0", + "optional": true, + "dependencies": { + "pako": "^2.0.4", + "ws": "^8.8.1" + } + }, + "node_modules/snappyjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==", + "optional": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/split-text-to-chunks": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^5.0.1", + "minimist": "^1.2.0" + }, + "bin": { + "wordwrap": "cli.js" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.3.1.tgz", + "integrity": "sha512-El78OvXp9zMasfPrshtkW1CRx8AugAKoZuGGOTW+8llJzOV1RtDJYqQRz/6+2OakjeWWnZuRlN2Qj1Y0ilux3w==" + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tablemark": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "sentence-case": "^3.0.4", + "split-text-to-chunks": "^1.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "license": "MIT", + "peer": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thrift": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/thrift/-/thrift-0.16.0.tgz", + "integrity": "sha512-W8DpGyTPlIaK3f+e1XOCLxefaUWXtrOXAaVIDbfYhmVyriYeAKgsBVFNJUV1F9SQ2SPt2sG44AZQxSGwGj/3VA==", + "optional": true, + "dependencies": { + "browser-or-node": "^1.2.1", + "isomorphic-ws": "^4.0.1", + "node-int64": "^0.4.0", + "q": "^1.5.0", + "ws": "^5.2.3" + }, + "engines": { + "node": ">= 10.18.0" + } + }, + "node_modules/thrift/node_modules/ws": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "optional": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/time-constants": { + "version": "1.0.3", + "license": "ISC" + }, + "node_modules/titleize": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/trace-unhandled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/trace-unhandled/-/trace-unhandled-2.0.1.tgz", + "integrity": "sha512-wOZbhBiNyuZTs0b/ADZFTiTDVVDsvKQj/RkVJTKefH6u9CowGDSR+H/3miaGUrYCCuzS0nVmIzpbIIm6lRF8gg==", + "dev": true, + "dependencies": { + "haxec": "^2.0.1" + }, + "bin": { + "trace-unhandled": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-jest": { + "version": "29.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-loader": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.5.3", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/typeorm": { + "version": "0.3.16", + "license": "MIT", + "peer": true, + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^8.1.0", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^5.2.0", + "mssql": "^9.1.1", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.6", + "license": "MIT", + "peer": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/validator": { + "version": "13.9.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "optional": true + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/visit-values": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/walker": { + "version": "1.0.8", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wasm-brotli": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/wasm-brotli/-/wasm-brotli-2.0.2.tgz", + "integrity": "sha512-DgjRlpZz9z5br4TjQHSlDHRF9NIuGXHUj3AqO08koDCXz7EYzmPDb7T/6oar5UKLYgPp9Yxc2ImGpx4BMFwbNQ==", + "optional": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "license": "MIT", + "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 + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "optional": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..455ce4fa --- /dev/null +++ b/package.json @@ -0,0 +1,144 @@ +{ + "name": "graph-service", + "version": "0.1.0", + "description": "Graph Service enabling handling of users graph data on the Frequency Network", + "main": "dist/apps/api/main.js", + "scripts": { + "build": "nest build", + "build:swagger": "npx ts-node apps/api/src/generate-metadata.ts", + "generate-swagger-ui": "redoc-cli bundle swagger.yaml --output=./docs/index.html", + "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", + "start:api": "nest start api", + "start:api:prod": "node dist/apps/api/main.js", + "start:api:dev": "set -a ; . .env ; nest start api", + "start:api:debug": "set -a ; . .env ; nest start api --debug --watch", + "docker-build": "docker build -t graph-service-service .", + "docker-build:dev": "docker-compose -f docker-compose.dev.yaml build", + "docker-run": " build -t graph-service-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-service-deploy", + "docker-run:dev": "docker-compose -f docker-compose.dev.yaml up -d ; docker-compose -f docker-compose.dev.yaml logs", + "docker-stop:dev": "docker-compose -f docker-compose.dev.yaml stop", + "clean": "rm -Rf dist", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "pretest": "cp env.template .env", + "test": "jest --coverage --verbose" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/AmplicaLabs/graph-service-service.git" + }, + "keywords": [], + "author": "", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/AmplicaLabs/graph-service-service/issues" + }, + "homepage": "https://github.com/AmplicaLabs/graph-service-service#readme", + "dependencies": { + "@bull-board/api": "^5.8.3", + "@bull-board/express": "^5.8.3", + "@bull-board/nestjs": "^5.8.3", + "@bull-board/ui": "^5.8.3", + "@dsnp/frequency-schemas": "^1.0.2", + "@dsnp/graph-sdk": "^1.0.1", + "@frequency-chain/api-augment": "1.7.0", + "@jest/globals": "^29.5.0", + "@liaoliaots/nestjs-redis": "^9.0.5", + "@multiformats/blake2": "^1.0.13", + "@nestjs/axios": "^2.0.0", + "@nestjs/bullmq": "^10.0.0", + "@nestjs/cli": "^10.1.14", + "@nestjs/common": "^9.4.0", + "@nestjs/config": "^2.3.1", + "@nestjs/core": "^9.4.0", + "@nestjs/event-emitter": "^1.4.1", + "@nestjs/platform-express": "^9.4.0", + "@nestjs/schedule": "^3.0.3", + "@nestjs/swagger": "^7.1.8", + "@nestjs/testing": "^9.4.0", + "@nestjs/typeorm": "^9.0.1", + "@polkadot/api": "^10.9.1", + "@polkadot/api-base": "^10.9.1", + "@polkadot/keyring": "^12.3.2", + "@polkadot/types": "^10.9.1", + "@polkadot/util": "^12.3.2", + "@polkadot/util-crypto": "^12.3.2", + "@types/multer": "^1.4.7", + "@types/uuid": "^9.0.2", + "axios": "^1.3.6", + "bullmq": "^3.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "ioredis": "^5.3.2", + "joi": "^17.9.1", + "mime-types": "^2.1.35", + "multiformats": "9.9.0", + "rxjs": "^7.8.1", + "time-constants": "^1.0.3" + }, + "devDependencies": { + "@polkadot/typegen": "10.9.1", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.2", + "@types/node": "^20.3.1", + "@types/supertest": "^2.0.12", + "@types/time-constants": "^1.0.0", + "@typescript-eslint/parser": "^5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "dotenv": "^16.3.1", + "eslint": "^8.42.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-nestjs": "^1.2.3", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1", + "ioredis-mock": "^8.8.3", + "jest": "^29.5.0", + "license-report": "^6.4.0", + "nock": "^13.3.8", + "prettier": "^3.0.2", + "redoc-cli": "^0.13.21", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "trace-unhandled": "^2.0.1", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.3" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": ".", + "setupFiles": [ + "dotenv/config" + ], + "testRegex": ".*\\.spec\\.ts$", + "testPathIgnorePatterns": [ + ".*\\.mock\\.spec\\.ts$" + ], + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "./coverage", + "testEnvironment": "node", + "roots": [ + "/apps/", + "/libs/" + ], + "moduleNameMapper": { + "^@graph-service-common(|/.*)$": "/libs/common/src/$1" + } + } +} diff --git a/swagger.yaml b/swagger.yaml new file mode 100644 index 00000000..fdf36fd1 --- /dev/null +++ b/swagger.yaml @@ -0,0 +1,13 @@ +openapi: 3.0.0 +description: 'Graph Service API' +info: + title: Graph Service API + version: 0.1.0 +paths: + /api/health: + get: + operationId: ApiController_health + parameters: [] + responses: + '200': + description: '' diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..c460c168 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "./**/*.ts" + ], + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..8b70d256 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "baseUrl": "./src", + "esModuleInterop": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "module": "CommonJS", + "moduleResolution": "node", + "noImplicitAny": false, + "noImplicitThis": false, + "outDir": "dist", + "paths": { + "#app/*": [ + "*" + ], + "@app/common": [ + "libs/common/src" + ], + "@app/common/*": [ + "libs/common/src/*" + ] + }, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "skipLibCheck": true, + "strictPropertyInitialization": false, + "target": "es2021", + "typeRoots": [ + "node_modules/@types" + ] + } +} \ No newline at end of file From 3dd429b237efb2db0bec07af4bdeada39c27fdcb Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Wed, 13 Dec 2023 18:04:21 +0530 Subject: [PATCH 03/53] Add API definitions and placeholder endpoints, set swagger and deploy to gh pages (#12) * define surface level fetch api * add provider graph dtos * placeholder api to update a users graph via API call * cleanups * watch graph dto and endpoint * add swagger endpoint, updated swagger file and finalize initial APIs * swagger, metadata, deploy to pages for discussion * update apis and swagger, make graph key as optional input * nonce service (#14) * add return type to get graph using DSNPGraphEdge --- .env.dev | 1 + apps/api/src/api.controller.ts | 74 +++++++- apps/api/src/main.ts | 2 + apps/api/src/metadata.ts | 13 ++ env.template | 2 +- libs/common/src/config/config.service.spec.ts | 5 + libs/common/src/config/config.service.ts | 5 + libs/common/src/config/env.config.ts | 1 + libs/common/src/config/swagger_config.ts | 26 +++ libs/common/src/dtos/connection.type.dto.ts | 5 + libs/common/src/dtos/connections.dto.ts | 22 +++ libs/common/src/dtos/direction.dto.ts | 6 + libs/common/src/dtos/graph.key.pair.dto.ts | 17 ++ libs/common/src/dtos/graph.query.dto.ts | 13 ++ libs/common/src/dtos/key.type.dto.ts | 5 + libs/common/src/dtos/privacy.type.dto.ts | 5 + libs/common/src/dtos/provider.graph.dto.ts | 21 +++ libs/common/src/dtos/user.graph.dto.ts | 7 + libs/common/src/dtos/watch-graphs.dto.ts | 12 ++ libs/common/src/index.ts | 9 + libs/common/src/utils/nonce.service.ts | 57 ++++++ lua/addToBatch.lua | 37 ++++ lua/incrementNonce.lua | 26 +++ lua/lockBatch.lua | 53 ++++++ swagger.yaml | 170 +++++++++++++++++- 25 files changed, 587 insertions(+), 7 deletions(-) create mode 100644 apps/api/src/metadata.ts create mode 100644 libs/common/src/config/swagger_config.ts create mode 100644 libs/common/src/dtos/connection.type.dto.ts create mode 100644 libs/common/src/dtos/connections.dto.ts create mode 100644 libs/common/src/dtos/direction.dto.ts create mode 100644 libs/common/src/dtos/graph.key.pair.dto.ts create mode 100644 libs/common/src/dtos/graph.query.dto.ts create mode 100644 libs/common/src/dtos/key.type.dto.ts create mode 100644 libs/common/src/dtos/privacy.type.dto.ts create mode 100644 libs/common/src/dtos/provider.graph.dto.ts create mode 100644 libs/common/src/dtos/user.graph.dto.ts create mode 100644 libs/common/src/dtos/watch-graphs.dto.ts create mode 100644 libs/common/src/utils/nonce.service.ts create mode 100644 lua/addToBatch.lua create mode 100644 lua/incrementNonce.lua create mode 100644 lua/lockBatch.lua diff --git a/.env.dev b/.env.dev index d152fe73..fbb0f87f 100644 --- a/.env.dev +++ b/.env.dev @@ -11,3 +11,4 @@ GRAPH_ENVIRONMENT_TYPE=Dev # Add the graph environment config in JSON format only used for Dev environments. # Be careful to escape any inner quotes as this is in a .env file. GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' +PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" diff --git a/apps/api/src/api.controller.ts b/apps/api/src/api.controller.ts index 215298f6..3872e386 100644 --- a/apps/api/src/api.controller.ts +++ b/apps/api/src/api.controller.ts @@ -1,7 +1,11 @@ -import { Controller, Get, HttpStatus, Logger } from '@nestjs/common'; +import { Controller, Get, Post, HttpCode, HttpStatus, Logger, Query, Body, Put } from '@nestjs/common'; +import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { ApiService } from './api.service'; +import { GraphsQueryParamsDto, ProviderGraphDto, UserGraphDto } from '../../../libs/common/src'; +import { WatchGraphsDto } from '../../../libs/common/src/dtos/watch-graphs.dto'; @Controller('api') +@ApiTags('graph-service') export class ApiController { private readonly logger: Logger; @@ -9,11 +13,79 @@ export class ApiController { this.logger = new Logger(this.constructor.name); } + // Health endpoint // eslint-disable-next-line class-methods-use-this @Get('health') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Check the health status of the service' }) + @ApiOkResponse({ description: 'Service is healthy' }) health() { return { status: HttpStatus.OK, + message: 'Service is healthy', }; } + + // Fetch graphs for list of `dsnpIds` at optional `blockNumber` + // Fetch graphs for list of `dsnpIds` at optional `blockNumber` + @Get('graphs') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Fetch graphs for specified dsnpIds and blockNumber' }) + @ApiOkResponse({ description: 'Graphs retrieved successfully', type: UserGraphDto }) + async getGraphs(@Query() queryParams: GraphsQueryParamsDto): Promise { + try { + // TODO: Uncomment this line once the ApiService is implemented + // const graphs = await this.apiService.getGraphs(queryParams.dsnpIds, queryParams.blockNumber); + + // For now, returning a dummy response + const dummyGraph: UserGraphDto = { + dsnpId: 'sampleDsnpId', + dsnpGraphEdge: [], + }; + + return [dummyGraph]; + } catch (error) { + this.logger.error(error); + throw new Error('Failed to fetch graphs'); + } + } + + // Create a provider graph + @Post('update-graph') + @HttpCode(HttpStatus.CREATED) + @ApiOperation({ summary: 'Request an update to given users graph' }) + @ApiCreatedResponse({ description: 'Successfully queued job to update user graph' }) + @ApiBody({ type: ProviderGraphDto }) + async updateGraph(@Body() providerGraphDto: ProviderGraphDto) { + try { + // TODO: Uncomment this line once the ApiService is implemented + // const result = await this.apiService.updateGraph(providerGraphDto); + return { + status: HttpStatus.CREATED, + data: 'Successfully queued job to update user graph', + }; + } catch (error) { + this.logger.error(error); + throw new Error('Failed to update graph'); + } + } + + @Put('watch-graphs') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Watch graphs for specified dsnpIds and receive updates' }) + @ApiOkResponse({ description: 'Successfully started watching graphs' }) + @ApiBody({ type: WatchGraphsDto }) + async watchGraphs(@Body() watchGraphsDto: WatchGraphsDto) { + try { + // TODO: Uncomment this line once the ApiService is implemented + // const result = await this.apiService.watchGraphs(watchGraphsDto); + return { + status: HttpStatus.OK, + data: 'Successfully started watching graphs', + }; + } catch (error) { + this.logger.error(error); + throw new Error('Failed to watch graphs'); + } + } } diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index e67297ca..5cc6a304 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -2,6 +2,7 @@ import { NestFactory } from '@nestjs/core'; import { Logger, ValidationPipe } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { ApiModule } from './api.module'; +import { initSwagger } from '../../../libs/common/src/config/swagger_config'; const logger = new Logger('main'); @@ -24,6 +25,7 @@ async function bootstrap() { try { app.enableShutdownHooks(); app.useGlobalPipes(new ValidationPipe()); + await initSwagger(app, '/api/docs/swagger'); await app.listen(process.env.API_PORT ?? 3000); } catch (e) { await app.close(); diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts new file mode 100644 index 00000000..339e7333 --- /dev/null +++ b/apps/api/src/metadata.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +export default async () => { + const t = { + ["../../../libs/common/src/dtos/key.type.dto"]: await import("../../../libs/common/src/dtos/key.type.dto"), + ["../../../libs/common/src/dtos/privacy.type.dto"]: await import("../../../libs/common/src/dtos/privacy.type.dto"), + ["../../../libs/common/src/dtos/direction.dto"]: await import("../../../libs/common/src/dtos/direction.dto"), + ["../../../libs/common/src/dtos/connection.type.dto"]: await import("../../../libs/common/src/dtos/connection.type.dto"), + ["../../../libs/common/src/dtos/connections.dto"]: await import("../../../libs/common/src/dtos/connections.dto"), + ["../../../libs/common/src/dtos/graph.key.pair.dto"]: await import("../../../libs/common/src/dtos/graph.key.pair.dto"), + ["../../../libs/common/src/dtos/user.graph.dto"]: await import("../../../libs/common/src/dtos/user.graph.dto") + }; + return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdge: { required: false, type: () => [Object] } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, blockNumber: { required: false, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": {}, "watchGraphs": {} } }]] } }; +}; \ No newline at end of file diff --git a/env.template b/env.template index 53bada42..62ee0d85 100644 --- a/env.template +++ b/env.template @@ -11,4 +11,4 @@ GRAPH_ENVIRONMENT_TYPE=Dev # Add the graph environment config in JSON format only used for Dev environments. # Be careful to escape any inner quotes as this is in a .env file. GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' - +PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index ea3eedee..3e186f62 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -42,6 +42,7 @@ describe('GraphSericeConfig', () => { API_PORT: undefined, GRAPH_ENVIRONMENT_TYPE: undefined, GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, + PROVIDER_ACCOUNT_SEED_PHRASE: undefined, }; beforeAll(() => { @@ -120,5 +121,9 @@ describe('GraphSericeConfig', () => { it('should get graph environment dev config', () => { expect(graphServiceConfig.getGraphEnvironmentConfig()).toStrictEqual(ALL_ENV.GRAPH_ENVIRONMENT_DEV_CONFIG); }); + + it('should get provider account seed phrase', () => { + expect(graphServiceConfig.getProviderAccountSeedPhrase()).toStrictEqual(ALL_ENV.PROVIDER_ACCOUNT_SEED_PHRASE); + }); }); }); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index 316e5e2a..96394c1f 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -13,6 +13,7 @@ export interface ConfigEnvironmentVariables { API_PORT: number; GRAPH_ENVIRONMENT_TYPE: keyof EnvironmentType; GRAPH_ENVIRONMENT_DEV_CONFIG?: string; + PROVIDER_ACCOUNT_SEED_PHRASE: string; } /// Config service to get global app and provider-specific config values. @@ -48,6 +49,10 @@ export class ConfigService { return this.nestConfigService.get('GRAPH_ENVIRONMENT_DEV_CONFIG')!; } + public getProviderAccountSeedPhrase(): string { + return this.nestConfigService.get('PROVIDER_ACCOUNT_SEED_PHRASE')!; + } + public get redisUrl(): URL { return this.nestConfigService.get('REDIS_URL')!; } diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index ef8896d7..e5a87afc 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -23,5 +23,6 @@ export const configModuleOptions: ConfigModuleOptions = { return value; }), }), + PROVIDER_ACCOUNT_SEED_PHRASE: Joi.string().required(), }), }; diff --git a/libs/common/src/config/swagger_config.ts b/libs/common/src/config/swagger_config.ts new file mode 100644 index 00000000..02a9e4c8 --- /dev/null +++ b/libs/common/src/config/swagger_config.ts @@ -0,0 +1,26 @@ +import { INestApplication } from '@nestjs/common'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import * as fs from 'fs'; +import metadata from '../../../../apps/api/src/metadata'; + +export const initSwagger = async (app: INestApplication, apiPath: string) => { + const options = new DocumentBuilder() + .setTitle('Graph Service') + .setDescription('Graph Service API') + .setVersion('1.0') + .addBearerAuth({ + type: 'http', + description: 'Enter JWT token', + }) + .addCookieAuth('SESSION') + .build(); + await SwaggerModule.loadPluginMetadata(metadata); + + const document = SwaggerModule.createDocument(app, options, { + extraModels: [], + }); + + // write swagger.json to disk + // fs.writeFileSync('./swagger.json', JSON.stringify(document)); + SwaggerModule.setup(apiPath, app, document); +}; diff --git a/libs/common/src/dtos/connection.type.dto.ts b/libs/common/src/dtos/connection.type.dto.ts new file mode 100644 index 00000000..a62b92f6 --- /dev/null +++ b/libs/common/src/dtos/connection.type.dto.ts @@ -0,0 +1,5 @@ +// eslint-disable-next-line no-shadow +export enum ConnectionType { + Follow = 'follow', + Friendship = 'friendship', +} diff --git a/libs/common/src/dtos/connections.dto.ts b/libs/common/src/dtos/connections.dto.ts new file mode 100644 index 00000000..1d0aae45 --- /dev/null +++ b/libs/common/src/dtos/connections.dto.ts @@ -0,0 +1,22 @@ +import { IsNotEmpty, IsString, IsEnum } from 'class-validator'; +import { ConnectionType } from './connection.type.dto'; +import { Direction } from './direction.dto'; +import { PrivacyType } from './privacy.type.dto'; + +export class ConnectionDto { + @IsNotEmpty() + @IsString() + dsnpId: string; + + @IsNotEmpty() + @IsEnum(PrivacyType) + privacyType: PrivacyType; + + @IsNotEmpty() + @IsEnum(Direction) + direction: Direction; + + @IsNotEmpty() + @IsEnum(ConnectionType) + connectionType: ConnectionType; +} diff --git a/libs/common/src/dtos/direction.dto.ts b/libs/common/src/dtos/direction.dto.ts new file mode 100644 index 00000000..599dcfce --- /dev/null +++ b/libs/common/src/dtos/direction.dto.ts @@ -0,0 +1,6 @@ +// eslint-disable-next-line no-shadow +export enum Direction { + ConnectionTo = 'connectionTo', + ConnectionFrom = 'connectionFrom', + Bidirectional = 'bidirectional', +} diff --git a/libs/common/src/dtos/graph.key.pair.dto.ts b/libs/common/src/dtos/graph.key.pair.dto.ts new file mode 100644 index 00000000..6594571d --- /dev/null +++ b/libs/common/src/dtos/graph.key.pair.dto.ts @@ -0,0 +1,17 @@ +import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; +import { KeyType } from './key.type.dto'; + +// DTO for the graph key pair +export class GraphKeyPairDto { + @IsNotEmpty() + @IsString() + publicKey: string; + + @IsNotEmpty() + @IsString() + privateKey: string; + + @IsNotEmpty() + @IsEnum(KeyType) + keyType: KeyType; +} diff --git a/libs/common/src/dtos/graph.query.dto.ts b/libs/common/src/dtos/graph.query.dto.ts new file mode 100644 index 00000000..8ff96828 --- /dev/null +++ b/libs/common/src/dtos/graph.query.dto.ts @@ -0,0 +1,13 @@ +import { ArrayNotEmpty, ArrayUnique, IsArray, IsOptional, IsString } from 'class-validator'; + +export class GraphsQueryParamsDto { + @IsArray() + @ArrayNotEmpty() + @ArrayUnique() + @IsString({ each: true }) + dsnpIds: string[]; + + @IsOptional() + @IsString() + blockNumber?: string; +} diff --git a/libs/common/src/dtos/key.type.dto.ts b/libs/common/src/dtos/key.type.dto.ts new file mode 100644 index 00000000..b0cede0d --- /dev/null +++ b/libs/common/src/dtos/key.type.dto.ts @@ -0,0 +1,5 @@ +// Enum for KeyType +// eslint-disable-next-line no-shadow +export enum KeyType { + X25519 = 'X25519', +} diff --git a/libs/common/src/dtos/privacy.type.dto.ts b/libs/common/src/dtos/privacy.type.dto.ts new file mode 100644 index 00000000..3cdfb0cf --- /dev/null +++ b/libs/common/src/dtos/privacy.type.dto.ts @@ -0,0 +1,5 @@ +// eslint-disable-next-line no-shadow +export enum PrivacyType { + Private = 'private', + Public = 'public', +} diff --git a/libs/common/src/dtos/provider.graph.dto.ts b/libs/common/src/dtos/provider.graph.dto.ts new file mode 100644 index 00000000..799cbc77 --- /dev/null +++ b/libs/common/src/dtos/provider.graph.dto.ts @@ -0,0 +1,21 @@ +import { IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { Type } from 'class-transformer'; +import { PrivacyType } from './privacy.type.dto'; +import { GraphKeyPairDto } from './graph.key.pair.dto'; +import { ConnectionDto } from './connections.dto'; + +export class ProviderGraphDto { + @IsNotEmpty() + @IsString() + dsnpId: string; + + @IsNotEmpty() + @IsString() + @ValidateNested({ each: true }) + @Type(() => ConnectionDto) + connections: { data: ConnectionDto[] }; + + @IsArray() + @IsOptional() + graphKeyPairs?: GraphKeyPairDto[]; +} diff --git a/libs/common/src/dtos/user.graph.dto.ts b/libs/common/src/dtos/user.graph.dto.ts new file mode 100644 index 00000000..eb5a1146 --- /dev/null +++ b/libs/common/src/dtos/user.graph.dto.ts @@ -0,0 +1,7 @@ +import { DsnpGraphEdge } from '@dsnp/graph-sdk'; + +export class UserGraphDto { + dsnpId: string; + + dsnpGraphEdge?: DsnpGraphEdge[]; +} diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/libs/common/src/dtos/watch-graphs.dto.ts new file mode 100644 index 00000000..aa54352d --- /dev/null +++ b/libs/common/src/dtos/watch-graphs.dto.ts @@ -0,0 +1,12 @@ +import { IsArray, IsNotEmpty, IsString, IsUrl } from 'class-validator'; + +export class WatchGraphsDto { + @IsArray() + @IsNotEmpty() + dsnpIds: string[]; + + @IsNotEmpty() + @IsString() + @IsUrl() + webhookEndpoint: string; +} diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 69b6b73b..f1eaf708 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -2,3 +2,12 @@ export * from './utils/processing'; export * from './utils/redis'; export * from './utils/base-consumer'; export * from './constants'; +export * from './dtos/user.graph.dto'; +export * from './dtos/graph.query.dto'; +export * from './dtos/provider.graph.dto'; +export * from './dtos/privacy.type.dto'; +export * from './dtos/key.type.dto'; +export * from './dtos/graph.key.pair.dto'; +export * from './dtos/connections.dto'; +export * from './dtos/watch-graphs.dto'; +export * from './utils/nonce.service'; diff --git a/libs/common/src/utils/nonce.service.ts b/libs/common/src/utils/nonce.service.ts new file mode 100644 index 00000000..e22879d9 --- /dev/null +++ b/libs/common/src/utils/nonce.service.ts @@ -0,0 +1,57 @@ +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common'; +import Redis from 'ioredis'; +import fs from 'fs'; +import { createKeys } from '../blockchain/create-keys'; +import { RedisUtils } from './redis'; +import { BlockchainService } from '../blockchain/blockchain.service'; +import { ConfigService } from '../config/config.service'; + +@Injectable() +export class NonceService implements OnApplicationBootstrap { + private logger: Logger; + + private accountId: Uint8Array; + + constructor( + @InjectRedis() private redis: Redis, + private blockchainService: BlockchainService, + private configService: ConfigService, + ) { + this.logger = new Logger(NonceService.name); + redis.defineCommand('incrementNonce', { + numberOfKeys: RedisUtils.NUMBER_OF_NONCE_KEYS_TO_CHECK, + lua: fs.readFileSync('lua/incrementNonce.lua', 'utf8'), + }); + } + + async onApplicationBootstrap() { + this.accountId = createKeys(this.configService.getProviderAccountSeedPhrase()).publicKey; + const nextNonce = await this.getNextNonce(); + this.logger.log(`nonce is set to ${nextNonce}`); + } + + async getNextNonce(): Promise { + const nonce = await this.blockchainService.getNonce(this.accountId); + const keys = this.getNextPossibleKeys(nonce); + // @ts-ignore + const nextNonceIndex = await this.redis.incrementNonce(...keys, keys.length, RedisUtils.NONCE_KEY_EXPIRE_SECONDS); + if (nextNonceIndex === -1) { + this.logger.warn(`nextNonce was full even with ${RedisUtils.NUMBER_OF_NONCE_KEYS_TO_CHECK} ${nonce}`); + return Number(nonce) + RedisUtils.NUMBER_OF_NONCE_KEYS_TO_CHECK; + } + const nextNonce = Number(nonce) + nextNonceIndex - 1; + this.logger.debug(`nextNonce ${nextNonce}`); + return nextNonce; + } + + // eslint-disable-next-line class-methods-use-this + getNextPossibleKeys(currentNonce: number): string[] { + const keys: string[] = []; + for (let i = 0; i < RedisUtils.NUMBER_OF_NONCE_KEYS_TO_CHECK; i += 1) { + const key = currentNonce + i; + keys.push(RedisUtils.getNonceKey(`${key}`)); + } + return keys; + } +} diff --git a/lua/addToBatch.lua b/lua/addToBatch.lua new file mode 100644 index 00000000..60c220a0 --- /dev/null +++ b/lua/addToBatch.lua @@ -0,0 +1,37 @@ +--[[ +Input: +KEYS[1] batch metadata key +KEYS[2] batch data key +ARGV[1] metadata +ARGV[2] Job id +ARGV[3] data +Output: +-1 ERROR +1 OK (new batch) +N OK (number of existing rows) +]] +local batchMetadataKey = KEYS[1] +local batchDataKey = KEYS[2] +local newMetadata = ARGV[1] +local newJobId = ARGV[2] +local newData = ARGV[3] +local rcall = redis.call +local rawMetadata = rcall("GET",batchMetadataKey) +local currentCount = 1 +if rawMetadata then + local metadata = cjson.decode(rawMetadata) + local rowCount = metadata['rowCount'] + if not rowCount then + return -1 + end + currentCount = rowCount + 1 + metadata['rowCount'] = currentCount + rcall("SET", batchMetadataKey, cjson.encode(metadata)) +else + rcall("SET", batchMetadataKey, newMetadata) +end +rcall("HSETNX", batchDataKey, newJobId, newData) +return currentCount + + + diff --git a/lua/incrementNonce.lua b/lua/incrementNonce.lua new file mode 100644 index 00000000..f7f6ec98 --- /dev/null +++ b/lua/incrementNonce.lua @@ -0,0 +1,26 @@ +--[[ +Input: +KEYS[N] nonce keys +ARGV[1] number of keys +ARGV[2] key expire time in seconds +Output: +-1 ERROR (none of keys worked) +N OK (chosen key index) +]] +local keysSize = tonumber(ARGV[1]) +local expireInSeconds = tonumber(ARGV[2]) +local rcall = redis.call + +local i = 1 +repeat + local nextKey = KEYS[i] + if rcall("EXISTS", nextKey) == 0 then + rcall('SETEX', nextKey, expireInSeconds , 1) + return i + end + i = i + 1 +until( i > keysSize) +return -1 + + + diff --git a/lua/lockBatch.lua b/lua/lockBatch.lua new file mode 100644 index 00000000..7b9b62bf --- /dev/null +++ b/lua/lockBatch.lua @@ -0,0 +1,53 @@ +--[[ +Input: +KEYS[1] batch metadata key +KEYS[2] batch data key +KEYS[3] locked metadata key +KEYS[4] locked data key +ARGV[1] current timestamp +ARGV[2] timestamp interval +Output: +-1 ERROR (lock existed for more than timeout) +-2 ERROR (lock existed for less than timeout) +0 OK (there is no batch to close) +1 OK (locking the batch) +if the previous batch is still locked then return the data for that batch +if no locked previous batch then just return the data for current batch +]] +local batchMetadataKey = KEYS[1] +local batchDataKey = KEYS[2] +local lockedMetadataKey = KEYS[3] +local lockedDataKey = KEYS[4] +local currentTimestamp = tonumber(ARGV[1]) +local timestampInterval = tonumber(ARGV[2]) +local rcall = redis.call + +local metadata = rcall("GET",batchMetadataKey) +if not metadata then + return {0} +end + +local rawPreviousMetadata = rcall('GET', lockedMetadataKey) +if rawPreviousMetadata then + local previousMetadata = cjson.decode(rawPreviousMetadata) + local timePassed = currentTimestamp - tonumber(previousMetadata['lockTimestamp']) + if timePassed > timestampInterval then + return {-1, rcall('HGETALL', lockedDataKey), rawPreviousMetadata} + else + return {-2} + end +end + +rcall("RENAME",batchMetadataKey, lockedMetadataKey) +rcall("RENAME",batchDataKey, lockedDataKey) + +local rawPreviousMetadata2 = rcall('GET', lockedMetadataKey) +local previousMetadata2 = cjson.decode(rawPreviousMetadata2) +previousMetadata2['lockTimestamp']=currentTimestamp +local encodedMetadata = cjson.encode(previousMetadata2) +rcall('SET', lockedMetadataKey, encodedMetadata) + +return {1, rcall('HGETALL', lockedDataKey), encodedMetadata} + + + diff --git a/swagger.yaml b/swagger.yaml index fdf36fd1..a52fca3d 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -1,13 +1,173 @@ openapi: 3.0.0 -description: 'Graph Service API' -info: - title: Graph Service API - version: 0.1.0 paths: /api/health: get: operationId: ApiController_health + summary: Check the health status of the service + parameters: [] + responses: + '200': + description: Service is healthy + tags: + - graph-service + /api/graphs: + get: + operationId: ApiController_getGraphs + summary: Fetch graphs for specified dsnpIds and blockNumber + parameters: + - name: dsnpIds + required: true + in: query + schema: + type: array + items: + type: string + - name: blockNumber + required: false + in: query + schema: + type: string + responses: + '200': + description: Graphs retrieved successfully + content: + application/json: + schema: + $ref: '#/components/schemas/UserGraphDto' + tags: + - graph-service + /api/update-graph: + post: + operationId: ApiController_updateGraph + summary: Request an update to given users graph parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ProviderGraphDto' + responses: + '201': + description: Successfully queued job to update user graph + tags: + - graph-service + /api/watch-graphs: + put: + operationId: ApiController_watchGraphs + summary: Watch graphs for specified dsnpIds and receive updates + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WatchGraphsDto' responses: '200': - description: '' + description: Successfully started watching graphs + tags: + - graph-service +info: + title: Graph Service + description: Graph Service API + version: '1.0' + contact: {} +tags: [] +servers: [] +components: + securitySchemes: + bearer: + scheme: bearer + bearerFormat: JWT + type: http + description: Enter JWT token + cookie: + type: apiKey + in: cookie + name: SESSION + schemas: + UserGraphDto: + type: object + properties: + dsnpId: + type: string + dsnpGraphEdge: + type: array + items: + type: object + required: + - dsnpId + ConnectionDto: + type: object + properties: + dsnpId: + type: string + privacyType: + type: string + enum: + - private + - public + direction: + type: string + enum: + - connectionTo + - connectionFrom + - bidirectional + connectionType: + type: string + enum: + - follow + - friendship + required: + - dsnpId + - privacyType + - direction + - connectionType + GraphKeyPairDto: + type: object + properties: + publicKey: + type: string + privateKey: + type: string + keyType: + type: string + enum: + - X25519 + required: + - publicKey + - privateKey + - keyType + ProviderGraphDto: + type: object + properties: + dsnpId: + type: string + connections: + type: object + properties: + data: + required: true + type: array + items: + $ref: '#/components/schemas/ConnectionDto' + graphKeyPairs: + type: array + items: + $ref: '#/components/schemas/GraphKeyPairDto' + required: + - dsnpId + - connections + WatchGraphsDto: + type: object + properties: + dsnpIds: + type: array + items: + type: string + webhookEndpoint: + type: string + required: + - dsnpIds + - webhookEndpoint From 8d15821c2357323f01324e8bba8983add5cd042f Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Thu, 14 Dec 2023 20:46:20 +0530 Subject: [PATCH 04/53] Graph change request processor and worker module (#15) * add worker module for nestjs and placeholder for request processor * update dockerfile, update yaml with missing dto definition * add route for api service and queue graph change --- Dockerfile | 5 +- apps/api/src/api.controller.ts | 13 ++--- apps/api/src/api.module.ts | 20 +++++-- apps/api/src/api.service.ts | 27 ++++++++- apps/api/src/metadata.ts | 6 +- apps/worker/src/BaseConsumer.ts | 58 +++++++++++++++++++ apps/worker/src/main.ts | 8 +++ .../request.processor.module.ts | 56 ++++++++++++++++++ .../request.processor.service.ts | 30 ++++++++++ apps/worker/src/worker.module.ts | 50 ++++++++++++++++ apps/worker/tsconfig.app.json | 9 +++ docker-compose.dev.yaml | 35 +++++++++++ libs/common/src/dtos/dsnp.graph.edge.dto.ts | 11 ++++ .../dtos/graph.change.request.reference.ts | 3 + libs/common/src/dtos/provider.graph.dto.ts | 3 + libs/common/src/dtos/user.graph.dto.ts | 2 +- libs/common/src/index.ts | 3 + libs/common/src/utils/queues.ts | 6 ++ package.json | 4 ++ swagger.yaml | 24 +++++++- 20 files changed, 351 insertions(+), 22 deletions(-) create mode 100644 apps/worker/src/BaseConsumer.ts create mode 100644 apps/worker/src/main.ts create mode 100644 apps/worker/src/request_processor/request.processor.module.ts create mode 100644 apps/worker/src/request_processor/request.processor.service.ts create mode 100644 apps/worker/src/worker.module.ts create mode 100644 apps/worker/tsconfig.app.json create mode 100644 libs/common/src/dtos/dsnp.graph.edge.dto.ts create mode 100644 libs/common/src/dtos/graph.change.request.reference.ts create mode 100644 libs/common/src/utils/queues.ts diff --git a/Dockerfile b/Dockerfile index 131a8896..9c3373e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,10 @@ WORKDIR /usr/src/app COPY --from=builder /usr/src/app/dist ./dist COPY package*.json ./ +COPY ./lua ./lua RUN npm install --only=production EXPOSE 3000 +ENV START_PROCESS="api" -CMD ["sh", "-c", "npm run start:api:prod"] + +CMD ["sh", "-c", "if [ \"$START_PROCESS\" = \"api\" ]; then npm run start:api:prod; else npm run start:worker:prod; fi"] diff --git a/apps/api/src/api.controller.ts b/apps/api/src/api.controller.ts index 3872e386..7d0661e8 100644 --- a/apps/api/src/api.controller.ts +++ b/apps/api/src/api.controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Post, HttpCode, HttpStatus, Logger, Query, Body, Put } from '@nestjs/common'; import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { ApiService } from './api.service'; -import { GraphsQueryParamsDto, ProviderGraphDto, UserGraphDto } from '../../../libs/common/src'; +import { GraphChangeRepsonseDto, GraphsQueryParamsDto, ProviderGraphDto, UserGraphDto } from '../../../libs/common/src'; import { WatchGraphsDto } from '../../../libs/common/src/dtos/watch-graphs.dto'; @Controller('api') @@ -54,16 +54,11 @@ export class ApiController { @Post('update-graph') @HttpCode(HttpStatus.CREATED) @ApiOperation({ summary: 'Request an update to given users graph' }) - @ApiCreatedResponse({ description: 'Successfully queued job to update user graph' }) + @ApiCreatedResponse({ description: 'Graph update request created successfully', type: GraphChangeRepsonseDto }) @ApiBody({ type: ProviderGraphDto }) - async updateGraph(@Body() providerGraphDto: ProviderGraphDto) { + async updateGraph(@Body() providerGraphDto: ProviderGraphDto): Promise { try { - // TODO: Uncomment this line once the ApiService is implemented - // const result = await this.apiService.updateGraph(providerGraphDto); - return { - status: HttpStatus.CREATED, - data: 'Successfully queued job to update user graph', - }; + return await this.apiService.enqueueRequest(providerGraphDto); } catch (error) { this.logger.error(error); throw new Error('Failed to update graph'); diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index b77dcf65..7d0cd07d 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -4,12 +4,14 @@ import { BullModule } from '@nestjs/bullmq'; import { ScheduleModule } from '@nestjs/schedule'; import { RedisModule } from '@liaoliaots/nestjs-redis'; import { BullBoardModule } from '@bull-board/nestjs'; +import { BullMQAdapter } from '@bull-board/api/bullMQAdapter'; import { ExpressAdapter } from '@bull-board/express'; import { ApiController } from './api.controller'; import { ApiService } from './api.service'; import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; +import { QueueConstants } from '../../../libs/common/src'; @Module({ imports: [ @@ -48,12 +50,6 @@ import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain }, inject: [ConfigService], }), - - // Bullboard UI - BullBoardModule.forRoot({ - route: '/queues', - adapter: ExpressAdapter, - }), EventEmitterModule.forRoot({ // Use this instance throughout the application global: true, @@ -72,6 +68,18 @@ import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain // disable throwing uncaughtException if an error event is emitted and it has no listeners ignoreErrors: false, }), + BullModule.registerQueue({ + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }), + // Bullboard UI + BullBoardModule.forRoot({ + route: '/queues', + adapter: ExpressAdapter, + }), + BullBoardModule.forFeature({ + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + adapter: BullMQAdapter, + }), ScheduleModule.forRoot(), ], providers: [ApiService], diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index a73d5819..a009f783 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -1,12 +1,37 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRedis } from '@liaoliaots/nestjs-redis'; import Redis from 'ioredis'; +import { InjectQueue } from '@nestjs/bullmq'; +import { Queue } from 'bullmq'; +import { createHash } from 'crypto'; +import { GraphChangeRepsonseDto, ProviderGraphDto, QueueConstants } from '../../../libs/common/src'; @Injectable() export class ApiService { private readonly logger: Logger; - constructor(@InjectRedis() private redis: Redis) { + constructor( + @InjectRedis() private redis: Redis, + @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private graphChangeRequestQueue: Queue, + ) { this.logger = new Logger(this.constructor.name); } + + async enqueueRequest(request: ProviderGraphDto): Promise { + const data = { + ...request, + id: this.calculateJobId(request), + }; + const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.id}`, data, { jobId: data.id, removeOnFail: false, removeOnComplete: 2000 }); // TODO: should come from queue configs + this.logger.debug(job); + return { + referenceId: data.id, + }; + } + + // eslint-disable-next-line class-methods-use-this + private calculateJobId(jobWithoutId: ProviderGraphDto): string { + const stringVal = JSON.stringify(jobWithoutId); + return createHash('sha1').update(stringVal).digest('base64url'); + } } diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index 339e7333..86e7384f 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,13 +1,15 @@ /* eslint-disable */ export default async () => { const t = { + ["../../../libs/common/src/dtos/dsnp.graph.edge.dto"]: await import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), ["../../../libs/common/src/dtos/key.type.dto"]: await import("../../../libs/common/src/dtos/key.type.dto"), ["../../../libs/common/src/dtos/privacy.type.dto"]: await import("../../../libs/common/src/dtos/privacy.type.dto"), ["../../../libs/common/src/dtos/direction.dto"]: await import("../../../libs/common/src/dtos/direction.dto"), ["../../../libs/common/src/dtos/connection.type.dto"]: await import("../../../libs/common/src/dtos/connection.type.dto"), ["../../../libs/common/src/dtos/connections.dto"]: await import("../../../libs/common/src/dtos/connections.dto"), ["../../../libs/common/src/dtos/graph.key.pair.dto"]: await import("../../../libs/common/src/dtos/graph.key.pair.dto"), - ["../../../libs/common/src/dtos/user.graph.dto"]: await import("../../../libs/common/src/dtos/user.graph.dto") + ["../../../libs/common/src/dtos/user.graph.dto"]: await import("../../../libs/common/src/dtos/user.graph.dto"), + ["../../../libs/common/src/dtos/graph.change.request.reference"]: await import("../../../libs/common/src/dtos/graph.change.request.reference") }; - return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdge: { required: false, type: () => [Object] } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, blockNumber: { required: false, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": {}, "watchGraphs": {} } }]] } }; + return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdge: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp.graph.edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, blockNumber: { required: false, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { id: { required: true, type: () => String }, dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph.change.request.reference"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; }; \ No newline at end of file diff --git a/apps/worker/src/BaseConsumer.ts b/apps/worker/src/BaseConsumer.ts new file mode 100644 index 00000000..52315b16 --- /dev/null +++ b/apps/worker/src/BaseConsumer.ts @@ -0,0 +1,58 @@ +import { OnWorkerEvent, WorkerHost } from '@nestjs/bullmq'; +import { Logger, OnModuleDestroy } from '@nestjs/common'; +import { Job, Worker } from 'bullmq'; +import { ProcessingUtils } from '../../../libs/common/src/utils/processing'; + +export abstract class BaseConsumer extends WorkerHost implements OnModuleDestroy { + protected logger: Logger; + + private actives: Set; + + protected constructor() { + super(); + this.logger = new Logger(this.constructor.name); + this.actives = new Set(); + } + + trackJob(jobId: string) { + this.actives.add(jobId); + } + + unTrackJob(jobId: string) { + this.actives.delete(jobId); + } + + async onModuleDestroy(): Promise { + await this.worker?.close(false); + let maxWaitMs = ProcessingUtils.MAX_WAIT_FOR_GRACE_FULL_SHUTDOWN_MS; + while (this.actives.size > 0 && maxWaitMs > 0) { + // eslint-disable-next-line no-await-in-loop + await ProcessingUtils.delay(ProcessingUtils.DELAY_TO_CHECK_FOR_SHUTDOWN_MS); + maxWaitMs -= ProcessingUtils.DELAY_TO_CHECK_FOR_SHUTDOWN_MS; + } + } + + /** + * any method overriding this method should call this method directly, so we are able to track the executing jobs + */ + @OnWorkerEvent('active') + onActive(job: Job) { + this.trackJob(job.id!); + } + + /** + * any method overriding this method should call this method directly, so we are able to track the executing jobs + */ + @OnWorkerEvent('completed') + onCompleted(job: Job) { + this.unTrackJob(job.id!); + } + + /** + * any method overriding this method should call this method directly, so we are able to track the executing jobs + */ + @OnWorkerEvent('failed') + onFailed(job: Job) { + this.unTrackJob(job.id!); + } +} diff --git a/apps/worker/src/main.ts b/apps/worker/src/main.ts new file mode 100644 index 00000000..a821ecfa --- /dev/null +++ b/apps/worker/src/main.ts @@ -0,0 +1,8 @@ +import { NestFactory } from '@nestjs/core'; +import { WorkerModule } from './worker.module'; + +async function bootstrap() { + const app = await NestFactory.createApplicationContext(WorkerModule); + app.enableShutdownHooks(); +} +bootstrap(); diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts new file mode 100644 index 00000000..46e58a82 --- /dev/null +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -0,0 +1,56 @@ +/* +https://docs.nestjs.com/modules +*/ + +import { BullModule } from '@nestjs/bullmq'; +import { Module } from '@nestjs/common'; +import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { ConfigModule } from '../../../../libs/common/src/config/config.module'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { QueueConstants } from '../../../../libs/common/src'; +import { RequestProcessorService } from './request.processor.service'; + +@Module({ + imports: [ + ConfigModule, + RedisModule.forRootAsync( + { + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + config: [{ url: configService.redisUrl.toString() }], + }), + inject: [ConfigService], + }, + true, // isGlobal + ), + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: (configService: ConfigService) => { + // Note: BullMQ doesn't honor a URL for the Redis connection, and + // JS URL doesn't parse 'redis://' as a valid protocol, so we fool + // it by changing the URL to use 'http://' in order to parse out + // the host, port, username, password, etc. + // We could pass REDIS_HOST, REDIS_PORT, etc, in the environment, but + // trying to keep the # of environment variables from proliferating + const url = new URL(configService.redisUrl.toString().replace(/^redis[s]*/, 'http')); + const { hostname, port, username, password, pathname } = url; + return { + connection: { + host: hostname || undefined, + port: port ? Number(port) : undefined, + username: username || undefined, + password: password || undefined, + db: pathname?.length > 1 ? Number(pathname.slice(1)) : undefined, + }, + }; + }, + inject: [ConfigService], + }), + BullModule.registerQueue({ + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }), + ], + providers: [RequestProcessorService], + exports: [BullModule, RequestProcessorService], +}) +export class RequestProcessorModule {} diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts new file mode 100644 index 00000000..c7b20afa --- /dev/null +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -0,0 +1,30 @@ +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Processor } from '@nestjs/bullmq'; +import { Injectable } from '@nestjs/common'; +import { Job } from 'bullmq'; +import Redis from 'ioredis'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { ProviderGraphDto, QueueConstants } from '../../../../libs/common/src'; +import { BaseConsumer } from '../BaseConsumer'; + +@Injectable() +@Processor(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) +export class RequestProcessorService extends BaseConsumer { + constructor( + @InjectRedis() private cacheManager: Redis, + private configService: ConfigService, + ) { + super(); + } + + async process(job: Job): Promise { + this.logger.log(`Processing job ${job.id} of type ${job.name}`); + try { + // TODO: add logic to process graph change requests + this.logger.debug(job.asJSON()); + } catch (e) { + this.logger.error(e); + throw e; + } + } +} diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts new file mode 100644 index 00000000..8ab35a9b --- /dev/null +++ b/apps/worker/src/worker.module.ts @@ -0,0 +1,50 @@ +import { Module } from '@nestjs/common'; +import { BullModule } from '@nestjs/bullmq'; +import { ScheduleModule } from '@nestjs/schedule'; +import { EventEmitterModule } from '@nestjs/event-emitter'; +import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; +import { RequestProcessorModule } from './request_processor/request.processor.module'; +import { RequestProcessorService } from './request_processor/request.processor.service'; +import { ConfigModule } from '../../../libs/common/src/config/config.module'; +import { ConfigService } from '../../../libs/common/src/config/config.service'; + +@Module({ + imports: [ + BullModule, + ConfigModule, + RedisModule.forRootAsync( + { + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + config: [{ url: configService.redisUrl.toString() }], + }), + inject: [ConfigService], + }, + true, // isGlobal + ), + EventEmitterModule.forRoot({ + // Use this instance throughout the application + global: true, + // set this to `true` to use wildcards + wildcard: false, + // the delimiter used to segment namespaces + delimiter: '.', + // set this to `true` if you want to emit the newListener event + newListener: false, + // set this to `true` if you want to emit the removeListener event + removeListener: false, + // the maximum amount of listeners that can be assigned to an event + maxListeners: 10, + // show event name in memory leak message when more than maximum amount of listeners is assigned + verboseMemoryLeak: false, + // disable throwing uncaughtException if an error event is emitted and it has no listeners + ignoreErrors: false, + }), + ScheduleModule.forRoot(), + BlockchainModule, + RequestProcessorModule, + ], + providers: [ConfigService, RequestProcessorService], +}) +export class WorkerModule {} diff --git a/apps/worker/tsconfig.app.json b/apps/worker/tsconfig.app.json new file mode 100644 index 00000000..fc3f5ed8 --- /dev/null +++ b/apps/worker/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/worker" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index c355efb6..f001e51d 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -47,6 +47,41 @@ services: volumes: - chainstorage:/data + graph-service-api: + build: + context: . + dockerfile: dev.Dockerfile + ports: + - 3000:3000 + env_file: + - .env.docker.dev + environment: + - START_PROCESS=api + - REDIS_URL=redis://redis:6379 + volumes: + - ./:/app + depends_on: + - redis + - frequency + networks: + - graph-service-service + + graph-service-worker: + build: + context: . + dockerfile: dev.Dockerfile + env_file: + - .env.docker.dev + environment: + - START_PROCESS=worker + - REDIS_URL=redis://redis:6379 + volumes: + - ./:/app + depends_on: + - redis + - frequency + networks: + - graph-service-service volumes: redis_data: chainstorage: diff --git a/libs/common/src/dtos/dsnp.graph.edge.dto.ts b/libs/common/src/dtos/dsnp.graph.edge.dto.ts new file mode 100644 index 00000000..52118b87 --- /dev/null +++ b/libs/common/src/dtos/dsnp.graph.edge.dto.ts @@ -0,0 +1,11 @@ +import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; + +export class DsnpGraphEdge { + @IsNotEmpty() + @IsString() + userId: string; + + @IsNotEmpty() + @IsNumber() + since: number; +} diff --git a/libs/common/src/dtos/graph.change.request.reference.ts b/libs/common/src/dtos/graph.change.request.reference.ts new file mode 100644 index 00000000..fd89bd3b --- /dev/null +++ b/libs/common/src/dtos/graph.change.request.reference.ts @@ -0,0 +1,3 @@ +export class GraphChangeRepsonseDto { + referenceId: string; +} diff --git a/libs/common/src/dtos/provider.graph.dto.ts b/libs/common/src/dtos/provider.graph.dto.ts index 799cbc77..e7a308c2 100644 --- a/libs/common/src/dtos/provider.graph.dto.ts +++ b/libs/common/src/dtos/provider.graph.dto.ts @@ -5,6 +5,9 @@ import { GraphKeyPairDto } from './graph.key.pair.dto'; import { ConnectionDto } from './connections.dto'; export class ProviderGraphDto { + @IsNotEmpty() + id: string; + @IsNotEmpty() @IsString() dsnpId: string; diff --git a/libs/common/src/dtos/user.graph.dto.ts b/libs/common/src/dtos/user.graph.dto.ts index eb5a1146..66eff7d4 100644 --- a/libs/common/src/dtos/user.graph.dto.ts +++ b/libs/common/src/dtos/user.graph.dto.ts @@ -1,4 +1,4 @@ -import { DsnpGraphEdge } from '@dsnp/graph-sdk'; +import { DsnpGraphEdge } from './dsnp.graph.edge.dto'; export class UserGraphDto { dsnpId: string; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index f1eaf708..58258809 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -10,4 +10,7 @@ export * from './dtos/key.type.dto'; export * from './dtos/graph.key.pair.dto'; export * from './dtos/connections.dto'; export * from './dtos/watch-graphs.dto'; +export * from './dtos/dsnp.graph.edge.dto'; +export * from './dtos/graph.change.request.reference'; export * from './utils/nonce.service'; +export * from './utils/queues'; diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts new file mode 100644 index 00000000..8adae0ea --- /dev/null +++ b/libs/common/src/utils/queues.ts @@ -0,0 +1,6 @@ +export namespace QueueConstants { + /** + * Name of the queue that has all incoming requests + */ + export const GRAPH_CHANGE_REQUEST_QUEUE = 'graphChangeRequest'; +} diff --git a/package.json b/package.json index 455ce4fa..5a0a39b4 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,10 @@ "start:api:prod": "node dist/apps/api/main.js", "start:api:dev": "set -a ; . .env ; nest start api", "start:api:debug": "set -a ; . .env ; nest start api --debug --watch", + "start:worker": "nest start worker", + "start:worker:prod": "node dist/apps/worker/main.js", + "start:worker:dev": "set -a ; . .env ; nest start worker", + "start:worker:debug": "set -a ; . .env ;nest start worker --debug --watch", "docker-build": "docker build -t graph-service-service .", "docker-build:dev": "docker-compose -f docker-compose.dev.yaml build", "docker-run": " build -t graph-service-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-service-deploy", diff --git a/swagger.yaml b/swagger.yaml index a52fca3d..7f8393dc 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -49,7 +49,11 @@ paths: $ref: '#/components/schemas/ProviderGraphDto' responses: '201': - description: Successfully queued job to update user graph + description: Graph update request created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/GraphChangeRepsonseDto' tags: - graph-service /api/watch-graphs: @@ -87,6 +91,16 @@ components: in: cookie name: SESSION schemas: + DsnpGraphEdge: + type: object + properties: + userId: + type: string + since: + type: number + required: + - userId + - since UserGraphDto: type: object properties: @@ -95,7 +109,7 @@ components: dsnpGraphEdge: type: array items: - type: object + $ref: '#/components/schemas/DsnpGraphEdge' required: - dsnpId ConnectionDto: @@ -142,6 +156,8 @@ components: ProviderGraphDto: type: object properties: + id: + type: string dsnpId: type: string connections: @@ -157,8 +173,12 @@ components: items: $ref: '#/components/schemas/GraphKeyPairDto' required: + - id - dsnpId - connections + GraphChangeRepsonseDto: + type: object + properties: {} WatchGraphsDto: type: object properties: From 6e0dec6e57bd5417997d63436475a36a3f3a2075 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 15 Dec 2023 18:45:18 +0530 Subject: [PATCH 05/53] add graph publisher, responsible to send updates to stateful storage (#16) --- apps/api/src/api.module.ts | 15 ++++- .../graph.publisher.processor.module.ts | 56 +++++++++++++++++++ .../graph.publisher.processor.service.ts | 31 ++++++++++ apps/worker/src/worker.module.ts | 5 +- libs/common/src/utils/queues.ts | 5 ++ 5 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 apps/worker/src/graph_publisher/graph.publisher.processor.module.ts create mode 100644 apps/worker/src/graph_publisher/graph.publisher.processor.service.ts diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index 7d0cd07d..1009606f 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -68,9 +68,14 @@ import { QueueConstants } from '../../../libs/common/src'; // disable throwing uncaughtException if an error event is emitted and it has no listeners ignoreErrors: false, }), - BullModule.registerQueue({ - name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, - }), + BullModule.registerQueue( + { + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + }, + ), // Bullboard UI BullBoardModule.forRoot({ route: '/queues', @@ -80,6 +85,10 @@ import { QueueConstants } from '../../../libs/common/src'; name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, adapter: BullMQAdapter, }), + BullBoardModule.forFeature({ + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + adapter: BullMQAdapter, + }), ScheduleModule.forRoot(), ], providers: [ApiService], diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts new file mode 100644 index 00000000..89a7a66c --- /dev/null +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts @@ -0,0 +1,56 @@ +/* +https://docs.nestjs.com/modules +*/ + +import { BullModule } from '@nestjs/bullmq'; +import { Module } from '@nestjs/common'; +import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { ConfigModule } from '../../../../libs/common/src/config/config.module'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { QueueConstants } from '../../../../libs/common/src'; +import { GraphUpdatePublisherService } from './graph.publisher.processor.service'; + +@Module({ + imports: [ + ConfigModule, + RedisModule.forRootAsync( + { + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + config: [{ url: configService.redisUrl.toString() }], + }), + inject: [ConfigService], + }, + true, // isGlobal + ), + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: (configService: ConfigService) => { + // Note: BullMQ doesn't honor a URL for the Redis connection, and + // JS URL doesn't parse 'redis://' as a valid protocol, so we fool + // it by changing the URL to use 'http://' in order to parse out + // the host, port, username, password, etc. + // We could pass REDIS_HOST, REDIS_PORT, etc, in the environment, but + // trying to keep the # of environment variables from proliferating + const url = new URL(configService.redisUrl.toString().replace(/^redis[s]*/, 'http')); + const { hostname, port, username, password, pathname } = url; + return { + connection: { + host: hostname || undefined, + port: port ? Number(port) : undefined, + username: username || undefined, + password: password || undefined, + db: pathname?.length > 1 ? Number(pathname.slice(1)) : undefined, + }, + }; + }, + inject: [ConfigService], + }), + BullModule.registerQueue({ + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + }), + ], + providers: [GraphUpdatePublisherService], + exports: [BullModule, GraphUpdatePublisherService], +}) +export class GraphUpdatePublisherModule {} diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts new file mode 100644 index 00000000..33cef725 --- /dev/null +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -0,0 +1,31 @@ +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Processor } from '@nestjs/bullmq'; +import { Injectable } from '@nestjs/common'; +import { Job } from 'bullmq'; +import Redis from 'ioredis'; +import { Update } from '@dsnp/graph-sdk'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { QueueConstants } from '../../../../libs/common/src'; +import { BaseConsumer } from '../BaseConsumer'; + +@Injectable() +@Processor(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) +export class GraphUpdatePublisherService extends BaseConsumer { + constructor( + @InjectRedis() private cacheManager: Redis, + private configService: ConfigService, + ) { + super(); + } + + async process(job: Job): Promise { + this.logger.log(`Processing job ${job.id} of type ${job.name}`); + try { + // TODO: add logic to process graph change requests + this.logger.debug(job.asJSON()); + } catch (e) { + this.logger.error(e); + throw e; + } + } +} diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 8ab35a9b..47731f42 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -8,6 +8,8 @@ import { RequestProcessorModule } from './request_processor/request.processor.mo import { RequestProcessorService } from './request_processor/request.processor.service'; import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; +import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.processor.module'; +import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; @Module({ imports: [ @@ -44,7 +46,8 @@ import { ConfigService } from '../../../libs/common/src/config/config.service'; ScheduleModule.forRoot(), BlockchainModule, RequestProcessorModule, + GraphUpdatePublisherModule, ], - providers: [ConfigService, RequestProcessorService], + providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService], }) export class WorkerModule {} diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index 8adae0ea..91394f99 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -3,4 +3,9 @@ export namespace QueueConstants { * Name of the queue that has all incoming requests */ export const GRAPH_CHANGE_REQUEST_QUEUE = 'graphChangeRequest'; + + /** + * Name of the queue that publishes graph changes to Frequency blockchain + */ + export const GRAPH_CHANGE_PUBLISH_QUEUE = 'graphChangePublish'; } From 2af044d8b6713d5b8d8aa46b04bd1ce21f178cfd Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 15 Dec 2023 22:22:28 +0530 Subject: [PATCH 06/53] add graph change tx monitor/notifier (#18) * add graph change tx monitor/notifier * add TODOs --- .../graph.publisher.processor.module.ts | 56 +++++++++++++++++++ .../graph.publisher.processor.service.ts | 31 ++++++++++ .../graph.publisher.processor.module.ts | 15 ++++- .../graph.publisher.processor.service.ts | 6 +- apps/worker/src/worker.module.ts | 5 +- libs/common/src/dtos/graph.notifier.job.ts | 10 ++++ libs/common/src/dtos/graph.update.job.ts | 7 +++ libs/common/src/index.ts | 1 + libs/common/src/utils/queues.ts | 5 ++ 9 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 apps/worker/src/graph_notifier/graph.publisher.processor.module.ts create mode 100644 apps/worker/src/graph_notifier/graph.publisher.processor.service.ts create mode 100644 libs/common/src/dtos/graph.notifier.job.ts create mode 100644 libs/common/src/dtos/graph.update.job.ts diff --git a/apps/worker/src/graph_notifier/graph.publisher.processor.module.ts b/apps/worker/src/graph_notifier/graph.publisher.processor.module.ts new file mode 100644 index 00000000..9b27daab --- /dev/null +++ b/apps/worker/src/graph_notifier/graph.publisher.processor.module.ts @@ -0,0 +1,56 @@ +/* +https://docs.nestjs.com/modules +*/ + +import { BullModule } from '@nestjs/bullmq'; +import { Module } from '@nestjs/common'; +import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { ConfigModule } from '../../../../libs/common/src/config/config.module'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { QueueConstants } from '../../../../libs/common/src'; +import { GraphNotifierService } from './graph.publisher.processor.service'; + +@Module({ + imports: [ + ConfigModule, + RedisModule.forRootAsync( + { + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + config: [{ url: configService.redisUrl.toString() }], + }), + inject: [ConfigService], + }, + true, // isGlobal + ), + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: (configService: ConfigService) => { + // Note: BullMQ doesn't honor a URL for the Redis connection, and + // JS URL doesn't parse 'redis://' as a valid protocol, so we fool + // it by changing the URL to use 'http://' in order to parse out + // the host, port, username, password, etc. + // We could pass REDIS_HOST, REDIS_PORT, etc, in the environment, but + // trying to keep the # of environment variables from proliferating + const url = new URL(configService.redisUrl.toString().replace(/^redis[s]*/, 'http')); + const { hostname, port, username, password, pathname } = url; + return { + connection: { + host: hostname || undefined, + port: port ? Number(port) : undefined, + username: username || undefined, + password: password || undefined, + db: pathname?.length > 1 ? Number(pathname.slice(1)) : undefined, + }, + }; + }, + inject: [ConfigService], + }), + BullModule.registerQueue({ + name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + }), + ], + providers: [GraphNotifierService], + exports: [BullModule, GraphNotifierService], +}) +export class GraphNotifierModule {} diff --git a/apps/worker/src/graph_notifier/graph.publisher.processor.service.ts b/apps/worker/src/graph_notifier/graph.publisher.processor.service.ts new file mode 100644 index 00000000..666d5e41 --- /dev/null +++ b/apps/worker/src/graph_notifier/graph.publisher.processor.service.ts @@ -0,0 +1,31 @@ +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Processor } from '@nestjs/bullmq'; +import { Injectable } from '@nestjs/common'; +import { Job } from 'bullmq'; +import Redis from 'ioredis'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { QueueConstants } from '../../../../libs/common/src'; +import { BaseConsumer } from '../BaseConsumer'; +import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; + +@Injectable() +@Processor(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) +export class GraphNotifierService extends BaseConsumer { + constructor( + @InjectRedis() private cacheManager: Redis, + private configService: ConfigService, + ) { + super(); + } + + async process(job: Job): Promise { + this.logger.log(`Processing job ${job.id} of type ${job.name}`); + try { + // TODO: add logic to process graph tx checks and subsequent notifications + this.logger.debug(job.asJSON()); + } catch (e) { + this.logger.error(e); + throw e; + } + } +} diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts index 89a7a66c..a48e7d64 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts @@ -46,9 +46,18 @@ import { GraphUpdatePublisherService } from './graph.publisher.processor.service }, inject: [ConfigService], }), - BullModule.registerQueue({ - name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, - }), + BullModule.registerQueue( + { + name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + }, + }, + { + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + }, + ), ], providers: [GraphUpdatePublisherService], exports: [BullModule, GraphUpdatePublisherService], diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index 33cef725..fae5fd7c 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -3,10 +3,10 @@ import { Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job } from 'bullmq'; import Redis from 'ioredis'; -import { Update } from '@dsnp/graph-sdk'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; import { QueueConstants } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; +import { GraphUpdateJob } from '../../../../libs/common/src/dtos/graph.update.job'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) @@ -18,10 +18,10 @@ export class GraphUpdatePublisherService extends BaseConsumer { super(); } - async process(job: Job): Promise { + async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { - // TODO: add logic to process graph change requests + // TODO: add logic to send update to Frequency stateful storage this.logger.debug(job.asJSON()); } catch (e) { this.logger.error(e); diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 47731f42..651f9e04 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -10,6 +10,8 @@ import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.processor.module'; import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; +import { GraphNotifierModule } from './graph_notifier/graph.publisher.processor.module'; +import { GraphNotifierService } from './graph_notifier/graph.publisher.processor.service'; @Module({ imports: [ @@ -47,7 +49,8 @@ import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.p BlockchainModule, RequestProcessorModule, GraphUpdatePublisherModule, + GraphNotifierModule, ], - providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService], + providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService, GraphNotifierService], }) export class WorkerModule {} diff --git a/libs/common/src/dtos/graph.notifier.job.ts b/libs/common/src/dtos/graph.notifier.job.ts new file mode 100644 index 00000000..b6b8115b --- /dev/null +++ b/libs/common/src/dtos/graph.notifier.job.ts @@ -0,0 +1,10 @@ +import { BlockHash, Hash } from '@polkadot/types/interfaces'; +import { GraphUpdateJob } from './graph.update.job'; + +export interface ITxMonitorJob { + id: string; + txHash: Hash; + epoch: string; + lastFinalizedBlockHash: BlockHash; + referencePublishJob: GraphUpdateJob; +} diff --git a/libs/common/src/dtos/graph.update.job.ts b/libs/common/src/dtos/graph.update.job.ts new file mode 100644 index 00000000..bd6de9d5 --- /dev/null +++ b/libs/common/src/dtos/graph.update.job.ts @@ -0,0 +1,7 @@ +import { Update } from '@dsnp/graph-sdk'; + +export class GraphUpdateJob { + referenceId: string; + + update: Update; +} diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 58258809..39e6c401 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -12,5 +12,6 @@ export * from './dtos/connections.dto'; export * from './dtos/watch-graphs.dto'; export * from './dtos/dsnp.graph.edge.dto'; export * from './dtos/graph.change.request.reference'; +export * from './dtos/graph.update.job'; export * from './utils/nonce.service'; export * from './utils/queues'; diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index 91394f99..0382dba4 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -8,4 +8,9 @@ export namespace QueueConstants { * Name of the queue that publishes graph changes to Frequency blockchain */ export const GRAPH_CHANGE_PUBLISH_QUEUE = 'graphChangePublish'; + + /** + * Name of the queue that processes graph change notifications + */ + export const GRAPH_CHANGE_NOTIFY_QUEUE = 'graphChangeNotify'; } From 39e3c3889a37feebf30792c407ab03b9cf8b113f Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 15 Dec 2023 22:27:15 +0530 Subject: [PATCH 07/53] rename notifier processor (#19) --- ....processor.module.ts => graph.monitor.processor.module.ts} | 2 +- ...rocessor.service.ts => graph.monitor.processor.service.ts} | 0 apps/worker/src/worker.module.ts | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename apps/worker/src/graph_notifier/{graph.publisher.processor.module.ts => graph.monitor.processor.module.ts} (96%) rename apps/worker/src/graph_notifier/{graph.publisher.processor.service.ts => graph.monitor.processor.service.ts} (100%) diff --git a/apps/worker/src/graph_notifier/graph.publisher.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts similarity index 96% rename from apps/worker/src/graph_notifier/graph.publisher.processor.module.ts rename to apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index 9b27daab..8df4a125 100644 --- a/apps/worker/src/graph_notifier/graph.publisher.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -8,7 +8,7 @@ import { RedisModule } from '@liaoliaots/nestjs-redis'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; import { QueueConstants } from '../../../../libs/common/src'; -import { GraphNotifierService } from './graph.publisher.processor.service'; +import { GraphNotifierService } from './graph.monitor.processor.service'; @Module({ imports: [ diff --git a/apps/worker/src/graph_notifier/graph.publisher.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts similarity index 100% rename from apps/worker/src/graph_notifier/graph.publisher.processor.service.ts rename to apps/worker/src/graph_notifier/graph.monitor.processor.service.ts diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 651f9e04..01024c90 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -10,8 +10,8 @@ import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.processor.module'; import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; -import { GraphNotifierModule } from './graph_notifier/graph.publisher.processor.module'; -import { GraphNotifierService } from './graph_notifier/graph.publisher.processor.service'; +import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; +import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; @Module({ imports: [ From 177efdd54f102fd3e12196c73f91925ec4769662 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Wed, 20 Dec 2023 15:34:55 +0530 Subject: [PATCH 08/53] Optional reconnection service (#20) * add flag for optional reconnection service * add service and queue processor for reconnection jobs * lint --- .env.dev | 3 + .gitignore | 2 +- apps/api/src/api.module.ts | 14 ++ .../graph.reconnection.processor.module.ts | 56 ++++++++ .../graph.reconnection.processor.service.ts | 30 ++++ docker-compose.dev.yaml | 4 +- env.template | 3 + .../blockchain/blockchain-scanner.service.ts | 131 ++++++++++++++++++ libs/common/src/config/config.service.spec.ts | 15 ++ libs/common/src/config/config.service.ts | 15 ++ libs/common/src/config/env.config.ts | 15 ++ .../src/dtos/graph-update-job.interface.ts | 47 +++++++ libs/common/src/index.ts | 1 + libs/common/src/utils/queues.ts | 5 + 14 files changed, 338 insertions(+), 3 deletions(-) create mode 100644 apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts create mode 100644 apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts create mode 100644 libs/common/src/blockchain/blockchain-scanner.service.ts create mode 100644 libs/common/src/dtos/graph-update-job.interface.ts diff --git a/.env.dev b/.env.dev index fbb0f87f..673a0791 100644 --- a/.env.dev +++ b/.env.dev @@ -3,6 +3,8 @@ FREQUENCY_URL=ws://0.0.0.0:9944 REDIS_URL=redis://0.0.0.0:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 +RECONNECTION_SERVICE_REQUIRED=false +BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev @@ -12,3 +14,4 @@ GRAPH_ENVIRONMENT_TYPE=Dev # Be careful to escape any inner quotes as this is in a .env file. GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" +PROVIDER_ID=1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index c6bba591..e5988edc 100644 --- a/.gitignore +++ b/.gitignore @@ -74,7 +74,7 @@ web_modules/ # dotenv environment variable files .env -.env.development.local +.env.dev .env.test.local .env.production.local .env.local diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index 1009606f..658d5711 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -75,6 +75,12 @@ import { QueueConstants } from '../../../libs/common/src'; { name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, }, + { + name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + }, + { + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + }, ), // Bullboard UI BullBoardModule.forRoot({ @@ -89,6 +95,14 @@ import { QueueConstants } from '../../../libs/common/src'; name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, adapter: BullMQAdapter, }), + BullBoardModule.forFeature({ + name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + adapter: BullMQAdapter, + }), + BullBoardModule.forFeature({ + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + adapter: BullMQAdapter, + }), ScheduleModule.forRoot(), ], providers: [ApiService], diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts new file mode 100644 index 00000000..7adfaf50 --- /dev/null +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts @@ -0,0 +1,56 @@ +/* +https://docs.nestjs.com/modules +*/ + +import { BullModule } from '@nestjs/bullmq'; +import { Module } from '@nestjs/common'; +import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { ConfigModule } from '../../../../libs/common/src/config/config.module'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { QueueConstants } from '../../../../libs/common/src'; +import { GraphReconnectionService } from './graph.reconnection.processor.service'; + +@Module({ + imports: [ + ConfigModule, + RedisModule.forRootAsync( + { + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + config: [{ url: configService.redisUrl.toString() }], + }), + inject: [ConfigService], + }, + true, // isGlobal + ), + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: (configService: ConfigService) => { + // Note: BullMQ doesn't honor a URL for the Redis connection, and + // JS URL doesn't parse 'redis://' as a valid protocol, so we fool + // it by changing the URL to use 'http://' in order to parse out + // the host, port, username, password, etc. + // We could pass REDIS_HOST, REDIS_PORT, etc, in the environment, but + // trying to keep the # of environment variables from proliferating + const url = new URL(configService.redisUrl.toString().replace(/^redis[s]*/, 'http')); + const { hostname, port, username, password, pathname } = url; + return { + connection: { + host: hostname || undefined, + port: port ? Number(port) : undefined, + username: username || undefined, + password: password || undefined, + db: pathname?.length > 1 ? Number(pathname.slice(1)) : undefined, + }, + }; + }, + inject: [ConfigService], + }), + BullModule.registerQueue({ + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + }), + ], + providers: [GraphReconnectionService], + exports: [BullModule, GraphReconnectionService], +}) +export class GraphReconnectionModule {} diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts new file mode 100644 index 00000000..5bb1caaa --- /dev/null +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -0,0 +1,30 @@ +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Processor } from '@nestjs/bullmq'; +import { Injectable } from '@nestjs/common'; +import { Job } from 'bullmq'; +import Redis from 'ioredis'; +import { ConfigService } from '../../../../libs/common/src/config/config.service'; +import { IGraphUpdateJob, QueueConstants } from '../../../../libs/common/src'; +import { BaseConsumer } from '../BaseConsumer'; + +@Injectable() +@Processor(QueueConstants.RECONNECT_REQUEST_QUEUE) +export class GraphReconnectionService extends BaseConsumer { + constructor( + @InjectRedis() private cacheManager: Redis, + private configService: ConfigService, + ) { + super(); + } + + async process(job: Job): Promise { + this.logger.log(`Processing job ${job.id} of type ${job.name}`); + try { + // TODO: add logic to process reconnection job and queue to request processor + this.logger.debug(job.asJSON()); + } catch (e) { + this.logger.error(e); + throw e; + } + } +} diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index f001e51d..58c92732 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -54,7 +54,7 @@ services: ports: - 3000:3000 env_file: - - .env.docker.dev + - .env.dev environment: - START_PROCESS=api - REDIS_URL=redis://redis:6379 @@ -71,7 +71,7 @@ services: context: . dockerfile: dev.Dockerfile env_file: - - .env.docker.dev + - .env.dev environment: - START_PROCESS=worker - REDIS_URL=redis://redis:6379 diff --git a/env.template b/env.template index 62ee0d85..cfffa52f 100644 --- a/env.template +++ b/env.template @@ -3,6 +3,8 @@ FREQUENCY_URL=ws://0.0.0.0:9944 REDIS_URL=redis://0.0.0.0:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 +RECONNECTION_SERVICE_REQUIRED=false +BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev @@ -12,3 +14,4 @@ GRAPH_ENVIRONMENT_TYPE=Dev # Be careful to escape any inner quotes as this is in a .env file. GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" +PROVIDER_ID=1 \ No newline at end of file diff --git a/libs/common/src/blockchain/blockchain-scanner.service.ts b/libs/common/src/blockchain/blockchain-scanner.service.ts new file mode 100644 index 00000000..bce9ea54 --- /dev/null +++ b/libs/common/src/blockchain/blockchain-scanner.service.ts @@ -0,0 +1,131 @@ +import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common'; +import { BlockHash } from '@polkadot/types/interfaces'; +import { InjectQueue } from '@nestjs/bullmq'; +import { Queue } from 'bullmq'; +import { SchedulerRegistry } from '@nestjs/schedule'; +import { MILLISECONDS_PER_SECOND, SECONDS_PER_MINUTE } from 'time-constants'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import Redis from 'ioredis'; +import { ConfigService } from '../config/config.service'; +import { BlockchainService } from './blockchain.service'; +import { QueueConstants } from '../utils/queues'; +import { UpdateTransitiveGraphs, createReconnectionJob } from '../dtos/graph-update-job.interface'; + +export const LAST_SEEN_BLOCK_NUMBER_KEY = 'lastSeenBlockNumber'; + +@Injectable() +export class BlockchainScannerService implements OnApplicationBootstrap { + private logger: Logger; + + private scanInProgress = false; + + async onApplicationBootstrap() { + if (this.configService.getReconnectionServiceRequired()) { + // Set up recurring interval + const interval = setInterval(() => this.scan(), this.configService.getBlockchainScanIntervalMinutes() * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND); + this.schedulerRegistry.addInterval('blockchainScan', interval); + + // Kick off initial scan + const initialTimeout = setTimeout(() => this.scan(), 0); + this.schedulerRegistry.addTimeout('initialScan', initialTimeout); + } + } + + constructor( + @InjectRedis() private cacheManager: Redis, + @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectionQueue: Queue, + private readonly configService: ConfigService, + private schedulerRegistry: SchedulerRegistry, + private blockchainService: BlockchainService, + ) { + this.logger = new Logger(BlockchainScannerService.name); + } + + public async scan(): Promise { + try { + if (this.scanInProgress) { + this.logger.log('Scheduled blockchain scan skipped due to previous scan still in progress'); + return; + } + + // Only scan blocks if queue is empty + let queueSize = await this.reconnectionQueue.count(); + if (queueSize > 0) { + this.logger.log('Deferring next blockchain scan until queue is empty'); + return; + } + + this.scanInProgress = true; + let currentBlockNumber: bigint; + let currentBlockHash: BlockHash; + + const lastSeenBlockNumber = await this.getLastSeenBlockNumber(); + currentBlockNumber = lastSeenBlockNumber + 1n; + currentBlockHash = await this.blockchainService.getBlockHash(currentBlockNumber); + + if (!currentBlockHash.some((byte) => byte !== 0)) { + this.logger.log('No new blocks to read; no scan performed.'); + this.scanInProgress = false; + return; + } + this.logger.log(`Starting scan from block #${currentBlockNumber} (${currentBlockHash})`); + + while (!currentBlockHash.isEmpty && queueSize < this.configService.getQueueHighWater()) { + // eslint-disable-next-line no-await-in-loop + const events = (await this.blockchainService.queryAt(currentBlockHash, 'system', 'events')).toArray(); + + const filteredEvents = events.filter( + ({ event }) => this.blockchainService.api.events.msa.DelegationGranted.is(event) && event.data.providerId.eq(this.configService.getProviderId()), + ); + + if (filteredEvents.length > 0) { + this.logger.debug(`Found ${filteredEvents.length} delegations at block #${currentBlockNumber}`); + } + const jobs = filteredEvents.map(async ({ event }) => { + const { key: jobId, data } = createReconnectionJob(event.data.delegatorId, event.data.providerId, UpdateTransitiveGraphs); + const job = await this.reconnectionQueue.getJob(jobId); + if (job && ((await job.isCompleted()) || (await job.isFailed()))) { + await job.retry(); + } else { + await this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); + } + }); + + // eslint-disable-next-line no-await-in-loop + await Promise.all(jobs); + // eslint-disable-next-line no-await-in-loop + await this.saveProgress(currentBlockNumber); + + // Move to the next block + currentBlockNumber += 1n; + // eslint-disable-next-line no-await-in-loop + currentBlockHash = await this.blockchainService.getBlockHash(currentBlockNumber); + // eslint-disable-next-line no-await-in-loop + queueSize = await this.reconnectionQueue.count(); + } + + if (currentBlockHash.isEmpty) { + this.logger.log(`Scan reached end-of-chain at block ${currentBlockNumber - 1n}`); + } else if (queueSize > this.configService.getQueueHighWater()) { + this.logger.log('Queue soft limit reached; pausing scan until next iteration'); + } + } catch (e) { + this.logger.error(JSON.stringify(e)); + throw e; + } finally { + this.scanInProgress = false; + } + } + + private async saveProgress(blockNumber: bigint): Promise { + await this.setLastSeenBlockNumber(blockNumber); + } + + public async getLastSeenBlockNumber(): Promise { + return BigInt(((await this.cacheManager.get(LAST_SEEN_BLOCK_NUMBER_KEY)) ?? 0).toString()); + } + + private async setLastSeenBlockNumber(b: bigint): Promise { + await this.cacheManager.set(LAST_SEEN_BLOCK_NUMBER_KEY, b.toString()); + } +} diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index 3e186f62..ce552ee5 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -40,9 +40,12 @@ describe('GraphSericeConfig', () => { FREQUENCY_URL: undefined, QUEUE_HIGH_WATER: undefined, API_PORT: undefined, + RECONNECTION_SERVICE_REQUIRED: undefined, + BLOCKCHAIN_SCAN_INTERVAL_MINUTES: undefined, GRAPH_ENVIRONMENT_TYPE: undefined, GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, PROVIDER_ACCOUNT_SEED_PHRASE: undefined, + PROVIDER_ID: undefined, }; beforeAll(() => { @@ -114,6 +117,14 @@ describe('GraphSericeConfig', () => { expect(graphServiceConfig.getApiPort()).toStrictEqual(parseInt(ALL_ENV.API_PORT as string, 10)); }); + it('should get reconnection service required', () => { + expect(graphServiceConfig.getReconnectionServiceRequired()).toStrictEqual(ALL_ENV.RECONNECTION_SERVICE_REQUIRED === 'true'); + }); + + it('should get blockchain scan interval minutes', () => { + expect(graphServiceConfig.getBlockchainScanIntervalMinutes()).toStrictEqual(parseInt(ALL_ENV.BLOCKCHAIN_SCAN_INTERVAL_MINUTES as string, 10)); + }); + it('should get graph environment type', () => { expect(graphServiceConfig.getGraphEnvironmentType()).toStrictEqual(ALL_ENV.GRAPH_ENVIRONMENT_TYPE); }); @@ -125,5 +136,9 @@ describe('GraphSericeConfig', () => { it('should get provider account seed phrase', () => { expect(graphServiceConfig.getProviderAccountSeedPhrase()).toStrictEqual(ALL_ENV.PROVIDER_ACCOUNT_SEED_PHRASE); }); + + it('should get provider id', () => { + expect(graphServiceConfig.getProviderId()).toStrictEqual(ALL_ENV.PROVIDER_ID); + }); }); }); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index 96394c1f..fe2058d2 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -11,9 +11,12 @@ export interface ConfigEnvironmentVariables { FREQUENCY_URL: URL; QUEUE_HIGH_WATER: number; API_PORT: number; + RECONNECTION_SERVICE_REQUIRED: boolean; + BLOCKCHAIN_SCAN_INTERVAL_MINUTES: number; GRAPH_ENVIRONMENT_TYPE: keyof EnvironmentType; GRAPH_ENVIRONMENT_DEV_CONFIG?: string; PROVIDER_ACCOUNT_SEED_PHRASE: string; + PROVIDER_ID: string; } /// Config service to get global app and provider-specific config values. @@ -25,6 +28,10 @@ export class ConfigService { this.logger = new Logger(this.constructor.name); } + public getProviderId(): string { + return this.nestConfigService.get('PROVIDER_ID')!; + } + public getQueueHighWater(): number { return this.nestConfigService.get('QUEUE_HIGH_WATER')!; } @@ -33,6 +40,14 @@ export class ConfigService { return this.nestConfigService.get('API_PORT')!; } + public getReconnectionServiceRequired(): boolean { + return this.nestConfigService.get('RECONNECTION_SERVICE_REQUIRED')!; + } + + public getBlockchainScanIntervalMinutes(): number { + return this.nestConfigService.get('BLOCKCHAIN_SCAN_INTERVAL_MINUTES')!; + } + public getRedisUrl(): URL { return this.nestConfigService.get('REDIS_URL')!; } diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index e5a87afc..e431f123 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -8,6 +8,10 @@ export const configModuleOptions: ConfigModuleOptions = { FREQUENCY_URL: Joi.string().uri().required(), QUEUE_HIGH_WATER: Joi.number().min(100).default(1000), API_PORT: Joi.number().min(0).default(3000), + RECONNECTION_SERVICE_REQUIRED: Joi.boolean().default(false), + BLOCKCHAIN_SCAN_INTERVAL_MINUTES: Joi.number() + .min(1) + .default(3 * 60), GRAPH_ENVIRONMENT_TYPE: Joi.string().required().valid('Mainnet', 'Rococo', 'Dev'), // GRAPH_ENVIRONMENT_DEV_CONFIG is optional, but if it is set, it must be a valid JSON string GRAPH_ENVIRONMENT_DEV_CONFIG: Joi.string().when('GRAPH_ENVIRONMENT_TYPE', { @@ -24,5 +28,16 @@ export const configModuleOptions: ConfigModuleOptions = { }), }), PROVIDER_ACCOUNT_SEED_PHRASE: Joi.string().required(), + PROVIDER_ID: Joi.required().custom((value: string, helpers) => { + try { + const id = BigInt(value); + if (id < 0) { + throw new Error('Provider ID must be > 0'); + } + } catch (e) { + return helpers.error('any.invalid'); + } + return value; + }), }), }; diff --git a/libs/common/src/dtos/graph-update-job.interface.ts b/libs/common/src/dtos/graph-update-job.interface.ts new file mode 100644 index 00000000..8a6a6d55 --- /dev/null +++ b/libs/common/src/dtos/graph-update-job.interface.ts @@ -0,0 +1,47 @@ +import { MessageSourceId, ProviderId } from '@frequency-chain/api-augment/interfaces'; +import { AnyNumber } from '@polkadot/types/types'; + +export const UpdateTransitiveGraphs = true; +export const SkipTransitiveGraphs = false; + +// Note: DSNP IDs are u64 on Frequency, but since JS 'bigint' doesn't automatically +// serialize to JSON, we use strings here. +export interface IGraphUpdateJob { + dsnpId: string; + providerId: string; + processTransitiveUpdates: boolean; + + // Use for internal development/testing, can queue a job + // and have the processor complete, fail, retry, etc, based on the value + debugDisposition?: string; +} + +export function createReconnectionJob( + dsnpIdValue: MessageSourceId | AnyNumber | string, + providerIdValue: ProviderId | AnyNumber | string, + processTransitiveUpdates: boolean, + debugDisposition?: string, +): { key: string; data: IGraphUpdateJob } { + let dsnpId: string; + let providerId: string; + if (typeof dsnpIdValue !== 'string') { + dsnpId = dsnpIdValue.toString(); + } else { + dsnpId = dsnpIdValue; + } + if (typeof providerIdValue !== 'string') { + providerId = providerIdValue.toString(); + } else { + providerId = providerIdValue; + } + + return { + key: `${dsnpId}:${providerId}:${processTransitiveUpdates}`, + data: { + dsnpId, + providerId, + processTransitiveUpdates, + debugDisposition, + }, + }; +} diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 39e6c401..04a3d91e 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -13,5 +13,6 @@ export * from './dtos/watch-graphs.dto'; export * from './dtos/dsnp.graph.edge.dto'; export * from './dtos/graph.change.request.reference'; export * from './dtos/graph.update.job'; +export * from './dtos/graph-update-job.interface'; export * from './utils/nonce.service'; export * from './utils/queues'; diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index 0382dba4..e5399066 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -1,4 +1,9 @@ export namespace QueueConstants { + /** + * Name of the queue that has all reconnecting requests + */ + export const RECONNECT_REQUEST_QUEUE = 'reconnectRequest'; + /** * Name of the queue that has all incoming requests */ From 98777b7d54fd5cb0c1c8f3cb649908122397cd4b Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Thu, 21 Dec 2023 09:14:23 +0530 Subject: [PATCH 09/53] =?UTF-8?q?add=20provider=20webhook=20service=20to?= =?UTF-8?q?=20reterive=20user=20graphs/keys=20when=20reconn=E2=80=A6=20(#2?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add provider webhook service to reterive user graphs/keys when reconnection is on * set workers and nest cli --- .env.dev | 16 ++- .../graph.reconnection.processor.service.ts | 23 +++- apps/worker/src/worker.module.ts | 18 +++- env.template | 16 ++- libs/common/src/config/config.service.spec.ts | 40 +++++++ libs/common/src/config/config.service.ts | 48 ++++++++- libs/common/src/config/env.config.ts | 11 ++ libs/common/src/index.ts | 1 + .../src/utils/provider-webhook.service.ts | 101 ++++++++++++++++++ nest-cli.json | 10 ++ 10 files changed, 272 insertions(+), 12 deletions(-) create mode 100644 libs/common/src/utils/provider-webhook.service.ts diff --git a/.env.dev b/.env.dev index 673a0791..33aa30f2 100644 --- a/.env.dev +++ b/.env.dev @@ -3,8 +3,6 @@ FREQUENCY_URL=ws://0.0.0.0:9944 REDIS_URL=redis://0.0.0.0:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 -RECONNECTION_SERVICE_REQUIRED=false -BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev @@ -14,4 +12,16 @@ GRAPH_ENVIRONMENT_TYPE=Dev # Be careful to escape any inner quotes as this is in a .env file. GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" -PROVIDER_ID=1 \ No newline at end of file +PROVIDER_ID=1 + +# following are optional if reconnection service is is required +PROVIDER_BASE_URL="http://localhost:3000" # this is optional if reconnection service is not required +PROVIDER_ACCESS_TOKEN="api-key" # this is optional if reconnection service if PROVIDER_BASE_URL requires an access token +PAGE_SIZE=100 +RECONNECTION_SERVICE_REQUIRED=true +BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 +WEBHOOK_FAILURE_THRESHOLD=3 +HEALTH_CHECK_SUCCESS_THRESHOLD=10 +WEBHOOK_RETRY_INTERVAL_SECONDS=10 +HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 +HEALTH_CHECK_MAX_RETRIES=4 \ No newline at end of file diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index 5bb1caaa..16dc803b 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -1,18 +1,23 @@ import { InjectRedis } from '@liaoliaots/nestjs-redis'; -import { Processor } from '@nestjs/bullmq'; +import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; -import { Job } from 'bullmq'; +import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; +import { OnEvent } from '@nestjs/event-emitter'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { IGraphUpdateJob, QueueConstants } from '../../../../libs/common/src'; +import { IGraphUpdateJob, ProviderWebhookService, QueueConstants } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; @Injectable() @Processor(QueueConstants.RECONNECT_REQUEST_QUEUE) export class GraphReconnectionService extends BaseConsumer { + private webhookOk = true; + constructor( @InjectRedis() private cacheManager: Redis, + @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectRequestQueue: Queue, private configService: ConfigService, + private providerWebhookService: ProviderWebhookService, ) { super(); } @@ -27,4 +32,16 @@ export class GraphReconnectionService extends BaseConsumer { throw e; } } + + @OnEvent('webhook.unhealthy', { async: true, promisify: true }) + private async handleWebhookGone() { + this.logger.debug('Received webhook.unhealthy event, pausing reconnection queue'); + await this.reconnectRequestQueue.pause(); + } + + @OnEvent('webhook.healthy', { async: true, promisify: true }) + private async handleWebhookRestored() { + this.logger.debug('Received webhook.healthy event, resuming reconnection queue'); + await this.reconnectRequestQueue.resume(); + } } diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 01024c90..b01e0897 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -12,6 +12,8 @@ import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.pr import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; +import { ProviderWebhookService, QueueConstants } from '../../../libs/common/src'; +import { BlockchainScannerService } from '../../../libs/common/src/blockchain/blockchain-scanner.service'; @Module({ imports: [ @@ -45,12 +47,26 @@ import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.s // disable throwing uncaughtException if an error event is emitted and it has no listeners ignoreErrors: false, }), + BullModule.registerQueue( + { + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + }, + { + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + }, + ), ScheduleModule.forRoot(), BlockchainModule, RequestProcessorModule, GraphUpdatePublisherModule, GraphNotifierModule, ], - providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService, GraphNotifierService], + providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService, GraphNotifierService, ProviderWebhookService, BlockchainScannerService], }) export class WorkerModule {} diff --git a/env.template b/env.template index cfffa52f..405d8873 100644 --- a/env.template +++ b/env.template @@ -3,8 +3,6 @@ FREQUENCY_URL=ws://0.0.0.0:9944 REDIS_URL=redis://0.0.0.0:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 -RECONNECTION_SERVICE_REQUIRED=false -BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev @@ -14,4 +12,16 @@ GRAPH_ENVIRONMENT_TYPE=Dev # Be careful to escape any inner quotes as this is in a .env file. GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" -PROVIDER_ID=1 \ No newline at end of file +PROVIDER_ID=1 + +# following are optional if reconnection service is is required +PROVIDER_BASE_URL="http://localhost:3000" # this is optional if reconnection service is not required +PROVIDER_ACCESS_TOKEN="api-key" # this is optional if reconnection service if PROVIDER_BASE_URL requires an access token +PAGE_SIZE=100 +RECONNECTION_SERVICE_REQUIRED=true +BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 +WEBHOOK_FAILURE_THRESHOLD=3 +HEALTH_CHECK_SUCCESS_THRESHOLD=10 +WEBHOOK_RETRY_INTERVAL_SECONDS=10 +HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 +HEALTH_CHECK_MAX_RETRIES=4 \ No newline at end of file diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index ce552ee5..c8aabb42 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -46,6 +46,14 @@ describe('GraphSericeConfig', () => { GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, PROVIDER_ACCOUNT_SEED_PHRASE: undefined, PROVIDER_ID: undefined, + PROVIDER_BASE_URL: undefined, + PROVIDER_ACCESS_TOKEN: undefined, + WEBHOOK_FAILURE_THRESHOLD: undefined, + HEALTH_CHECK_SUCCESS_THRESHOLD: undefined, + WEBHOOK_RETRY_INTERVAL_SECONDS: undefined, + HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: undefined, + HEALTH_CHECK_MAX_RETRIES: undefined, + PAGE_SIZE: undefined, }; beforeAll(() => { @@ -140,5 +148,37 @@ describe('GraphSericeConfig', () => { it('should get provider id', () => { expect(graphServiceConfig.getProviderId()).toStrictEqual(ALL_ENV.PROVIDER_ID); }); + + it('should get provider base url', () => { + expect(graphServiceConfig.providerBaseUrl?.toString()).toStrictEqual(ALL_ENV.PROVIDER_BASE_URL?.toString()); + }); + + it('should get provider api token', () => { + expect(graphServiceConfig.providerApiToken).toStrictEqual(ALL_ENV.PROVIDER_ACCESS_TOKEN); + }); + + it('should get webhook failure threshold', () => { + expect(graphServiceConfig.getWebhookFailureThreshold()).toStrictEqual(parseInt(ALL_ENV.WEBHOOK_FAILURE_THRESHOLD as string, 10)); + }); + + it('should get health check success threshold', () => { + expect(graphServiceConfig.getHealthCheckSuccessThreshold()).toStrictEqual(parseInt(ALL_ENV.HEALTH_CHECK_SUCCESS_THRESHOLD as string, 10)); + }); + + it('should get webhook retry interval seconds', () => { + expect(graphServiceConfig.getWebhookRetryIntervalSeconds()).toStrictEqual(parseInt(ALL_ENV.WEBHOOK_RETRY_INTERVAL_SECONDS as string, 10)); + }); + + it('should get health check max retry interval seconds', () => { + expect(graphServiceConfig.getHealthCheckMaxRetryIntervalSeconds()).toStrictEqual(parseInt(ALL_ENV.HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS as string, 10)); + }); + + it('should get health check max retries', () => { + expect(graphServiceConfig.getHealthCheckMaxRetries()).toStrictEqual(parseInt(ALL_ENV.HEALTH_CHECK_MAX_RETRIES as string, 10)); + }); + + it('should get page size', () => { + expect(graphServiceConfig.getPageSize()).toStrictEqual(parseInt(ALL_ENV.PAGE_SIZE as string, 10)); + }); }); }); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index fe2058d2..4ad04f83 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -11,12 +11,20 @@ export interface ConfigEnvironmentVariables { FREQUENCY_URL: URL; QUEUE_HIGH_WATER: number; API_PORT: number; - RECONNECTION_SERVICE_REQUIRED: boolean; - BLOCKCHAIN_SCAN_INTERVAL_MINUTES: number; GRAPH_ENVIRONMENT_TYPE: keyof EnvironmentType; GRAPH_ENVIRONMENT_DEV_CONFIG?: string; PROVIDER_ACCOUNT_SEED_PHRASE: string; PROVIDER_ID: string; + RECONNECTION_SERVICE_REQUIRED: boolean; + BLOCKCHAIN_SCAN_INTERVAL_MINUTES: number; + PROVIDER_BASE_URL: string; + PROVIDER_ACCESS_TOKEN: string; + WEBHOOK_FAILURE_THRESHOLD: number; + HEALTH_CHECK_SUCCESS_THRESHOLD: number; + WEBHOOK_RETRY_INTERVAL_SECONDS: number; + HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: number; + HEALTH_CHECK_MAX_RETRIES: number; + PAGE_SIZE: number; } /// Config service to get global app and provider-specific config values. @@ -28,6 +36,14 @@ export class ConfigService { this.logger = new Logger(this.constructor.name); } + public get providerBaseUrl(): URL { + return this.nestConfigService.get('PROVIDER_BASE_URL')!; + } + + public get providerApiToken(): string | undefined { + return this.nestConfigService.get('PROVIDER_ACCESS_TOKEN'); + } + public getProviderId(): string { return this.nestConfigService.get('PROVIDER_ID')!; } @@ -75,4 +91,32 @@ export class ConfigService { public get frequencyUrl(): URL { return this.nestConfigService.get('FREQUENCY_URL')!; } + + public getHealthCheckMaxRetries(): number { + return this.nestConfigService.get('HEALTH_CHECK_MAX_RETRIES')!; + } + + public getHealthCheckMaxRetryIntervalSeconds(): number { + return this.nestConfigService.get('HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS')!; + } + + public getHealthCheckSuccessThreshold(): number { + return this.nestConfigService.get('HEALTH_CHECK_SUCCESS_THRESHOLD')!; + } + + public getWebhookFailureThreshold(): number { + return this.nestConfigService.get('WEBHOOK_FAILURE_THRESHOLD')!; + } + + public getWebhookRetryIntervalSeconds(): number { + return this.nestConfigService.get('WEBHOOK_RETRY_INTERVAL_SECONDS')!; + } + + public get webhookRetryIntervalSeconds(): number { + return this.nestConfigService.get('WEBHOOK_RETRY_INTERVAL_SECONDS')!; + } + + public getPageSize(): number { + return this.nestConfigService.get('PAGE_SIZE')!; + } } diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index e431f123..24cf2256 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -39,5 +39,16 @@ export const configModuleOptions: ConfigModuleOptions = { } return value; }), + PROVIDER_BASE_URL: Joi.string().uri().when('RECONNECTION_SERVICE_REQUIRED', { + is: true, + then: Joi.string().required(), + }), + PROVIDER_ACCESS_TOKEN: Joi.string().default(''), + WEBHOOK_FAILURE_THRESHOLD: Joi.number().min(1).default(3), + WEBHOOK_RETRY_INTERVAL_SECONDS: Joi.number().min(1).default(10), + HEALTH_CHECK_SUCCESS_THRESHOLD: Joi.number().min(1).default(10), + HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: Joi.number().min(1).default(64), + HEALTH_CHECK_MAX_RETRIES: Joi.number().min(0).default(20), + PAGE_SIZE: Joi.number().min(1).default(100), }), }; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 04a3d91e..7c067463 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -16,3 +16,4 @@ export * from './dtos/graph.update.job'; export * from './dtos/graph-update-job.interface'; export * from './utils/nonce.service'; export * from './utils/queues'; +export * from './utils/provider-webhook.service'; diff --git a/libs/common/src/utils/provider-webhook.service.ts b/libs/common/src/utils/provider-webhook.service.ts new file mode 100644 index 00000000..228b1dcc --- /dev/null +++ b/libs/common/src/utils/provider-webhook.service.ts @@ -0,0 +1,101 @@ +import { Injectable, Logger, OnModuleDestroy } from '@nestjs/common'; +import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; +import { SchedulerRegistry } from '@nestjs/schedule'; +import axios, { AxiosInstance } from 'axios'; +import { MILLISECONDS_PER_SECOND } from 'time-constants'; +import { ConfigService } from '../config/config.service'; + +const HEALTH_CHECK_TIMEOUT_NAME = 'health_check'; + +@Injectable() +export class ProviderWebhookService implements OnModuleDestroy { + private logger: Logger; + + private failedHealthChecks = 0; + + private successfulHealthChecks = 0; + + private webhook: AxiosInstance; + + public onModuleDestroy() { + try { + if (this.schedulerRegistry.doesExist('timeout', HEALTH_CHECK_TIMEOUT_NAME)) { + this.schedulerRegistry.deleteTimeout(HEALTH_CHECK_TIMEOUT_NAME); + } + } catch (e) { + this.logger.debug(`Caught error deleting timeouts: ${e}`); + } + } + + constructor( + private configService: ConfigService, + private eventEmitter: EventEmitter2, + private schedulerRegistry: SchedulerRegistry, + ) { + this.logger = new Logger(this.constructor.name); + this.webhook = axios.create({ + baseURL: this.configService.providerBaseUrl.toString(), + }); + + this.webhook.defaults.headers.common.Authorization = this.configService.providerApiToken; + } + + public get providerApi(): AxiosInstance { + return this.webhook; + } + + private async checkProviderWebhook() { + // Check webhook + try { + // eslint-disable-next-line no-await-in-loop + await this.webhook.get(`/health`); + this.successfulHealthChecks += 1; + this.failedHealthChecks = 0; + } catch (e: any) { + // Reset healthCheckSuccesses to 0 on failure. We will not go out of waiting for recovery until there + // are a number of sequential healthy responses equaling healthCheckSuccessesThreshold. + this.successfulHealthChecks = 0; + this.failedHealthChecks += 1; + } + + if (this.failedHealthChecks > 0) { + if (this.failedHealthChecks >= this.configService.getHealthCheckMaxRetries()) { + this.logger.error(`FATAL ERROR: Failed to connect to provider webhook at '${this.configService.providerBaseUrl}' after ${this.failedHealthChecks} attempts.`); + this.eventEmitter.emit('shutdown'); + return; + } + this.logger.warn(`Provider webhook failed health check ${this.failedHealthChecks} times`); + this.schedulerRegistry.deleteTimeout(HEALTH_CHECK_TIMEOUT_NAME); + this.schedulerRegistry.addTimeout( + HEALTH_CHECK_TIMEOUT_NAME, + setTimeout( + () => this.checkProviderWebhook(), + Math.min(2 ** (this.failedHealthChecks - 1) * MILLISECONDS_PER_SECOND, this.configService.getHealthCheckMaxRetryIntervalSeconds() * MILLISECONDS_PER_SECOND), + ), + ); + } else if (this.successfulHealthChecks > 0) { + if (this.successfulHealthChecks >= this.configService.getHealthCheckSuccessThreshold()) { + this.logger.log(`Provider webhook responded to ${this.successfulHealthChecks} health checks; resuming queue`); + this.eventEmitter.emit('webhook.healthy'); + } else { + this.logger.debug(`Provider webhook responded to health check (attempts: ${this.successfulHealthChecks})`); + this.schedulerRegistry.deleteTimeout(HEALTH_CHECK_TIMEOUT_NAME); + this.schedulerRegistry.addTimeout( + HEALTH_CHECK_TIMEOUT_NAME, + setTimeout(() => this.checkProviderWebhook(), this.configService.getWebhookRetryIntervalSeconds()), + ); + } + } + } + + @OnEvent('webhook.unhealthy') + private startWebhookHealthCheck() { + this.logger.debug('Received webhook.gone event; pausing queue and starting provider webhook health check'); + this.failedHealthChecks = 0; + this.successfulHealthChecks = 0; + this.schedulerRegistry.addTimeout( + HEALTH_CHECK_TIMEOUT_NAME, + setTimeout(() => this.checkProviderWebhook(), 0), + ); + } +} diff --git a/nest-cli.json b/nest-cli.json index b7cbf061..c884552b 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -27,6 +27,16 @@ "compilerOptions": { "tsConfigPath": "apps/api/tsconfig.app.json" } + }, + "worker": { + "type": "application", + "root": "apps/worker", + "entryFile": "main", + "sourceRoot": "apps/worker/src", + "compilerOptions": { + "tsConfigPath": "apps/worker/tsconfig.app.json" + + } } } } \ No newline at end of file From c62ee7f1e43549154c28add298d441dc5fc9668e Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 22 Dec 2023 20:34:51 +0530 Subject: [PATCH 10/53] base work for debouncer and some refactoring (#23) * base work for debouncer * refactor common services --- apps/worker/src/worker.module.ts | 2 +- libs/common/src/index.ts | 5 ++- libs/common/src/services/async_debouncer.ts | 37 +++++++++++++++++++ .../blockchain-scanner.service.ts | 2 +- .../src/{utils => services}/nonce.service.ts | 2 +- .../provider-webhook.service.ts | 0 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 libs/common/src/services/async_debouncer.ts rename libs/common/src/{blockchain => services}/blockchain-scanner.service.ts (98%) rename libs/common/src/{utils => services}/nonce.service.ts (97%) rename libs/common/src/{utils => services}/provider-webhook.service.ts (100%) diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index b01e0897..17d37a83 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -13,7 +13,7 @@ import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.p import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; import { ProviderWebhookService, QueueConstants } from '../../../libs/common/src'; -import { BlockchainScannerService } from '../../../libs/common/src/blockchain/blockchain-scanner.service'; +import { BlockchainScannerService } from '../../../libs/common/src/services/blockchain-scanner.service'; @Module({ imports: [ diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 7c067463..93b56751 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -14,6 +14,7 @@ export * from './dtos/dsnp.graph.edge.dto'; export * from './dtos/graph.change.request.reference'; export * from './dtos/graph.update.job'; export * from './dtos/graph-update-job.interface'; -export * from './utils/nonce.service'; +export * from './services/nonce.service'; export * from './utils/queues'; -export * from './utils/provider-webhook.service'; +export * from './services/provider-webhook.service'; +export * from './services/async_debouncer'; diff --git a/libs/common/src/services/async_debouncer.ts b/libs/common/src/services/async_debouncer.ts new file mode 100644 index 00000000..ed68452b --- /dev/null +++ b/libs/common/src/services/async_debouncer.ts @@ -0,0 +1,37 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import Redis from 'ioredis'; + +@Injectable() +export class AsyncDebouncerService { + private readonly logger: Logger; + + constructor(@InjectRedis() private redis: Redis) { + this.logger = new Logger(this.constructor.name); + } + + async debounceAsyncOperation(key: string, asyncOperation: () => Promise, debounceTime: number): Promise { + const cacheKey = this.getCacheKey(key); + + const cachedFuture = await this.redis.get(cacheKey); + if (cachedFuture) { + this.logger.debug(`Async operation for key ${key} is already inflight`); + return JSON.parse(cachedFuture); + } + + const promise = asyncOperation(); + + await this.redis.setex(cacheKey, debounceTime, JSON.stringify(promise)); + + promise.finally(() => { + this.redis.del(cacheKey); + }); + + return promise; + } + + private getCacheKey(key: string): string { + this.logger.debug(`Async operation for key ${key} is not inflight`); + return `inflight-future:${key}`; + } +} diff --git a/libs/common/src/blockchain/blockchain-scanner.service.ts b/libs/common/src/services/blockchain-scanner.service.ts similarity index 98% rename from libs/common/src/blockchain/blockchain-scanner.service.ts rename to libs/common/src/services/blockchain-scanner.service.ts index bce9ea54..9a720cb4 100644 --- a/libs/common/src/blockchain/blockchain-scanner.service.ts +++ b/libs/common/src/services/blockchain-scanner.service.ts @@ -7,7 +7,7 @@ import { MILLISECONDS_PER_SECOND, SECONDS_PER_MINUTE } from 'time-constants'; import { InjectRedis } from '@liaoliaots/nestjs-redis'; import Redis from 'ioredis'; import { ConfigService } from '../config/config.service'; -import { BlockchainService } from './blockchain.service'; +import { BlockchainService } from '../blockchain/blockchain.service'; import { QueueConstants } from '../utils/queues'; import { UpdateTransitiveGraphs, createReconnectionJob } from '../dtos/graph-update-job.interface'; diff --git a/libs/common/src/utils/nonce.service.ts b/libs/common/src/services/nonce.service.ts similarity index 97% rename from libs/common/src/utils/nonce.service.ts rename to libs/common/src/services/nonce.service.ts index e22879d9..22e50d5b 100644 --- a/libs/common/src/utils/nonce.service.ts +++ b/libs/common/src/services/nonce.service.ts @@ -3,7 +3,7 @@ import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common'; import Redis from 'ioredis'; import fs from 'fs'; import { createKeys } from '../blockchain/create-keys'; -import { RedisUtils } from './redis'; +import { RedisUtils } from '../utils/redis'; import { BlockchainService } from '../blockchain/blockchain.service'; import { ConfigService } from '../config/config.service'; diff --git a/libs/common/src/utils/provider-webhook.service.ts b/libs/common/src/services/provider-webhook.service.ts similarity index 100% rename from libs/common/src/utils/provider-webhook.service.ts rename to libs/common/src/services/provider-webhook.service.ts From c8af89a5cad6a3f227adae7558e583239b527e78 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Tue, 26 Dec 2023 21:15:54 +0530 Subject: [PATCH 11/53] Add in redis list of endpoints watching for dsnp graph change (#24) * Add in redis list of endpoints watching for dsnp graph change * give a descriptive name for clarity --- apps/api/src/api.controller.ts | 4 +-- apps/api/src/api.service.ts | 30 +++++++++++++++++-- .../graph.monitor.processor.service.ts | 7 +++++ libs/common/src/utils/queues.ts | 5 ++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/apps/api/src/api.controller.ts b/apps/api/src/api.controller.ts index 7d0661e8..949e5045 100644 --- a/apps/api/src/api.controller.ts +++ b/apps/api/src/api.controller.ts @@ -72,8 +72,8 @@ export class ApiController { @ApiBody({ type: WatchGraphsDto }) async watchGraphs(@Body() watchGraphsDto: WatchGraphsDto) { try { - // TODO: Uncomment this line once the ApiService is implemented - // const result = await this.apiService.watchGraphs(watchGraphsDto); + // eslint-disable-next-line no-await-in-loop + await this.apiService.watchGraphs(watchGraphsDto); return { status: HttpStatus.OK, data: 'Successfully started watching graphs', diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index a009f783..480d23aa 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -1,13 +1,13 @@ -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable, Logger, OnApplicationShutdown } from '@nestjs/common'; import { InjectRedis } from '@liaoliaots/nestjs-redis'; import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { createHash } from 'crypto'; -import { GraphChangeRepsonseDto, ProviderGraphDto, QueueConstants } from '../../../libs/common/src'; +import { GraphChangeRepsonseDto, ProviderGraphDto, QueueConstants, WatchGraphsDto } from '../../../libs/common/src'; @Injectable() -export class ApiService { +export class ApiService implements OnApplicationShutdown { private readonly logger: Logger; constructor( @@ -17,6 +17,12 @@ export class ApiService { this.logger = new Logger(this.constructor.name); } + onApplicationShutdown(signal?: string | undefined) { + this.cleanupOnShutdown().then(() => { + this.logger.log('Cleanup on shutdown completed.'); + }); + } + async enqueueRequest(request: ProviderGraphDto): Promise { const data = { ...request, @@ -29,9 +35,27 @@ export class ApiService { }; } + async watchGraphs(watchGraphsDto: WatchGraphsDto): Promise { + watchGraphsDto.dsnpIds.forEach(async (dsnpId) => { + const redisKey = `${QueueConstants.REDIS_WATCHER_PREFIX}:${dsnpId}`; + const redisValue = watchGraphsDto.webhookEndpoint; + // eslint-disable-next-line no-await-in-loop + await this.redis.rpush(redisKey, redisValue); + }); + } + // eslint-disable-next-line class-methods-use-this private calculateJobId(jobWithoutId: ProviderGraphDto): string { const stringVal = JSON.stringify(jobWithoutId); return createHash('sha1').update(stringVal).digest('base64url'); } + + private async cleanupOnShutdown(): Promise { + const keys = await this.redis.keys(`${QueueConstants.REDIS_WATCHER_PREFIX}:*`); + + if (keys.length > 0) { + await this.redis.del(keys); + this.logger.log(`Removed keys on shutdown: ${keys.join(', ')}`); + } + } } diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 666d5e41..289d98e6 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -28,4 +28,11 @@ export class GraphNotifierService extends BaseConsumer { throw e; } } + + async getWebhookList(dsnpId: string): Promise { + const redisKey = `${QueueConstants.REDIS_WATCHER_PREFIX}:${dsnpId}`; + const redisList = await this.cacheManager.lrange(redisKey, 0, -1); + + return redisList || []; + } } diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index e5399066..c29913f5 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -18,4 +18,9 @@ export namespace QueueConstants { * Name of the queue that processes graph change notifications */ export const GRAPH_CHANGE_NOTIFY_QUEUE = 'graphChangeNotify'; + + /** + * Prefix for Redis keys that store webhook endpoints + */ + export const REDIS_WATCHER_PREFIX = 'graph-service-watcher'; } From 0e4c29509872f2828e01f17285ed5406080a4e96 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Thu, 28 Dec 2023 21:33:38 +0530 Subject: [PATCH 12/53] reconnection service: process and queue graph update request job (#25) * reconnection service: process and queue graph update request job * update semanrtic around provider graph requerst/swagger --- apps/api/src/api.service.ts | 12 +- apps/api/src/metadata.ts | 2 +- .../graph.reconnection.processor.module.ts | 2 + .../graph.reconnection.processor.service.ts | 109 +++++++++++++++++- libs/common/src/dtos/graph.change.request.ts | 7 ++ libs/common/src/dtos/provider.graph.dto.ts | 3 - libs/common/src/index.ts | 3 +- swagger.yaml | 3 - 8 files changed, 123 insertions(+), 18 deletions(-) create mode 100644 libs/common/src/dtos/graph.change.request.ts diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 480d23aa..96aa5ef2 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -4,7 +4,7 @@ import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { createHash } from 'crypto'; -import { GraphChangeRepsonseDto, ProviderGraphDto, QueueConstants, WatchGraphsDto } from '../../../libs/common/src'; +import { GraphChangeRepsonseDto, ProviderGraphDto, ProviderGraphJob, QueueConstants, WatchGraphsDto } from '../../../libs/common/src'; @Injectable() export class ApiService implements OnApplicationShutdown { @@ -24,14 +24,14 @@ export class ApiService implements OnApplicationShutdown { } async enqueueRequest(request: ProviderGraphDto): Promise { - const data = { - ...request, - id: this.calculateJobId(request), + const data: ProviderGraphJob = { + providerGraphDto: request, + referenceId: this.calculateJobId(request), }; - const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.id}`, data, { jobId: data.id, removeOnFail: false, removeOnComplete: 2000 }); // TODO: should come from queue configs + const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId, removeOnFail: false, removeOnComplete: 2000 }); // TODO: should come from queue configs this.logger.debug(job); return { - referenceId: data.id, + referenceId: data.referenceId, }; } diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index 86e7384f..2d41daca 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -11,5 +11,5 @@ export default async () => { ["../../../libs/common/src/dtos/user.graph.dto"]: await import("../../../libs/common/src/dtos/user.graph.dto"), ["../../../libs/common/src/dtos/graph.change.request.reference"]: await import("../../../libs/common/src/dtos/graph.change.request.reference") }; - return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdge: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp.graph.edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, blockNumber: { required: false, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { id: { required: true, type: () => String }, dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph.change.request.reference"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; + return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdge: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp.graph.edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, blockNumber: { required: false, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph.change.request.reference"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; }; \ No newline at end of file diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts index 7adfaf50..daab2d75 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts @@ -5,6 +5,7 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { EventEmitterModule } from '@nestjs/event-emitter'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; import { QueueConstants } from '../../../../libs/common/src'; @@ -13,6 +14,7 @@ import { GraphReconnectionService } from './graph.reconnection.processor.service @Module({ imports: [ ConfigModule, + EventEmitterModule, RedisModule.forRootAsync( { imports: [ConfigModule], diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index 16dc803b..1f61140a 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -3,9 +3,11 @@ import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; -import { OnEvent } from '@nestjs/event-emitter'; +import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; +import { MessageSourceId, ProviderId } from '@frequency-chain/api-augment/interfaces'; +import { AxiosError, AxiosResponse } from 'axios'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { IGraphUpdateJob, ProviderWebhookService, QueueConstants } from '../../../../libs/common/src'; +import { ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphDto, ProviderGraphJob, ProviderWebhookService, QueueConstants } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; @Injectable() @@ -18,6 +20,7 @@ export class GraphReconnectionService extends BaseConsumer { @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectRequestQueue: Queue, private configService: ConfigService, private providerWebhookService: ProviderWebhookService, + private emitter: EventEmitter2, ) { super(); } @@ -25,14 +28,112 @@ export class GraphReconnectionService extends BaseConsumer { async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { - // TODO: add logic to process reconnection job and queue to request processor - this.logger.debug(job.asJSON()); + let graphConnections: ConnectionDto[] = []; + let graphKeyPairs: GraphKeyPairDto[] = []; + try { + [graphConnections, graphKeyPairs] = await this.getUserGraphFromProvider(job.data.dsnpId, job.data.providerId); + if (graphConnections.length === 0) { + this.logger.debug(`No connections found for user ${job.data.dsnpId.toString()} from provider ${job.data.providerId.toString()}`); + return; + } + const providerGraphJob: ProviderGraphJob = { + referenceId: job.id ?? '', + providerGraphDto: { + dsnpId: job.data.dsnpId.toString(), + connections: { data: graphConnections }, + graphKeyPairs, + }, + }; + this.reconnectRequestQueue.add(QueueConstants.RECONNECT_REQUEST_QUEUE, providerGraphJob); + this.logger.debug(`Found ${graphConnections.length} connections for user ${job.data.dsnpId.toString()} from provider ${job.data.providerId.toString()}`); + } catch (e) { + this.logger.error(`Error getting user graph from provider: ${e}`); + throw e; + } } catch (e) { this.logger.error(e); throw e; } } + async getUserGraphFromProvider(dsnpUserId: MessageSourceId | string, providerId: ProviderId | string): Promise { + const providerAPI = this.providerWebhookService.providerApi; + const pageSize = this.configService.getPageSize(); + const params = { + pageNumber: 1, + pageSize, + }; + + const allConnections: ConnectionDto[] = []; + const keyPairs: GraphKeyPairDto[] = []; + + let hasNextPage = true; + let webhookFailures: number = 0; + + while (hasNextPage) { + this.logger.debug(`Fetching connections page ${params.pageNumber} for user ${dsnpUserId.toString()} from provider ${providerId.toString()}`); + + let response: AxiosResponse; + try { + // eslint-disable-next-line no-await-in-loop + response = await providerAPI.get(`/connections/${dsnpUserId.toString()}`, { params }); + + // Reset webhook failures to 0 on a success. We don't go into waiting for recovery unless + // a sequential number failures occur equaling webhookFailureThreshold. + webhookFailures = 0; + + if (!response.data || !response.data.connections) { + throw new Error(`Bad response from provider webhook: ${response}`); + } + + if (response.data.dsnpId !== dsnpUserId.toString()) { + throw new Error(`Provider webhook returned data for the wrong user: ${response.data.dsnpId}`); + } + + const { data }: { data: ConnectionDto[] } = response.data.connections; + allConnections.push(...data); + const { graphKeyPairs }: { graphKeyPairs: GraphKeyPairDto[] } = response.data; + if (graphKeyPairs) { + keyPairs.push(...graphKeyPairs); + } + + const { pagination } = response.data.connections; + if (pagination && pagination.pageCount && pagination.pageCount > params.pageNumber) { + // Increment the page number to fetch the next page + params.pageNumber += 1; + } else { + // No more pages available, exit the loop + hasNextPage = false; + } + } catch (error: any) { + let newError = error; + if (error instanceof AxiosError) { + webhookFailures += 1; + if (error.response) { + newError = new Error(`Provider webhook returned error: ${error.response.status} ${error.response.statusText}`); + } else if (error.request) { + newError = new Error(`Provider webhook request failed: ${error.request}`); + } else { + newError = new Error(`Provider webhook error: ${error.message}`); + } + + if (webhookFailures >= this.configService.getWebhookFailureThreshold()) { + // eslint-disable-next-line no-await-in-loop + await this.emitter.emitAsync('webhook.unhealthy'); + } else { + // eslint-disable-next-line no-await-in-loop + await new Promise((r) => { + setTimeout(r, this.configService.getWebhookRetryIntervalSeconds()); + }); + } + } + throw newError; + } + } + + return [allConnections, keyPairs]; + } + @OnEvent('webhook.unhealthy', { async: true, promisify: true }) private async handleWebhookGone() { this.logger.debug('Received webhook.unhealthy event, pausing reconnection queue'); diff --git a/libs/common/src/dtos/graph.change.request.ts b/libs/common/src/dtos/graph.change.request.ts new file mode 100644 index 00000000..9af6c40d --- /dev/null +++ b/libs/common/src/dtos/graph.change.request.ts @@ -0,0 +1,7 @@ +import { ProviderGraphDto } from './provider.graph.dto'; + +export class ProviderGraphJob { + referenceId: string; + + providerGraphDto: ProviderGraphDto; +} diff --git a/libs/common/src/dtos/provider.graph.dto.ts b/libs/common/src/dtos/provider.graph.dto.ts index e7a308c2..799cbc77 100644 --- a/libs/common/src/dtos/provider.graph.dto.ts +++ b/libs/common/src/dtos/provider.graph.dto.ts @@ -5,9 +5,6 @@ import { GraphKeyPairDto } from './graph.key.pair.dto'; import { ConnectionDto } from './connections.dto'; export class ProviderGraphDto { - @IsNotEmpty() - id: string; - @IsNotEmpty() @IsString() dsnpId: string; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 93b56751..7e665c9c 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -1,7 +1,6 @@ export * from './utils/processing'; export * from './utils/redis'; export * from './utils/base-consumer'; -export * from './constants'; export * from './dtos/user.graph.dto'; export * from './dtos/graph.query.dto'; export * from './dtos/provider.graph.dto'; @@ -14,7 +13,9 @@ export * from './dtos/dsnp.graph.edge.dto'; export * from './dtos/graph.change.request.reference'; export * from './dtos/graph.update.job'; export * from './dtos/graph-update-job.interface'; +export * from './dtos/graph.change.request'; export * from './services/nonce.service'; export * from './utils/queues'; export * from './services/provider-webhook.service'; export * from './services/async_debouncer'; +export * from './constants'; diff --git a/swagger.yaml b/swagger.yaml index 7f8393dc..d5a3b77b 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -156,8 +156,6 @@ components: ProviderGraphDto: type: object properties: - id: - type: string dsnpId: type: string connections: @@ -173,7 +171,6 @@ components: items: $ref: '#/components/schemas/GraphKeyPairDto' required: - - id - dsnpId - connections GraphChangeRepsonseDto: From 634948f44e8a8f8b4f75553831908f656676d7ff Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Tue, 2 Jan 2024 21:16:20 +0530 Subject: [PATCH 13/53] add graph state manager to be used by request processor (#27) --- .../request.processor.module.ts | 4 +- .../request.processor.service.ts | 3 +- apps/worker/src/worker.module.ts | 4 +- libs/common/src/index.ts | 1 + .../src/services/graph-state-manager.ts | 181 ++++++++++++++++++ 5 files changed, 188 insertions(+), 5 deletions(-) create mode 100644 libs/common/src/services/graph-state-manager.ts diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts index 46e58a82..14540eac 100644 --- a/apps/worker/src/request_processor/request.processor.module.ts +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -7,7 +7,7 @@ import { Module } from '@nestjs/common'; import { RedisModule } from '@liaoliaots/nestjs-redis'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants } from '../../../../libs/common/src'; +import { QueueConstants, GraphStateManager } from '../../../../libs/common/src'; import { RequestProcessorService } from './request.processor.service'; @Module({ @@ -50,7 +50,7 @@ import { RequestProcessorService } from './request.processor.service'; name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, }), ], - providers: [RequestProcessorService], + providers: [RequestProcessorService, GraphStateManager], exports: [BullModule, RequestProcessorService], }) export class RequestProcessorModule {} diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index c7b20afa..a2234c7b 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -4,7 +4,7 @@ import { Injectable } from '@nestjs/common'; import { Job } from 'bullmq'; import Redis from 'ioredis'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { ProviderGraphDto, QueueConstants } from '../../../../libs/common/src'; +import { GraphStateManager, ProviderGraphDto, QueueConstants } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; @Injectable() @@ -13,6 +13,7 @@ export class RequestProcessorService extends BaseConsumer { constructor( @InjectRedis() private cacheManager: Redis, private configService: ConfigService, + private graphStateManagementService: GraphStateManager, ) { super(); } diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 17d37a83..b38bd111 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -12,7 +12,7 @@ import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.pr import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; -import { ProviderWebhookService, QueueConstants } from '../../../libs/common/src'; +import { ProviderWebhookService, QueueConstants, GraphStateManager } from '../../../libs/common/src'; import { BlockchainScannerService } from '../../../libs/common/src/services/blockchain-scanner.service'; @Module({ @@ -67,6 +67,6 @@ import { BlockchainScannerService } from '../../../libs/common/src/services/bloc GraphUpdatePublisherModule, GraphNotifierModule, ], - providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService, GraphNotifierService, ProviderWebhookService, BlockchainScannerService], + providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService, GraphNotifierService, ProviderWebhookService, BlockchainScannerService, GraphStateManager], }) export class WorkerModule {} diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 7e665c9c..883dfc98 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -18,4 +18,5 @@ export * from './services/nonce.service'; export * from './utils/queues'; export * from './services/provider-webhook.service'; export * from './services/async_debouncer'; +export * from './services/graph-state-manager'; export * from './constants'; diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts new file mode 100644 index 00000000..dfeca971 --- /dev/null +++ b/libs/common/src/services/graph-state-manager.ts @@ -0,0 +1,181 @@ +import { Injectable, OnApplicationBootstrap } from '@nestjs/common'; +import { + Action, + Graph, + EnvironmentInterface, + GraphKeyPair, + GraphKeyType, + ImportBundle, + Update, + Config, + DevEnvironment, + EnvironmentType, + DsnpKeys, + DsnpPublicKey, + DsnpGraphEdge, + ConnectionType, + PrivacyType, +} from '@dsnp/graph-sdk'; +import { ConfigService } from '../config/config.service'; + +@Injectable() +export class GraphStateManager implements OnApplicationBootstrap { + private graphState: Graph; + + private environment: EnvironmentInterface; // Environment details + + private schemaIds: { [key: string]: { [key: string]: number } }; + + private graphKeySchemaId: number; + + private static graphStateFinalizer = new FinalizationRegistry((graphState: Graph) => { + if (graphState) { + graphState.freeGraphState(); + } + }); + + public onApplicationBootstrap() { + if (!this.graphState) { + throw new Error('Unable to initialize schema ids'); + } + + const publicFollow = this.graphState.getSchemaIdFromConfig(this.environment, ConnectionType.Follow, PrivacyType.Public); + const privateFollow = this.graphState.getSchemaIdFromConfig(this.environment, ConnectionType.Follow, PrivacyType.Private); + const privateFriend = this.graphState.getSchemaIdFromConfig(this.environment, ConnectionType.Friendship, PrivacyType.Private); + + this.graphKeySchemaId = this.graphState.getGraphConfig(this.environment).graphPublicKeySchemaId; + + this.schemaIds = { + [ConnectionType.Follow]: { + [PrivacyType.Public]: publicFollow, + [PrivacyType.Private]: privateFollow, + }, + [ConnectionType.Friendship]: { + [PrivacyType.Private]: privateFriend, + }, + }; + } + + constructor(configService: ConfigService) { + const environmentType = configService.getGraphEnvironmentType(); + if (environmentType === EnvironmentType.Dev.toString()) { + const configJson = configService.getGraphEnvironmentConfig(); + const config: Config = JSON.parse(configJson); + const devEnvironment: DevEnvironment = { environmentType: EnvironmentType.Dev, config }; + this.environment = devEnvironment; + } else { + this.environment = { environmentType: EnvironmentType[environmentType] }; + } + this.graphState = new Graph(this.environment); + + GraphStateManager.graphStateFinalizer.register(this, this.graphState); + } + + public getGraphState(): Graph { + if (this.graphState) { + return this.graphState; + } + return {} as Graph; + } + + public getGraphConfig(): Config { + if (this.graphState) { + return this.graphState.getGraphConfig(this.environment); + } + return {} as Config; + } + + public getSchemaIdFromConfig(connectionType: ConnectionType, privacyType: PrivacyType): number { + return this.schemaIds[connectionType][privacyType] ?? 0; + } + + public getGraphKeySchemaId(): number { + return this.graphKeySchemaId; + } + + public static generateKeyPair(keyType: GraphKeyType): GraphKeyPair { + return Graph.generateKeyPair(keyType); + } + + public static deserializeDsnpKeys(keys: DsnpKeys): DsnpPublicKey[] { + return Graph.deserializeDsnpKeys(keys); + } + + public importUserData(payload: ImportBundle[]): boolean { + if (this.graphState) { + return this.graphState.importUserData(payload); + } + return false; + } + + public applyActions(actions: Action[], ignoreExistingConnection: boolean): boolean { + if (this.graphState) { + return this.graphState.applyActions(actions, { ignoreExistingConnections: ignoreExistingConnection }); + } + return false; + } + + public exportGraphUpdates(): Update[] { + if (this.graphState) { + return this.graphState.exportUpdates(); + } + return []; + } + + public exportUserGraphUpdates(dsnpId: string): Update[] { + if (this.graphState) { + return this.graphState.exportUserGraphUpdates(dsnpId); + } + + return []; + } + + public removeUserGraph(dsnpUserId: string): boolean { + if (this.graphState) { + return this.graphState.removeUserGraph(dsnpUserId); + } + return false; + } + + public graphContainsUser(dsnpUserId: string): boolean { + if (this.graphState) { + return this.graphState.containsUserGraph(dsnpUserId); + } + return false; + } + + public getConnectionsForUserGraph(dsnpUserId: string, schemaId: number, includePending: boolean): DsnpGraphEdge[] { + if (this.graphState) { + return this.graphState.getConnectionsForUserGraph(dsnpUserId, schemaId, includePending); + } + return []; + } + + public getConnectionWithoutKeys(): string[] { + if (this.graphState) { + return this.graphState.getConnectionsWithoutKeys(); + } + return []; + } + + public getOneSidedPrivateFriendshipConnections(dsnpUserId: string): DsnpGraphEdge[] { + if (this.graphState) { + return this.graphState.getOneSidedPrivateFriendshipConnections(dsnpUserId); + } + return []; + } + + public getPublicKeys(dsnpUserId: string): DsnpPublicKey[] { + if (this.graphState) { + return this.graphState.getPublicKeys(dsnpUserId); + } + return []; + } + + public forceCalculateGraphs(dsnpUserId: string): Update[] { + if (this.graphState) { + return this.graphState.forceCalculateGraphs(dsnpUserId); + } + return []; + } +} From ca0390d4357fde4d48ecb4c438a32e5fc649e583 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:26:29 -0600 Subject: [PATCH 14/53] Process graph change request to exported bundles (#28) --- apps/api/src/api.service.ts | 12 +- .../graph.reconnection.processor.module.ts | 11 +- .../graph.reconnection.processor.service.ts | 22 +- .../request.processor.module.ts | 16 +- .../request.processor.service.ts | 276 +++++++++++++++++- libs/common/src/dtos/graph.change.request.ts | 7 - libs/common/src/index.ts | 4 +- .../graph-update-job.interface.ts | 0 .../provider.graph.update-job.interface.ts | 16 + .../services/blockchain-scanner.service.ts | 2 +- 10 files changed, 328 insertions(+), 38 deletions(-) delete mode 100644 libs/common/src/dtos/graph.change.request.ts rename libs/common/src/{dtos => interfaces}/graph-update-job.interface.ts (100%) create mode 100644 libs/common/src/interfaces/provider.graph.update-job.interface.ts diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 96aa5ef2..4723ca3e 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -4,7 +4,8 @@ import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { createHash } from 'crypto'; -import { GraphChangeRepsonseDto, ProviderGraphDto, ProviderGraphJob, QueueConstants, WatchGraphsDto } from '../../../libs/common/src'; +import { GraphChangeRepsonseDto, ProviderGraphDto, ProviderGraphUpdateJob, QueueConstants, WatchGraphsDto } from '../../../libs/common/src'; +import { ConfigService } from '../../../libs/common/src/config/config.service'; @Injectable() export class ApiService implements OnApplicationShutdown { @@ -13,6 +14,7 @@ export class ApiService implements OnApplicationShutdown { constructor( @InjectRedis() private redis: Redis, @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private graphChangeRequestQueue: Queue, + private configService: ConfigService, ) { this.logger = new Logger(this.constructor.name); } @@ -24,9 +26,13 @@ export class ApiService implements OnApplicationShutdown { } async enqueueRequest(request: ProviderGraphDto): Promise { - const data: ProviderGraphJob = { - providerGraphDto: request, + const providerId = this.configService.getProviderId(); + const data: ProviderGraphUpdateJob = { + dsnpId: request.dsnpId, + providerId, + connections: request.connections.data, referenceId: this.calculateJobId(request), + updateConnection: this.configService.getReconnectionServiceRequired(), }; const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId, removeOnFail: false, removeOnComplete: 2000 }); // TODO: should come from queue configs this.logger.debug(job); diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts index daab2d75..3abf964b 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts @@ -48,9 +48,14 @@ import { GraphReconnectionService } from './graph.reconnection.processor.service }, inject: [ConfigService], }), - BullModule.registerQueue({ - name: QueueConstants.RECONNECT_REQUEST_QUEUE, - }), + BullModule.registerQueue( + { + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }, + ), ], providers: [GraphReconnectionService], exports: [BullModule, GraphReconnectionService], diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index 1f61140a..8147d5ad 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -7,17 +7,16 @@ import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; import { MessageSourceId, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { AxiosError, AxiosResponse } from 'axios'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphDto, ProviderGraphJob, ProviderWebhookService, QueueConstants } from '../../../../libs/common/src'; +import { ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphUpdateJob, ProviderWebhookService, QueueConstants } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; @Injectable() @Processor(QueueConstants.RECONNECT_REQUEST_QUEUE) export class GraphReconnectionService extends BaseConsumer { - private webhookOk = true; - constructor( @InjectRedis() private cacheManager: Redis, @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectRequestQueue: Queue, + @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private graphChangeRequestQueuue: Queue, private configService: ConfigService, private providerWebhookService: ProviderWebhookService, private emitter: EventEmitter2, @@ -36,15 +35,18 @@ export class GraphReconnectionService extends BaseConsumer { this.logger.debug(`No connections found for user ${job.data.dsnpId.toString()} from provider ${job.data.providerId.toString()}`); return; } - const providerGraphJob: ProviderGraphJob = { + const providerGraphJob: ProviderGraphUpdateJob = { referenceId: job.id ?? '', - providerGraphDto: { - dsnpId: job.data.dsnpId.toString(), - connections: { data: graphConnections }, - graphKeyPairs, - }, + dsnpId: job.data.dsnpId, + providerId: job.data.providerId, + connections: graphConnections, + graphKeyPairs, + updateConnection: false, }; - this.reconnectRequestQueue.add(QueueConstants.RECONNECT_REQUEST_QUEUE, providerGraphJob); + this.graphChangeRequestQueuue.add(`Provider Graph Job - ${providerGraphJob.referenceId}`, providerGraphJob, { + removeOnFail: false, + removeOnComplete: 2000, + }); this.logger.debug(`Found ${graphConnections.length} connections for user ${job.data.dsnpId.toString()} from provider ${job.data.providerId.toString()}`); } catch (e) { this.logger.error(`Error getting user graph from provider: ${e}`); diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts index 14540eac..0f26505a 100644 --- a/apps/worker/src/request_processor/request.processor.module.ts +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -9,10 +9,12 @@ import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; import { QueueConstants, GraphStateManager } from '../../../../libs/common/src'; import { RequestProcessorService } from './request.processor.service'; +import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; @Module({ imports: [ ConfigModule, + BlockchainModule, RedisModule.forRootAsync( { imports: [ConfigModule], @@ -46,9 +48,17 @@ import { RequestProcessorService } from './request.processor.service'; }, inject: [ConfigService], }), - BullModule.registerQueue({ - name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, - }), + BullModule.registerQueue( + { + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + }, + { + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + }, + ), ], providers: [RequestProcessorService, GraphStateManager], exports: [BullModule, RequestProcessorService], diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index a2234c7b..f3d21d65 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -1,31 +1,289 @@ import { InjectRedis } from '@liaoliaots/nestjs-redis'; -import { Processor } from '@nestjs/bullmq'; +import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; -import { Job } from 'bullmq'; +import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { GraphStateManager, ProviderGraphDto, QueueConstants } from '../../../../libs/common/src'; +import { ImportBundle, ConnectionType, GraphKeyPair, GraphKeyType, ImportBundleBuilder, ConnectAction, DsnpKeys, KeyData } from '@dsnp/graph-sdk'; +import { MessageSourceId, PaginatedStorageResponse, SchemaGrantResponse, ItemizedStoragePageResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; +import { Option, Vec } from '@polkadot/types'; +import { AnyNumber } from '@polkadot/types/types'; +import { hexToU8a } from '@polkadot/util'; import { BaseConsumer } from '../BaseConsumer'; +import { + ConnectionDto, + GraphKeyPairDto, + GraphStateManager, + GraphUpdateJob, + KeyType, + PrivacyType, + ProviderGraphUpdateJob, + QueueConstants, + SkipTransitiveGraphs, + createReconnectionJob, +} from '../../../../libs/common/src'; +import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; +import { Direction } from '../../../../libs/common/src/dtos/direction.dto'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) export class RequestProcessorService extends BaseConsumer { constructor( @InjectRedis() private cacheManager: Redis, - private configService: ConfigService, - private graphStateManagementService: GraphStateManager, + @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectionQueue: Queue, + @InjectQueue(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) private graphChangePublisherQueue: Queue, + private graphStateManager: GraphStateManager, + private blockchainService: BlockchainService, ) { super(); } - async process(job: Job): Promise { + async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { - // TODO: add logic to process graph change requests - this.logger.debug(job.asJSON()); + const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.dsnpId); + const providerId: ProviderId = this.blockchainService.api.registry.createType('ProviderId', job.data.providerId); + await this.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + // using graphConnections form Action[] and update the user's DSNP Graph + const actions: ConnectAction[] = await this.formConnections(dsnpUserId, providerId, job.data.updateConnection, job.data.connections); + try { + if (actions.length === 0) { + this.logger.debug(`No actions to apply for user ${dsnpUserId.toString()}`); + } + this.graphStateManager.applyActions(actions, true); + } catch (e: any) { + const errMessage = e instanceof Error ? e.message : ''; + if (errMessage.includes('already exists')) { + this.logger.warn(`Error applying actions: ${e}`); + } else { + throw new Error(`Error applying actions: ${e}`); + } + const exportedUpdates = this.graphStateManager.exportUserGraphUpdates(dsnpUserId.toString()); + // create a GraphUpdateJob for each exported update + const graphPublisherJobs: GraphUpdateJob[] = exportedUpdates.map((update) => ({ + referenceId: job.data.referenceId, + update, + })); + // add each GraphUpdateJob to the graph publisher queue + graphPublisherJobs.forEach((graphPublisherJob) => { + this.graphChangePublisherQueue.add(`Graph Publisher Job - ${graphPublisherJob.referenceId}`, graphPublisherJob, { + removeOnFail: false, + removeOnComplete: 2000, + }); + }); + + const reImported = await this.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + if (reImported) { + // eslint-disable-next-line no-await-in-loop + const userGraphExists = this.graphStateManager.graphContainsUser(dsnpUserId.toString()); + if (!userGraphExists) { + throw new Error(`User graph does not exist for ${dsnpUserId.toString()}`); + } + } else { + throw new Error(`Error re-importing bundles for ${dsnpUserId.toString()}`); + } + + /// TODO send DSNPGraphEdge[] to debounced queue + } } catch (e) { this.logger.error(e); throw e; } } + + async importBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { + const importBundles = await this.formImportBundles(dsnpUserId, graphKeyPairs); + return this.graphStateManager.importUserData(importBundles); + } + + async formImportBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { + const publicFollowSchemaId = this.graphStateManager.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Public); + const privateFollowSchemaId = this.graphStateManager.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Private); + const privateFriendshipSchemaId = this.graphStateManager.getSchemaIdFromConfig(ConnectionType.Friendship, PrivacyType.Private); + + const publicFollows: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, publicFollowSchemaId); + const privateFollows: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, privateFollowSchemaId); + const privateFriendships: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, privateFriendshipSchemaId); + const dsnpKeys = await this.formDsnpKeys(dsnpUserId); + const graphKeyPairsSdk = graphKeyPairs.map( + (keyPair: GraphKeyPairDto): GraphKeyPair => ({ + keyType: GraphKeyType.X25519, + publicKey: hexToU8a(keyPair.publicKey), + secretKey: hexToU8a(keyPair.privateKey), + }), + ); + const importBundleBuilder = new ImportBundleBuilder(); + // Only X25519 is supported for now + // check if all keys are of type X25519 + const areKeysCorrectType = graphKeyPairs.every((keyPair) => keyPair.keyType === KeyType.X25519); + if (!areKeysCorrectType) { + throw new Error('Only X25519 keys are supported for now'); + } + + let importBundles: ImportBundle[]; + + // If no pages to import, import at least one empty page so that user graph will be created + if (publicFollows.length + privateFollows.length + privateFriendships.length === 0 && (graphKeyPairs.length > 0 || dsnpKeys?.keys.length > 0)) { + let builder = importBundleBuilder.withDsnpUserId(dsnpUserId.toString()).withSchemaId(privateFollowSchemaId); + + if (dsnpKeys?.keys?.length > 0) { + builder = builder.withDsnpKeys(dsnpKeys); + } + if (graphKeyPairs?.length > 0) { + builder = builder.withGraphKeyPairs(graphKeyPairsSdk); + } + + importBundles = [builder.build()]; + } else { + importBundles = [publicFollows, privateFollows, privateFriendships].flatMap((pageResponses: PaginatedStorageResponse[]) => + pageResponses.map((pageResponse) => { + let builder = importBundleBuilder + .withDsnpUserId(pageResponse.msa_id.toString()) + .withSchemaId(pageResponse.schema_id.toNumber()) + .withPageData(pageResponse.page_id.toNumber(), pageResponse.payload, pageResponse.content_hash.toNumber()); + + if (dsnpKeys?.keys?.length > 0) { + builder = builder.withDsnpKeys(dsnpKeys); + } + if (graphKeyPairs?.length > 0) { + builder = builder.withGraphKeyPairs(graphKeyPairsSdk); + } + + return builder.build(); + }), + ); + } + + return importBundles; + } + + private async importConnectionKeys(graphConnections: ConnectionDto[]): Promise { + const keyPromises = graphConnections + .filter( + ({ direction, privacyType, connectionType }) => + [Direction.ConnectionTo, Direction.Bidirectional].some((dir) => dir === direction) && privacyType === PrivacyType.Private && connectionType === ConnectionType.Friendship, + ) + .map(({ dsnpId }) => this.formDsnpKeys(dsnpId)); + const keys = await Promise.all(keyPromises); + + const bundles = keys.map((dsnpKeys) => new ImportBundleBuilder().withDsnpUserId(dsnpKeys.dsnpUserId).withDsnpKeys(dsnpKeys).build()); + + this.graphStateManager.importUserData(bundles); + } + + async formConnections( + dsnpUserId: MessageSourceId | AnyNumber, + providerId: MessageSourceId | AnyNumber, + isTransitive: boolean, + graphConnections: ConnectionDto[], + ): Promise { + const dsnpKeys: DsnpKeys = await this.formDsnpKeys(dsnpUserId); + const actions: ConnectAction[] = []; + // this.logger.debug(`Graph connections for user ${dsnpUserId.toString()}: ${JSON.stringify(graphConnections)}`); + // Import DSNP public graph keys for connected users in private friendship connections + await this.importConnectionKeys(graphConnections); + await Promise.all( + graphConnections.map(async (connection): Promise => { + const connectionType = connection.connectionType.toLowerCase(); + const privacyType = connection.privacyType.toLowerCase(); + const schemaId = this.graphStateManager.getSchemaIdFromConfig(connectionType as ConnectionType, privacyType as PrivacyType); + /// make sure user has delegation for schemaId + let delegations: Option> = await this.blockchainService.rpc('msa', 'grantedSchemaIdsByMsaId', dsnpUserId, providerId); + let isDelegated = false; + if (delegations.isSome) { + isDelegated = + delegations + .unwrap() + .toArray() + .findIndex((grant) => grant.schema_id.toNumber() === schemaId) !== -1; + } + + if (!isDelegated) { + return; + } + + /// make sure incoming user connection is also delegated for queuing updates non-transitively + let isDelegatedConnection = false; + if (isTransitive && (connection.direction === 'connectionFrom' || connection.direction === 'bidirectional')) { + delegations = await this.blockchainService.rpc('msa', 'grantedSchemaIdsByMsaId', connection.dsnpId, providerId); + if (delegations.isSome) { + isDelegatedConnection = + delegations + .unwrap() + .toArray() + .findIndex((grant) => grant.schema_id.toNumber() === schemaId) !== -1; + } + } + + switch (connection.direction) { + case 'connectionTo': { + const connectionAction: ConnectAction = { + type: 'Connect', + ownerDsnpUserId: dsnpUserId.toString(), + connection: { + dsnpUserId: connection.dsnpId, + schemaId, + }, + }; + + if (dsnpKeys?.keys?.length > 0) { + connectionAction.dsnpKeys = dsnpKeys; + } + + actions.push(connectionAction); + break; + } + case 'connectionFrom': { + if (isDelegatedConnection) { + const { key: jobId, data } = createReconnectionJob(connection.dsnpId, providerId, SkipTransitiveGraphs); + this.reconnectionQueue.remove(jobId); + this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); + } + break; + } + case 'bidirectional': { + const connectionAction: ConnectAction = { + type: 'Connect', + ownerDsnpUserId: dsnpUserId.toString(), + connection: { + dsnpUserId: connection.dsnpId, + schemaId, + }, + }; + + if (dsnpKeys && dsnpKeys.keys.length > 0) { + connectionAction.dsnpKeys = dsnpKeys; + } + + actions.push(connectionAction); + + if (isDelegatedConnection) { + const { key: jobId, data } = createReconnectionJob(connection.dsnpId, providerId, SkipTransitiveGraphs); + this.reconnectionQueue.remove(jobId); + this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); + } + break; + } + default: + throw new Error(`Unrecognized connection direction: ${connection.direction}`); + } + }), + ); + + return actions; + } + + async formDsnpKeys(dsnpUserId: MessageSourceId | AnyNumber): Promise { + const publicKeySchemaId = this.graphStateManager.getGraphKeySchemaId(); + const publicKeys: ItemizedStoragePageResponse = await this.blockchainService.rpc('statefulStorage', 'getItemizedStorage', dsnpUserId, publicKeySchemaId); + const keyData: KeyData[] = publicKeys.items.toArray().map((publicKey) => ({ + index: publicKey.index.toNumber(), + content: hexToU8a(publicKey.payload.toHex()), + })); + const dsnpKeys: DsnpKeys = { + dsnpUserId: dsnpUserId.toString(), + keysHash: publicKeys.content_hash.toNumber(), + keys: keyData, + }; + return dsnpKeys; + } } diff --git a/libs/common/src/dtos/graph.change.request.ts b/libs/common/src/dtos/graph.change.request.ts deleted file mode 100644 index 9af6c40d..00000000 --- a/libs/common/src/dtos/graph.change.request.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ProviderGraphDto } from './provider.graph.dto'; - -export class ProviderGraphJob { - referenceId: string; - - providerGraphDto: ProviderGraphDto; -} diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 883dfc98..8039cde0 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -12,8 +12,8 @@ export * from './dtos/watch-graphs.dto'; export * from './dtos/dsnp.graph.edge.dto'; export * from './dtos/graph.change.request.reference'; export * from './dtos/graph.update.job'; -export * from './dtos/graph-update-job.interface'; -export * from './dtos/graph.change.request'; +export * from './interfaces/graph-update-job.interface'; +export * from './interfaces/provider.graph.update-job.interface'; export * from './services/nonce.service'; export * from './utils/queues'; export * from './services/provider-webhook.service'; diff --git a/libs/common/src/dtos/graph-update-job.interface.ts b/libs/common/src/interfaces/graph-update-job.interface.ts similarity index 100% rename from libs/common/src/dtos/graph-update-job.interface.ts rename to libs/common/src/interfaces/graph-update-job.interface.ts diff --git a/libs/common/src/interfaces/provider.graph.update-job.interface.ts b/libs/common/src/interfaces/provider.graph.update-job.interface.ts new file mode 100644 index 00000000..1f68c30e --- /dev/null +++ b/libs/common/src/interfaces/provider.graph.update-job.interface.ts @@ -0,0 +1,16 @@ +import { ConnectionDto } from '../dtos/connections.dto'; +import { GraphKeyPairDto } from '../dtos/graph.key.pair.dto'; + +export class ProviderGraphUpdateJob { + referenceId: string; + + dsnpId: string; + + providerId: string; + + connections: ConnectionDto[]; + + graphKeyPairs?: GraphKeyPairDto[]; + + updateConnection: boolean; +} diff --git a/libs/common/src/services/blockchain-scanner.service.ts b/libs/common/src/services/blockchain-scanner.service.ts index 9a720cb4..593388b9 100644 --- a/libs/common/src/services/blockchain-scanner.service.ts +++ b/libs/common/src/services/blockchain-scanner.service.ts @@ -9,7 +9,7 @@ import Redis from 'ioredis'; import { ConfigService } from '../config/config.service'; import { BlockchainService } from '../blockchain/blockchain.service'; import { QueueConstants } from '../utils/queues'; -import { UpdateTransitiveGraphs, createReconnectionJob } from '../dtos/graph-update-job.interface'; +import { UpdateTransitiveGraphs, createReconnectionJob } from '../interfaces/graph-update-job.interface'; export const LAST_SEEN_BLOCK_NUMBER_KEY = 'lastSeenBlockNumber'; From 6e43d3f1e5f66652a4ce6508f9af2b1b00695387 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:08:14 -0600 Subject: [PATCH 15/53] add processor for monitor (#29) --- apps/api/src/api.service.ts | 2 +- .../graph.monitor.processor.module.ts | 19 ++- .../graph.monitor.processor.service.ts | 130 +++++++++++++++++- .../graph.reconnection.processor.service.ts | 2 +- .../request.processor.service.ts | 6 +- .../src/blockchain/blockchain.service.ts | 74 ++++++++++ .../services/blockchain-scanner.service.ts | 6 +- 7 files changed, 227 insertions(+), 12 deletions(-) diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 4723ca3e..a94ae6f9 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -34,7 +34,7 @@ export class ApiService implements OnApplicationShutdown { referenceId: this.calculateJobId(request), updateConnection: this.configService.getReconnectionServiceRequired(), }; - const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId, removeOnFail: false, removeOnComplete: 2000 }); // TODO: should come from queue configs + const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId, removeOnFail: false, removeOnComplete: false }); // TODO: should come from queue configs this.logger.debug(job); return { referenceId: data.referenceId, diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index 8df4a125..f4118ae0 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -9,9 +9,11 @@ import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; import { QueueConstants } from '../../../../libs/common/src'; import { GraphNotifierService } from './graph.monitor.processor.service'; +import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; @Module({ imports: [ + BlockchainModule, ConfigModule, RedisModule.forRootAsync( { @@ -46,9 +48,20 @@ import { GraphNotifierService } from './graph.monitor.processor.service'; }, inject: [ConfigService], }), - BullModule.registerQueue({ - name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, - }), + BullModule.registerQueue( + { + name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + }, + { + name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + }, + { + name: QueueConstants.RECONNECT_REQUEST_QUEUE, + }, + ), ], providers: [GraphNotifierService], exports: [BullModule, GraphNotifierService], diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 289d98e6..969a6b82 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -1,18 +1,26 @@ import { InjectRedis } from '@liaoliaots/nestjs-redis'; -import { Processor } from '@nestjs/bullmq'; +import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; -import { Job } from 'bullmq'; +import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; +import { MILLISECONDS_PER_SECOND } from 'time-constants'; +import { RegistryError } from '@polkadot/types/types'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants } from '../../../../libs/common/src'; +import { ProviderGraphUpdateJob, QueueConstants, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; +import { BlockchainConstants } from '../../../../libs/common/src/blockchain/blockchain-constants'; +import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) export class GraphNotifierService extends BaseConsumer { constructor( @InjectRedis() private cacheManager: Redis, + @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private changeRequestQueue: Queue, + @InjectQueue(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) private publishQueue: Queue, + @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectionQueue: Queue, + private blockchainService: BlockchainService, private configService: ConfigService, ) { super(); @@ -21,14 +29,126 @@ export class GraphNotifierService extends BaseConsumer { async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { - // TODO: add logic to process graph tx checks and subsequent notifications - this.logger.debug(job.asJSON()); + const numberBlocksToParse = BlockchainConstants.NUMBER_BLOCKS_TO_CRAWL; + const txCapacityEpoch = job.data.epoch; + const previousKnownBlockNumber = (await this.blockchainService.getBlock(job.data.lastFinalizedBlockHash)).block.header.number.toBigInt(); + const currentFinalizedBlockNumber = await this.blockchainService.getLatestFinalizedBlockNumber(); + const blockList: bigint[] = []; + + for (let i = previousKnownBlockNumber; i <= currentFinalizedBlockNumber && i < previousKnownBlockNumber + numberBlocksToParse; i += 1n) { + blockList.push(i); + } + const txResult = await this.blockchainService.crawlBlockListForTx(job.data.txHash, blockList, [{ pallet: 'system', event: 'ExtrinsicSuccess' }]); + if (!txResult.found) { + this.logger.error(`Tx ${job.data.txHash} not found in block list`); + throw new Error(`Tx ${job.data.txHash} not found in block list`); + } else { + // Set current epoch capacity + await this.setEpochCapacity(txCapacityEpoch, BigInt(txResult.capacityWithDrawn ?? 0n)); + if (txResult.error) { + this.logger.debug(`Error found in tx result: ${JSON.stringify(txResult.error)}`); + const errorReport = await this.handleMessagesFailure(txResult.error); + if (errorReport.pause) { + this.logger.debug(`Pausing queue ${job.data.referencePublishJob.referenceId}`); + await this.changeRequestQueue.pause(); + await this.publishQueue.pause(); + await this.reconnectionQueue.pause(); + } + if (errorReport.retry) { + await this.retryRequestJob(job.data.referencePublishJob.referenceId); + } else { + throw new Error(`Job ${job.data.id} failed with error ${JSON.stringify(txResult.error)}`); + } + } + + if (txResult.success) { + await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); + this.logger.verbose(`Successfully found ${job.data.txHash} found in block ${txResult.blockHash}`); + // TODO send out data to webhooks registered for this dsnpId + // Get DSNPGraphEdge from debounced queue and send to webhooks + const webhookList = await this.getWebhookList(job.data.referencePublishJob.update.ownerDsnpUserId); + this.logger.debug(`Found ${webhookList.length} webhooks for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); + + } + } } catch (e) { this.logger.error(e); throw e; } } + private async removeSuccessJobs(referenceId: string): Promise { + this.logger.debug(`Removing success jobs for ${referenceId}`); + this.changeRequestQueue.remove(referenceId); + this.publishQueue.remove(referenceId); + this.reconnectionQueue.remove(referenceId); + } + + private async retryRequestJob(requestReferenceId: string): Promise { + this.logger.debug(`Retrying graph change request job ${requestReferenceId}`); + const requestJob: Job | undefined = await this.changeRequestQueue.getJob(requestReferenceId); + if (!requestJob) { + this.logger.debug(`Job ${requestReferenceId} not found in queue`); + return; + } + await this.changeRequestQueue.remove(requestReferenceId); + await this.changeRequestQueue.add(`Retrying publish job - ${requestReferenceId}`, requestJob.data, { + jobId: requestReferenceId, + removeOnFail: false, + removeOnComplete: false, + }); + } + + private async setEpochCapacity(epoch: string, capacityWithdrew: bigint): Promise { + const epochCapacityKey = `epochCapacity:${epoch}`; + + try { + const savedCapacity = await this.cacheManager.get(epochCapacityKey); + const epochCapacity = BigInt(savedCapacity ?? 0); + const newEpochCapacity = epochCapacity + capacityWithdrew; + + const epochDurationBlocks = await this.blockchainService.getCurrentEpochLength(); + const epochDuration = epochDurationBlocks * SECONDS_PER_BLOCK * MILLISECONDS_PER_SECOND; + await this.cacheManager.setex(epochCapacityKey, epochDuration, newEpochCapacity.toString()); + } catch (error) { + this.logger.error(`Error setting epoch capacity: ${error}`); + } + } + + private async handleMessagesFailure(moduleError: RegistryError): Promise<{ pause: boolean; retry: boolean }> { + try { + switch (moduleError.method) { + case 'StalePageState': + case 'ProofHasExpired': + case 'ProofNotYetValid': + case 'InvalidSignature': + // Re-try the job in the request change queue + return { pause: false, retry: true }; + case 'InvalidSchemaId': + return { pause: true, retry: false }; + case 'InvalidMessageSourceAccount': + case 'UnauthorizedDelegate': + case 'CorruptedState': + case 'InvalidItemAction': + case 'PageIdExceedsMaxAllowed': + case 'PageExceedsMaxPageSizeBytes': + case 'UnsupportedOperationForSchema': + case 'InvalidPayloadLocation': + case 'SchemaPayloadLocationMismatch': + // fail the job since this is unrecoverable + return { pause: false, retry: false }; + default: + this.logger.error(`Unknown module error ${moduleError}`); + break; + } + } catch (error) { + this.logger.error(`Error handling module error: ${error}`); + } + + // unknown error, pause the queue + return { pause: false, retry: false }; + } + async getWebhookList(dsnpId: string): Promise { const redisKey = `${QueueConstants.REDIS_WATCHER_PREFIX}:${dsnpId}`; const redisList = await this.cacheManager.lrange(redisKey, 0, -1); diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index 8147d5ad..1492b1f3 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -45,7 +45,7 @@ export class GraphReconnectionService extends BaseConsumer { }; this.graphChangeRequestQueuue.add(`Provider Graph Job - ${providerGraphJob.referenceId}`, providerGraphJob, { removeOnFail: false, - removeOnComplete: 2000, + removeOnComplete: false, }); this.logger.debug(`Found ${graphConnections.length} connections for user ${job.data.dsnpId.toString()} from provider ${job.data.providerId.toString()}`); } catch (e) { diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index f3d21d65..681974d0 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -236,7 +236,11 @@ export class RequestProcessorService extends BaseConsumer { if (isDelegatedConnection) { const { key: jobId, data } = createReconnectionJob(connection.dsnpId, providerId, SkipTransitiveGraphs); this.reconnectionQueue.remove(jobId); - this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); + this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { + jobId, + removeOnComplete: false, + removeOnFail: false, + }); } break; } diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts index 43f30308..94c69baf 100644 --- a/libs/common/src/blockchain/blockchain.service.ts +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -126,4 +126,78 @@ export class BlockchainService implements OnApplicationBootstrap, OnApplicationS const schema: PalletSchemasSchema = await this.query('schemas', 'schemas', schemaId); return schema; } + + public async getCurrentEpochLength(): Promise { + const epochLength: u32 = await this.query('capacity', 'epochLength'); + return typeof epochLength === 'number' ? epochLength : epochLength.toNumber(); + } + + public async crawlBlockListForTx( + txHash: Hash, + blockList: bigint[], + successEvents: [{ pallet: string; event: string }], + ): Promise<{ found: boolean; success: boolean; blockHash?: BlockHash; capacityWithDrawn?: string; error?: RegistryError }> { + const txReceiptPromises: Promise<{ found: boolean; success: boolean; blockHash?: BlockHash; capacityWithDrawn?: string; error?: RegistryError }>[] = blockList.map( + async (blockNumber) => { + const blockHash = await this.getBlockHash(blockNumber); + const block = await this.getBlock(blockHash); + const txInfo = block.block.extrinsics.find((extrinsic) => extrinsic.hash.toString() === txHash.toString()); + + if (!txInfo) { + return { found: false, success: false }; + } + + this.logger.verbose(`Found tx ${txHash} in block ${blockNumber}`); + const at = await this.api.at(blockHash.toHex()); + const eventsPromise = firstValueFrom(at.query.system.events()); + + let isTxSuccess = false; + let totalBlockCapacity: bigint = 0n; + let txError: RegistryError | undefined; + + try { + const events = await eventsPromise; + + events.forEach((record) => { + const { event } = record; + const eventName = event.section; + const { method } = event; + const { data } = event; + this.logger.debug(`Received event: ${eventName} ${method} ${data}`); + + // find capacity withdrawn event + if (eventName.search('capacity') !== -1 && method.search('Withdrawn') !== -1) { + // allow lowercase constructor for eslint + // eslint-disable-next-line new-cap + const currentCapacity: u128 = new u128(this.api.registry, data[1]); + totalBlockCapacity += currentCapacity.toBigInt(); + } + + // check custom success events + if (successEvents.find((successEvent) => successEvent.pallet === eventName && successEvent.event === method)) { + this.logger.debug(`Found success event ${eventName} ${method}`); + isTxSuccess = true; + } + + // check for system extrinsic failure + if (eventName.search('system') !== -1 && method.search('ExtrinsicFailed') !== -1) { + const dispatchError = data[0] as DispatchError; + const moduleThatErrored = dispatchError.asModule; + const moduleError = dispatchError.registry.findMetaError(moduleThatErrored); + txError = moduleError; + this.logger.error(`Extrinsic failed with error: ${JSON.stringify(moduleError)}`); + } + }); + } catch (error) { + this.logger.error(error); + } + this.logger.debug(`Total capacity withdrawn in block: ${totalBlockCapacity.toString()}`); + return { found: true, success: isTxSuccess, blockHash, capacityWithDrawn: totalBlockCapacity.toString(), error: txError }; + }, + ); + const results = await Promise.all(txReceiptPromises); + const result = results.find((receipt) => receipt.found); + this.logger.debug(`Found tx receipt: ${JSON.stringify(result)}`); + return result ?? { found: false, success: false }; + } } diff --git a/libs/common/src/services/blockchain-scanner.service.ts b/libs/common/src/services/blockchain-scanner.service.ts index 593388b9..295277d1 100644 --- a/libs/common/src/services/blockchain-scanner.service.ts +++ b/libs/common/src/services/blockchain-scanner.service.ts @@ -87,7 +87,11 @@ export class BlockchainScannerService implements OnApplicationBootstrap { if (job && ((await job.isCompleted()) || (await job.isFailed()))) { await job.retry(); } else { - await this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); + await this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { + jobId, + removeOnComplete: false, + removeOnFail: false, + }); } }); From 4344e4c0493e9453a2a0f5525f059701ca719f68 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:07:13 -0600 Subject: [PATCH 16/53] send a generic graph change notification to registered webhooks (#30) --- .../graph.monitor.processor.module.ts | 4 +-- .../graph.monitor.processor.service.ts | 28 +++++++++++++++++-- .../src/dtos/graph.change.notification.dto.ts | 7 +++++ libs/common/src/dtos/graph.query.dto.ts | 6 ++++ libs/common/src/index.ts | 1 + 5 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 libs/common/src/dtos/graph.change.notification.dto.ts diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index f4118ae0..72fcea7b 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -7,7 +7,7 @@ import { Module } from '@nestjs/common'; import { RedisModule } from '@liaoliaots/nestjs-redis'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants } from '../../../../libs/common/src'; +import { GraphStateManager, QueueConstants } from '../../../../libs/common/src'; import { GraphNotifierService } from './graph.monitor.processor.service'; import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; @@ -63,7 +63,7 @@ import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockch }, ), ], - providers: [GraphNotifierService], + providers: [GraphNotifierService, GraphStateManager], exports: [BullModule, GraphNotifierService], }) export class GraphNotifierModule {} diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 969a6b82..ed61c27b 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -5,8 +5,9 @@ import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { RegistryError } from '@polkadot/types/types'; +import axios from 'axios'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { ProviderGraphUpdateJob, QueueConstants, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; +import { GraphChangeNotificationDto, GraphStateManager, ProviderGraphUpdateJob, QueueConstants, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; import { BlockchainConstants } from '../../../../libs/common/src/blockchain/blockchain-constants'; @@ -22,6 +23,7 @@ export class GraphNotifierService extends BaseConsumer { @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectionQueue: Queue, private blockchainService: BlockchainService, private configService: ConfigService, + private graphStateManager: GraphStateManager, ) { super(); } @@ -64,11 +66,31 @@ export class GraphNotifierService extends BaseConsumer { if (txResult.success) { await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); this.logger.verbose(`Successfully found ${job.data.txHash} found in block ${txResult.blockHash}`); - // TODO send out data to webhooks registered for this dsnpId // Get DSNPGraphEdge from debounced queue and send to webhooks const webhookList = await this.getWebhookList(job.data.referencePublishJob.update.ownerDsnpUserId); this.logger.debug(`Found ${webhookList.length} webhooks for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); - + const notification: GraphChangeNotificationDto = { + dsnpId: job.data.referencePublishJob.update.ownerDsnpUserId, + update: job.data.referencePublishJob.update, + }; + + webhookList.forEach(async (webhookUrl) => { + let retries = 0; + while (retries < this.configService.getHealthCheckMaxRetries()) { + try { + this.logger.debug(`Sending graph change notification to webhook: ${webhookUrl}`); + this.logger.debug(`Graph Change: ${JSON.stringify(notification)}`); + // eslint-disable-next-line no-await-in-loop + await axios.post(webhookUrl, notification); + this.logger.debug(`Notification sent to webhook: ${webhookUrl}`); + break; + } catch (error) { + this.logger.error(`Failed to send notification to webhook: ${webhookUrl}`); + this.logger.error(error); + retries += 1; + } + } + }); } } } catch (e) { diff --git a/libs/common/src/dtos/graph.change.notification.dto.ts b/libs/common/src/dtos/graph.change.notification.dto.ts new file mode 100644 index 00000000..8d1bd447 --- /dev/null +++ b/libs/common/src/dtos/graph.change.notification.dto.ts @@ -0,0 +1,7 @@ +import { Update } from '@dsnp/graph-sdk'; + +export class GraphChangeNotificationDto { + dsnpId: string; + + update: Update; +} diff --git a/libs/common/src/dtos/graph.query.dto.ts b/libs/common/src/dtos/graph.query.dto.ts index 8ff96828..a25c4ca7 100644 --- a/libs/common/src/dtos/graph.query.dto.ts +++ b/libs/common/src/dtos/graph.query.dto.ts @@ -1,4 +1,5 @@ import { ArrayNotEmpty, ArrayUnique, IsArray, IsOptional, IsString } from 'class-validator'; +import { GraphKeyPairDto } from './graph.key.pair.dto'; export class GraphsQueryParamsDto { @IsArray() @@ -7,6 +8,11 @@ export class GraphsQueryParamsDto { @IsString({ each: true }) dsnpIds: string[]; + @IsOptional() + @IsArray() + @ArrayUnique() + grahKeyPairs?: GraphKeyPairDto[]; + @IsOptional() @IsString() blockNumber?: string; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 8039cde0..9d68b5c0 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -10,6 +10,7 @@ export * from './dtos/graph.key.pair.dto'; export * from './dtos/connections.dto'; export * from './dtos/watch-graphs.dto'; export * from './dtos/dsnp.graph.edge.dto'; +export * from './dtos/graph.change.notification.dto'; export * from './dtos/graph.change.request.reference'; export * from './dtos/graph.update.job'; export * from './interfaces/graph-update-job.interface'; From 01dc9187122ee44b423da5905f243f7303f0552a Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Mon, 8 Jan 2024 17:02:57 -0600 Subject: [PATCH 17/53] Get graph(s) endpoint (#31) * complete roundtrip for get graphs * cleanup * post graph request to fetch * use put for graph response requests * get endpoint working * api to get graphs from chain works with cache --- .env.dev | 3 +- apps/api/src/api.controller.ts | 22 +- apps/api/src/api.module.ts | 4 +- apps/api/src/api.service.ts | 36 +- apps/api/src/metadata.ts | 4 +- .../graph.monitor.processor.module.ts | 5 +- .../graph.monitor.processor.service.ts | 18 +- .../request.processor.service.ts | 89 +- docker-compose.dev.yaml | 2 + docs/index.html | 2193 +++++++++++++++++ env.template | 1 + libs/common/src/config/config.service.spec.ts | 5 + libs/common/src/config/config.service.ts | 5 + libs/common/src/config/env.config.ts | 1 + libs/common/src/dtos/graph.query.dto.ts | 13 +- libs/common/src/dtos/user.graph.dto.ts | 2 +- libs/common/src/services/async_debouncer.ts | 71 +- .../src/services/graph-state-manager.ts | 137 +- libs/common/src/utils/queues.ts | 5 + swagger.yaml | 80 +- 20 files changed, 2527 insertions(+), 169 deletions(-) create mode 100644 docs/index.html diff --git a/.env.dev b/.env.dev index 33aa30f2..3db89e45 100644 --- a/.env.dev +++ b/.env.dev @@ -3,6 +3,7 @@ FREQUENCY_URL=ws://0.0.0.0:9944 REDIS_URL=redis://0.0.0.0:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 +DEBOUNCE_SECONDS=10 # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev @@ -18,7 +19,7 @@ PROVIDER_ID=1 PROVIDER_BASE_URL="http://localhost:3000" # this is optional if reconnection service is not required PROVIDER_ACCESS_TOKEN="api-key" # this is optional if reconnection service if PROVIDER_BASE_URL requires an access token PAGE_SIZE=100 -RECONNECTION_SERVICE_REQUIRED=true +RECONNECTION_SERVICE_REQUIRED=false BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 WEBHOOK_FAILURE_THRESHOLD=3 HEALTH_CHECK_SUCCESS_THRESHOLD=10 diff --git a/apps/api/src/api.controller.ts b/apps/api/src/api.controller.ts index 949e5045..757cc386 100644 --- a/apps/api/src/api.controller.ts +++ b/apps/api/src/api.controller.ts @@ -1,5 +1,5 @@ import { Controller, Get, Post, HttpCode, HttpStatus, Logger, Query, Body, Put } from '@nestjs/common'; -import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; +import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; import { ApiService } from './api.service'; import { GraphChangeRepsonseDto, GraphsQueryParamsDto, ProviderGraphDto, UserGraphDto } from '../../../libs/common/src'; import { WatchGraphsDto } from '../../../libs/common/src/dtos/watch-graphs.dto'; @@ -28,22 +28,14 @@ export class ApiController { // Fetch graphs for list of `dsnpIds` at optional `blockNumber` // Fetch graphs for list of `dsnpIds` at optional `blockNumber` - @Get('graphs') + @Put('graphs') @HttpCode(HttpStatus.OK) - @ApiOperation({ summary: 'Fetch graphs for specified dsnpIds and blockNumber' }) - @ApiOkResponse({ description: 'Graphs retrieved successfully', type: UserGraphDto }) - async getGraphs(@Query() queryParams: GraphsQueryParamsDto): Promise { + @ApiOperation({ summary: 'Post a request to fetch graphs for specified dsnpIds and blockNumber' }) + @ApiOkResponse({ description: 'Graphs retrieved successfully', type: [UserGraphDto] }) + async getGraphs(@Body() queryParams: GraphsQueryParamsDto): Promise { try { - // TODO: Uncomment this line once the ApiService is implemented - // const graphs = await this.apiService.getGraphs(queryParams.dsnpIds, queryParams.blockNumber); - - // For now, returning a dummy response - const dummyGraph: UserGraphDto = { - dsnpId: 'sampleDsnpId', - dsnpGraphEdge: [], - }; - - return [dummyGraph]; + const graphs = await this.apiService.getGraphs(queryParams); + return graphs; } catch (error) { this.logger.error(error); throw new Error('Failed to fetch graphs'); diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index 658d5711..c383252e 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -11,7 +11,7 @@ import { ApiService } from './api.service'; import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; -import { QueueConstants } from '../../../libs/common/src'; +import { GraphStateManager, QueueConstants } from '../../../libs/common/src'; @Module({ imports: [ @@ -105,7 +105,7 @@ import { QueueConstants } from '../../../libs/common/src'; }), ScheduleModule.forRoot(), ], - providers: [ApiService], + providers: [ApiService, GraphStateManager, ConfigService], controllers: [ApiController], exports: [], }) diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index a94ae6f9..9fa246a2 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -4,19 +4,36 @@ import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { createHash } from 'crypto'; -import { GraphChangeRepsonseDto, ProviderGraphDto, ProviderGraphUpdateJob, QueueConstants, WatchGraphsDto } from '../../../libs/common/src'; +import { MessageSourceId } from '@frequency-chain/api-augment/interfaces'; +import { + AsyncDebouncerService, + GraphChangeRepsonseDto, + GraphStateManager, + GraphsQueryParamsDto, + ProviderGraphDto, + ProviderGraphUpdateJob, + QueueConstants, + UserGraphDto, + WatchGraphsDto, +} from '../../../libs/common/src'; import { ConfigService } from '../../../libs/common/src/config/config.service'; +import { BlockchainService } from '../../../libs/common/src/blockchain/blockchain.service'; @Injectable() export class ApiService implements OnApplicationShutdown { private readonly logger: Logger; + private asyncDebouncerService: AsyncDebouncerService; + constructor( @InjectRedis() private redis: Redis, @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private graphChangeRequestQueue: Queue, + private graphStateManager: GraphStateManager, private configService: ConfigService, + private blockchainService: BlockchainService, ) { this.logger = new Logger(this.constructor.name); + this.asyncDebouncerService = new AsyncDebouncerService(this.redis, this.configService, this.graphStateManager); } onApplicationShutdown(signal?: string | undefined) { @@ -50,6 +67,23 @@ export class ApiService implements OnApplicationShutdown { }); } + async getGraphs(queryParams: GraphsQueryParamsDto): Promise { + const { dsnpIds, privacyType } = queryParams; + const graphKeyPairs = queryParams.graphKeyPairs || []; + const graphs: UserGraphDto[] = []; + // eslint-disable-next-line no-restricted-syntax + for (const dsnpId of dsnpIds) { + const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', dsnpId); + // eslint-disable-next-line no-await-in-loop + const graphEdges = await this.asyncDebouncerService.getGraphForDsnpId(dsnpUserId, privacyType, graphKeyPairs); + graphs.push({ + dsnpId, + dsnpGraphEdges: graphEdges, + }); + } + return graphs; + } + // eslint-disable-next-line class-methods-use-this private calculateJobId(jobWithoutId: ProviderGraphDto): string { const stringVal = JSON.stringify(jobWithoutId); diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index 2d41daca..c6f442c2 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -4,12 +4,12 @@ export default async () => { ["../../../libs/common/src/dtos/dsnp.graph.edge.dto"]: await import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), ["../../../libs/common/src/dtos/key.type.dto"]: await import("../../../libs/common/src/dtos/key.type.dto"), ["../../../libs/common/src/dtos/privacy.type.dto"]: await import("../../../libs/common/src/dtos/privacy.type.dto"), + ["../../../libs/common/src/dtos/graph.key.pair.dto"]: await import("../../../libs/common/src/dtos/graph.key.pair.dto"), ["../../../libs/common/src/dtos/direction.dto"]: await import("../../../libs/common/src/dtos/direction.dto"), ["../../../libs/common/src/dtos/connection.type.dto"]: await import("../../../libs/common/src/dtos/connection.type.dto"), ["../../../libs/common/src/dtos/connections.dto"]: await import("../../../libs/common/src/dtos/connections.dto"), - ["../../../libs/common/src/dtos/graph.key.pair.dto"]: await import("../../../libs/common/src/dtos/graph.key.pair.dto"), ["../../../libs/common/src/dtos/user.graph.dto"]: await import("../../../libs/common/src/dtos/user.graph.dto"), ["../../../libs/common/src/dtos/graph.change.request.reference"]: await import("../../../libs/common/src/dtos/graph.change.request.reference") }; - return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdge: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp.graph.edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, blockNumber: { required: false, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph.change.request.reference"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; + return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdges: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp.graph.edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, graphKeyPairs: { required: true, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.change.notification.dto"), { "GraphChangeNotificationDto": { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph.change.request.reference"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; }; \ No newline at end of file diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index 72fcea7b..1dcf0771 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -10,6 +10,7 @@ import { ConfigService } from '../../../../libs/common/src/config/config.service import { GraphStateManager, QueueConstants } from '../../../../libs/common/src'; import { GraphNotifierService } from './graph.monitor.processor.service'; import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; +import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; @Module({ imports: [ @@ -63,7 +64,7 @@ import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockch }, ), ], - providers: [GraphNotifierService, GraphStateManager], - exports: [BullModule, GraphNotifierService], + providers: [GraphNotifierService, GraphStateManager, BlockchainService, ConfigService], + exports: [BullModule, GraphNotifierService, BlockchainService, ConfigService], }) export class GraphNotifierModule {} diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index ed61c27b..3c48a14c 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -6,8 +6,9 @@ import Redis from 'ioredis'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { RegistryError } from '@polkadot/types/types'; import axios from 'axios'; +import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { GraphChangeNotificationDto, GraphStateManager, ProviderGraphUpdateJob, QueueConstants, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; +import { AsyncDebouncerService, GraphChangeNotificationDto, GraphStateManager, ProviderGraphUpdateJob, QueueConstants, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; import { BlockchainConstants } from '../../../../libs/common/src/blockchain/blockchain-constants'; @@ -16,6 +17,8 @@ import { BlockchainService } from '../../../../libs/common/src/blockchain/blockc @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) export class GraphNotifierService extends BaseConsumer { + private asyncDebouncerService: AsyncDebouncerService; + constructor( @InjectRedis() private cacheManager: Redis, @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private changeRequestQueue: Queue, @@ -26,6 +29,7 @@ export class GraphNotifierService extends BaseConsumer { private graphStateManager: GraphStateManager, ) { super(); + this.asyncDebouncerService = new AsyncDebouncerService(this.cacheManager, this.configService, this.graphStateManager); } async process(job: Job): Promise { @@ -66,9 +70,19 @@ export class GraphNotifierService extends BaseConsumer { if (txResult.success) { await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); this.logger.verbose(`Successfully found ${job.data.txHash} found in block ${txResult.blockHash}`); - // Get DSNPGraphEdge from debounced queue and send to webhooks const webhookList = await this.getWebhookList(job.data.referencePublishJob.update.ownerDsnpUserId); this.logger.debug(`Found ${webhookList.length} webhooks for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); + const requestJob: Job | undefined = await this.changeRequestQueue.getJob(job.data.referencePublishJob.referenceId); + + if (job.data.referencePublishJob.update.type !== 'AddKey') { + const graphKeyPairs = requestJob?.data.graphKeyPairs ?? []; + const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.referencePublishJob.update.ownerDsnpUserId); + const schemaId: SchemaId = this.blockchainService.api.registry.createType('SchemaId', job.data.referencePublishJob.update.type); + const graphEdges = await this.asyncDebouncerService.setGraphForSchemaId(dsnpUserId, schemaId, graphKeyPairs); + if (graphEdges.length === 0) { + this.logger.debug(`No graph edges found for ${dsnpUserId.toString()}`); + } + } const notification: GraphChangeNotificationDto = { dsnpId: job.data.referencePublishJob.update.ownerDsnpUserId, update: job.data.referencePublishJob.update, diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 681974d0..b0ca04ba 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -42,7 +42,7 @@ export class RequestProcessorService extends BaseConsumer { try { const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.dsnpId); const providerId: ProviderId = this.blockchainService.api.registry.createType('ProviderId', job.data.providerId); - await this.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); // using graphConnections form Action[] and update the user's DSNP Graph const actions: ConnectAction[] = await this.formConnections(dsnpUserId, providerId, job.data.updateConnection, job.data.connections); try { @@ -71,7 +71,7 @@ export class RequestProcessorService extends BaseConsumer { }); }); - const reImported = await this.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); if (reImported) { // eslint-disable-next-line no-await-in-loop const userGraphExists = this.graphStateManager.graphContainsUser(dsnpUserId.toString()); @@ -90,79 +90,13 @@ export class RequestProcessorService extends BaseConsumer { } } - async importBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { - const importBundles = await this.formImportBundles(dsnpUserId, graphKeyPairs); - return this.graphStateManager.importUserData(importBundles); - } - - async formImportBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { - const publicFollowSchemaId = this.graphStateManager.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Public); - const privateFollowSchemaId = this.graphStateManager.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Private); - const privateFriendshipSchemaId = this.graphStateManager.getSchemaIdFromConfig(ConnectionType.Friendship, PrivacyType.Private); - - const publicFollows: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, publicFollowSchemaId); - const privateFollows: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, privateFollowSchemaId); - const privateFriendships: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, privateFriendshipSchemaId); - const dsnpKeys = await this.formDsnpKeys(dsnpUserId); - const graphKeyPairsSdk = graphKeyPairs.map( - (keyPair: GraphKeyPairDto): GraphKeyPair => ({ - keyType: GraphKeyType.X25519, - publicKey: hexToU8a(keyPair.publicKey), - secretKey: hexToU8a(keyPair.privateKey), - }), - ); - const importBundleBuilder = new ImportBundleBuilder(); - // Only X25519 is supported for now - // check if all keys are of type X25519 - const areKeysCorrectType = graphKeyPairs.every((keyPair) => keyPair.keyType === KeyType.X25519); - if (!areKeysCorrectType) { - throw new Error('Only X25519 keys are supported for now'); - } - - let importBundles: ImportBundle[]; - - // If no pages to import, import at least one empty page so that user graph will be created - if (publicFollows.length + privateFollows.length + privateFriendships.length === 0 && (graphKeyPairs.length > 0 || dsnpKeys?.keys.length > 0)) { - let builder = importBundleBuilder.withDsnpUserId(dsnpUserId.toString()).withSchemaId(privateFollowSchemaId); - - if (dsnpKeys?.keys?.length > 0) { - builder = builder.withDsnpKeys(dsnpKeys); - } - if (graphKeyPairs?.length > 0) { - builder = builder.withGraphKeyPairs(graphKeyPairsSdk); - } - - importBundles = [builder.build()]; - } else { - importBundles = [publicFollows, privateFollows, privateFriendships].flatMap((pageResponses: PaginatedStorageResponse[]) => - pageResponses.map((pageResponse) => { - let builder = importBundleBuilder - .withDsnpUserId(pageResponse.msa_id.toString()) - .withSchemaId(pageResponse.schema_id.toNumber()) - .withPageData(pageResponse.page_id.toNumber(), pageResponse.payload, pageResponse.content_hash.toNumber()); - - if (dsnpKeys?.keys?.length > 0) { - builder = builder.withDsnpKeys(dsnpKeys); - } - if (graphKeyPairs?.length > 0) { - builder = builder.withGraphKeyPairs(graphKeyPairsSdk); - } - - return builder.build(); - }), - ); - } - - return importBundles; - } - private async importConnectionKeys(graphConnections: ConnectionDto[]): Promise { const keyPromises = graphConnections .filter( ({ direction, privacyType, connectionType }) => [Direction.ConnectionTo, Direction.Bidirectional].some((dir) => dir === direction) && privacyType === PrivacyType.Private && connectionType === ConnectionType.Friendship, ) - .map(({ dsnpId }) => this.formDsnpKeys(dsnpId)); + .map(({ dsnpId }) => this.graphStateManager.formDsnpKeys(dsnpId)); const keys = await Promise.all(keyPromises); const bundles = keys.map((dsnpKeys) => new ImportBundleBuilder().withDsnpUserId(dsnpKeys.dsnpUserId).withDsnpKeys(dsnpKeys).build()); @@ -176,7 +110,7 @@ export class RequestProcessorService extends BaseConsumer { isTransitive: boolean, graphConnections: ConnectionDto[], ): Promise { - const dsnpKeys: DsnpKeys = await this.formDsnpKeys(dsnpUserId); + const dsnpKeys: DsnpKeys = await this.graphStateManager.formDsnpKeys(dsnpUserId); const actions: ConnectAction[] = []; // this.logger.debug(`Graph connections for user ${dsnpUserId.toString()}: ${JSON.stringify(graphConnections)}`); // Import DSNP public graph keys for connected users in private friendship connections @@ -275,19 +209,4 @@ export class RequestProcessorService extends BaseConsumer { return actions; } - - async formDsnpKeys(dsnpUserId: MessageSourceId | AnyNumber): Promise { - const publicKeySchemaId = this.graphStateManager.getGraphKeySchemaId(); - const publicKeys: ItemizedStoragePageResponse = await this.blockchainService.rpc('statefulStorage', 'getItemizedStorage', dsnpUserId, publicKeySchemaId); - const keyData: KeyData[] = publicKeys.items.toArray().map((publicKey) => ({ - index: publicKey.index.toNumber(), - content: hexToU8a(publicKey.payload.toHex()), - })); - const dsnpKeys: DsnpKeys = { - dsnpUserId: dsnpUserId.toString(), - keysHash: publicKeys.content_hash.toNumber(), - keys: keyData, - }; - return dsnpKeys; - } } diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 58c92732..eca28b84 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -58,6 +58,7 @@ services: environment: - START_PROCESS=api - REDIS_URL=redis://redis:6379 + - FREQUENCY_URL=http://frequency:9944 volumes: - ./:/app depends_on: @@ -75,6 +76,7 @@ services: environment: - START_PROCESS=worker - REDIS_URL=redis://redis:6379 + - FREQUENCY_URL=http://frequency:9944 volumes: - ./:/app depends_on: diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..d76cbabe --- /dev/null +++ b/docs/index.html @@ -0,0 +1,2193 @@ + + + + + + Graph Service + + + + + + + + + +

Graph Service (1.0)

Download OpenAPI specification:Download

Graph Service API

+

graph-service

Check the health status of the service

Responses

Fetch graphs for specified dsnpIds and blockNumber

query Parameters
dsnpIds
required
Array of strings
blockNumber
string

Responses

Response samples

Content type
application/json
{
  • "dsnpId": "string",
  • "dsnpGraphEdge": [
    ]
}

Request an update to given users graph

Request Body schema: application/json
dsnpId
required
string
required
object
Array of objects (GraphKeyPairDto)

Responses

Request samples

Content type
application/json
{
  • "dsnpId": "string",
  • "connections": {
    },
  • "graphKeyPairs": [
    ]
}

Response samples

Content type
application/json
{ }

Watch graphs for specified dsnpIds and receive updates

Request Body schema: application/json
dsnpIds
required
Array of strings
webhookEndpoint
required
string

Responses

Request samples

Content type
application/json
{
  • "dsnpIds": [
    ],
  • "webhookEndpoint": "string"
}
+ + + + \ No newline at end of file diff --git a/env.template b/env.template index 405d8873..6ef10f2a 100644 --- a/env.template +++ b/env.template @@ -3,6 +3,7 @@ FREQUENCY_URL=ws://0.0.0.0:9944 REDIS_URL=redis://0.0.0.0:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 +DEBOUNCE_SECONDS=10 # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index c8aabb42..4cd65411 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -40,6 +40,7 @@ describe('GraphSericeConfig', () => { FREQUENCY_URL: undefined, QUEUE_HIGH_WATER: undefined, API_PORT: undefined, + DEBOUNCE_SECONDS: undefined, RECONNECTION_SERVICE_REQUIRED: undefined, BLOCKCHAIN_SCAN_INTERVAL_MINUTES: undefined, GRAPH_ENVIRONMENT_TYPE: undefined, @@ -180,5 +181,9 @@ describe('GraphSericeConfig', () => { it('should get page size', () => { expect(graphServiceConfig.getPageSize()).toStrictEqual(parseInt(ALL_ENV.PAGE_SIZE as string, 10)); }); + + it('should get debounce seconds', () => { + expect(graphServiceConfig.getDebounceSeconds()).toStrictEqual(parseInt(ALL_ENV.DEBOUNCE_SECONDS as string, 10)); + }); }); }); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index 4ad04f83..b47b78b0 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -11,6 +11,7 @@ export interface ConfigEnvironmentVariables { FREQUENCY_URL: URL; QUEUE_HIGH_WATER: number; API_PORT: number; + DEBOUNCE_SECONDS: number; GRAPH_ENVIRONMENT_TYPE: keyof EnvironmentType; GRAPH_ENVIRONMENT_DEV_CONFIG?: string; PROVIDER_ACCOUNT_SEED_PHRASE: string; @@ -119,4 +120,8 @@ export class ConfigService { public getPageSize(): number { return this.nestConfigService.get('PAGE_SIZE')!; } + + public getDebounceSeconds(): number { + return this.nestConfigService.get('DEBOUNCE_SECONDS')!; + } } diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index 24cf2256..4dfa0753 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -8,6 +8,7 @@ export const configModuleOptions: ConfigModuleOptions = { FREQUENCY_URL: Joi.string().uri().required(), QUEUE_HIGH_WATER: Joi.number().min(100).default(1000), API_PORT: Joi.number().min(0).default(3000), + DEBOUNCE_SECONDS: Joi.number().min(0).default(10), RECONNECTION_SERVICE_REQUIRED: Joi.boolean().default(false), BLOCKCHAIN_SCAN_INTERVAL_MINUTES: Joi.number() .min(1) diff --git a/libs/common/src/dtos/graph.query.dto.ts b/libs/common/src/dtos/graph.query.dto.ts index a25c4ca7..cb53ebf8 100644 --- a/libs/common/src/dtos/graph.query.dto.ts +++ b/libs/common/src/dtos/graph.query.dto.ts @@ -1,5 +1,6 @@ -import { ArrayNotEmpty, ArrayUnique, IsArray, IsOptional, IsString } from 'class-validator'; +import { ArrayNotEmpty, ArrayUnique, IsArray, IsEnum, IsOptional, IsString } from 'class-validator'; import { GraphKeyPairDto } from './graph.key.pair.dto'; +import { PrivacyType } from './privacy.type.dto'; export class GraphsQueryParamsDto { @IsArray() @@ -8,12 +9,10 @@ export class GraphsQueryParamsDto { @IsString({ each: true }) dsnpIds: string[]; - @IsOptional() - @IsArray() - @ArrayUnique() - grahKeyPairs?: GraphKeyPairDto[]; + @IsEnum(PrivacyType) + privacyType: PrivacyType; @IsOptional() - @IsString() - blockNumber?: string; + @IsArray() + graphKeyPairs: GraphKeyPairDto[]; } diff --git a/libs/common/src/dtos/user.graph.dto.ts b/libs/common/src/dtos/user.graph.dto.ts index 66eff7d4..f094efe0 100644 --- a/libs/common/src/dtos/user.graph.dto.ts +++ b/libs/common/src/dtos/user.graph.dto.ts @@ -3,5 +3,5 @@ import { DsnpGraphEdge } from './dsnp.graph.edge.dto'; export class UserGraphDto { dsnpId: string; - dsnpGraphEdge?: DsnpGraphEdge[]; + dsnpGraphEdges?: DsnpGraphEdge[]; } diff --git a/libs/common/src/services/async_debouncer.ts b/libs/common/src/services/async_debouncer.ts index ed68452b..f97a67f9 100644 --- a/libs/common/src/services/async_debouncer.ts +++ b/libs/common/src/services/async_debouncer.ts @@ -1,37 +1,76 @@ import { Injectable, Logger } from '@nestjs/common'; -import { InjectRedis } from '@liaoliaots/nestjs-redis'; import Redis from 'ioredis'; +import { PrivacyType } from '@dsnp/graph-sdk'; +import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; +import { QueueConstants } from '../utils/queues'; +import { DsnpGraphEdge } from '../dtos/dsnp.graph.edge.dto'; +import { ConfigService } from '../config/config.service'; +import { GraphStateManager } from './graph-state-manager'; +import { GraphKeyPairDto } from '../dtos/graph.key.pair.dto'; @Injectable() export class AsyncDebouncerService { private readonly logger: Logger; - constructor(@InjectRedis() private redis: Redis) { + constructor( + private redis: Redis, + private readonly configService: ConfigService, + private readonly graphStateManager: GraphStateManager, + ) { this.logger = new Logger(this.constructor.name); } - async debounceAsyncOperation(key: string, asyncOperation: () => Promise, debounceTime: number): Promise { - const cacheKey = this.getCacheKey(key); + public async getGraphForDsnpId(dsnpId: MessageSourceId, privacyType: string, graphKeyPairs?: GraphKeyPairDto[]): Promise { + return this.debounceAsyncOperation(dsnpId, privacyType, graphKeyPairs); + } + + public async setGraphForSchemaId(dsnpId: MessageSourceId, schemaId: SchemaId, graphKeyPairs?: GraphKeyPairDto[]): Promise { + if (!schemaId) { + throw new Error('Schema ID is required'); + } + const privacyType = this.graphStateManager.getPrivacyForSchema(schemaId.toNumber()); + return this.debounceAsyncOperation(dsnpId, privacyType, graphKeyPairs); + } + + async debounceAsyncOperation(dsnpId: MessageSourceId, privacyType: string, graphKeyPairs?: GraphKeyPairDto[]): Promise { + const cacheKey = this.getCacheKey(dsnpId.toString(), privacyType); const cachedFuture = await this.redis.get(cacheKey); if (cachedFuture) { - this.logger.debug(`Async operation for key ${key} is already inflight`); - return JSON.parse(cachedFuture); + this.logger.debug(`Async operation for key ${dsnpId} is already inflight`); + this.logger.debug(`Data: ${cachedFuture}`); + const graphData: DsnpGraphEdge[] = JSON.parse(cachedFuture); + if (graphData && graphData.length > 0) { + return Promise.resolve(graphData); + } } - const promise = asyncOperation(); - - await this.redis.setex(cacheKey, debounceTime, JSON.stringify(promise)); + let privacyTypeValue = PrivacyType.Public; + if (privacyType === 'private') { + privacyTypeValue = PrivacyType.Private; + } + let graphEdges: DsnpGraphEdge[] = []; + try { + graphEdges = await this.graphStateManager.getConnectionsWithPrivacyType(dsnpId, privacyTypeValue, graphKeyPairs); + } catch (err) { + this.logger.error(`Error getting graph edges for ${dsnpId} with privacy type ${privacyType}`); + this.logger.error(err); + return Promise.resolve(graphEdges); + } + const debounceTime = this.configService.getDebounceSeconds(); + await this.redis.setex(cacheKey, debounceTime, JSON.stringify(graphEdges)); - promise.finally(() => { - this.redis.del(cacheKey); - }); + return Promise.resolve(graphEdges); + } - return promise; + async getInflightFuture(key: string, privacyType: string): Promise { + const cacheKey = this.getCacheKey(key, privacyType); + const cachedFuture = await this.redis.get(cacheKey); + return cachedFuture ? JSON.parse(cachedFuture) : null; } - private getCacheKey(key: string): string { - this.logger.debug(`Async operation for key ${key} is not inflight`); - return `inflight-future:${key}`; + private getCacheKey(key: string, privacyType: string): string { + this.logger.debug(`Async operation for key ${key}:${privacyType}`); + return `${QueueConstants.DEBOUNCER_CACHE_KEY}:${key}:${privacyType}`; } } diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts index dfeca971..00d767a5 100644 --- a/libs/common/src/services/graph-state-manager.ts +++ b/libs/common/src/services/graph-state-manager.ts @@ -15,8 +15,16 @@ import { DsnpGraphEdge, ConnectionType, PrivacyType, + ImportBundleBuilder, + KeyData, } from '@dsnp/graph-sdk'; +import { ItemizedStoragePageResponse, MessageSourceId, PaginatedStorageResponse } from '@frequency-chain/api-augment/interfaces'; +import { hexToU8a } from '@polkadot/util'; +import { AnyNumber } from '@polkadot/types/types'; import { ConfigService } from '../config/config.service'; +import { GraphKeyPairDto } from '../dtos/graph.key.pair.dto'; +import { KeyType } from '../dtos/key.type.dto'; +import { BlockchainService } from '../blockchain/blockchain.service'; @Injectable() export class GraphStateManager implements OnApplicationBootstrap { @@ -56,10 +64,13 @@ export class GraphStateManager implements OnApplicationBootstrap { }; } - constructor(configService: ConfigService) { - const environmentType = configService.getGraphEnvironmentType(); + constructor( + private configService: ConfigService, + private blockchainService: BlockchainService, + ) { + const environmentType = this.configService.getGraphEnvironmentType(); if (environmentType === EnvironmentType.Dev.toString()) { - const configJson = configService.getGraphEnvironmentConfig(); + const configJson = this.configService.getGraphEnvironmentConfig(); const config: Config = JSON.parse(configJson); const devEnvironment: DevEnvironment = { environmentType: EnvironmentType.Dev, config }; this.environment = devEnvironment; @@ -85,6 +96,14 @@ export class GraphStateManager implements OnApplicationBootstrap { return {} as Config; } + public getPrivacyForSchema(schemaId: number): PrivacyType { + let privacyType = PrivacyType.Public; + if (this.schemaIds[ConnectionType.Follow][PrivacyType.Private] === schemaId || this.schemaIds[ConnectionType.Friendship][PrivacyType.Private] === schemaId) { + privacyType = PrivacyType.Private; + } + return privacyType; + } + public getSchemaIdFromConfig(connectionType: ConnectionType, privacyType: PrivacyType): number { return this.schemaIds[connectionType][privacyType] ?? 0; } @@ -144,6 +163,118 @@ export class GraphStateManager implements OnApplicationBootstrap { return false; } + public async getConnectionsWithPrivacyType(dsnpUserId: MessageSourceId, privacyType: PrivacyType, graphKeyPairs?: GraphKeyPairDto[]): Promise { + const privateFollowSchemaId = this.schemaIds[ConnectionType.Follow][PrivacyType.Private]; + const privateFriendSchemaId = this.schemaIds[ConnectionType.Friendship][PrivacyType.Private]; + const publicFollowSchemaId = this.schemaIds[ConnectionType.Follow][PrivacyType.Public]; + + if (this.graphState && this.graphState.containsUserGraph(dsnpUserId.toString())) { + if (privacyType === PrivacyType.Private) { + const privateFollowConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), privateFollowSchemaId, false); + const privateFriendConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), privateFriendSchemaId, false); + return privateFollowConnections.concat(privateFriendConnections); + } + if (privacyType === PrivacyType.Public) { + const publicFollowConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), publicFollowSchemaId, false); + return publicFollowConnections; + } + } + const bundlesImported = await this.importBundles(dsnpUserId, graphKeyPairs ?? []); + if (bundlesImported) { + if (privacyType === PrivacyType.Private) { + const privateFollowConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), privateFollowSchemaId, false); + const privateFriendConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), privateFriendSchemaId, false); + return privateFollowConnections.concat(privateFriendConnections); + } + if (privacyType === PrivacyType.Public) { + const publicFollowConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), publicFollowSchemaId, false); + return publicFollowConnections; + } + } + return []; + } + + async importBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { + const importBundles = await this.formImportBundles(dsnpUserId, graphKeyPairs); + return this.importUserData(importBundles); + } + + async formImportBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { + const publicFollowSchemaId = this.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Public); + const privateFollowSchemaId = this.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Private); + const privateFriendshipSchemaId = this.getSchemaIdFromConfig(ConnectionType.Friendship, PrivacyType.Private); + + const publicFollows: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, publicFollowSchemaId); + const privateFollows: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, privateFollowSchemaId); + const privateFriendships: PaginatedStorageResponse[] = await this.blockchainService.rpc('statefulStorage', 'getPaginatedStorage', dsnpUserId, privateFriendshipSchemaId); + const dsnpKeys = await this.formDsnpKeys(dsnpUserId); + const graphKeyPairsSdk = graphKeyPairs.map( + (keyPair: GraphKeyPairDto): GraphKeyPair => ({ + keyType: GraphKeyType.X25519, + publicKey: hexToU8a(keyPair.publicKey), + secretKey: hexToU8a(keyPair.privateKey), + }), + ); + const importBundleBuilder = new ImportBundleBuilder(); + // Only X25519 is supported for now + // check if all keys are of type X25519 + const areKeysCorrectType = graphKeyPairs.every((keyPair) => keyPair.keyType === KeyType.X25519); + if (!areKeysCorrectType) { + throw new Error('Only X25519 keys are supported for now'); + } + + let importBundles: ImportBundle[]; + + // If no pages to import, import at least one empty page so that user graph will be created + if (publicFollows.length + privateFollows.length + privateFriendships.length === 0 && (graphKeyPairs.length > 0 || dsnpKeys?.keys.length > 0)) { + let builder = importBundleBuilder.withDsnpUserId(dsnpUserId.toString()).withSchemaId(privateFollowSchemaId); + + if (dsnpKeys?.keys?.length > 0) { + builder = builder.withDsnpKeys(dsnpKeys); + } + if (graphKeyPairs?.length > 0) { + builder = builder.withGraphKeyPairs(graphKeyPairsSdk); + } + + importBundles = [builder.build()]; + } else { + importBundles = [publicFollows, privateFollows, privateFriendships].flatMap((pageResponses: PaginatedStorageResponse[]) => + pageResponses.map((pageResponse) => { + let builder = importBundleBuilder + .withDsnpUserId(pageResponse.msa_id.toString()) + .withSchemaId(pageResponse.schema_id.toNumber()) + .withPageData(pageResponse.page_id.toNumber(), pageResponse.payload, pageResponse.content_hash.toNumber()); + + if (dsnpKeys?.keys?.length > 0) { + builder = builder.withDsnpKeys(dsnpKeys); + } + if (graphKeyPairs?.length > 0) { + builder = builder.withGraphKeyPairs(graphKeyPairsSdk); + } + + return builder.build(); + }), + ); + } + + return importBundles; + } + + async formDsnpKeys(dsnpUserId: MessageSourceId | AnyNumber): Promise { + const publicKeySchemaId = this.getGraphKeySchemaId(); + const publicKeys: ItemizedStoragePageResponse = await this.blockchainService.rpc('statefulStorage', 'getItemizedStorage', dsnpUserId, publicKeySchemaId); + const keyData: KeyData[] = publicKeys.items.toArray().map((publicKey) => ({ + index: publicKey.index.toNumber(), + content: hexToU8a(publicKey.payload.toHex()), + })); + const dsnpKeys: DsnpKeys = { + dsnpUserId: dsnpUserId.toString(), + keysHash: publicKeys.content_hash.toNumber(), + keys: keyData, + }; + return dsnpKeys; + } + public getConnectionsForUserGraph(dsnpUserId: string, schemaId: number, includePending: boolean): DsnpGraphEdge[] { if (this.graphState) { return this.graphState.getConnectionsForUserGraph(dsnpUserId, schemaId, includePending); diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index c29913f5..946600f6 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -23,4 +23,9 @@ export namespace QueueConstants { * Prefix for Redis keys that store webhook endpoints */ export const REDIS_WATCHER_PREFIX = 'graph-service-watcher'; + + /** + * Debouncer cache key + */ + export const DEBOUNCER_CACHE_KEY = 'graph-service-debouncer'; } diff --git a/swagger.yaml b/swagger.yaml index d5a3b77b..418f58ef 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -11,29 +11,25 @@ paths: tags: - graph-service /api/graphs: - get: + put: operationId: ApiController_getGraphs - summary: Fetch graphs for specified dsnpIds and blockNumber - parameters: - - name: dsnpIds - required: true - in: query - schema: - type: array - items: - type: string - - name: blockNumber - required: false - in: query - schema: - type: string + summary: Post a request to fetch graphs for specified dsnpIds and blockNumber + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GraphsQueryParamsDto' responses: '200': description: Graphs retrieved successfully content: application/json: schema: - $ref: '#/components/schemas/UserGraphDto' + type: array + items: + $ref: '#/components/schemas/UserGraphDto' tags: - graph-service /api/update-graph: @@ -91,6 +87,41 @@ components: in: cookie name: SESSION schemas: + GraphKeyPairDto: + type: object + properties: + publicKey: + type: string + privateKey: + type: string + keyType: + type: string + enum: + - X25519 + required: + - publicKey + - privateKey + - keyType + GraphsQueryParamsDto: + type: object + properties: + dsnpIds: + type: array + items: + type: string + privacyType: + type: string + enum: + - private + - public + graphKeyPairs: + type: array + items: + $ref: '#/components/schemas/GraphKeyPairDto' + required: + - dsnpIds + - privacyType + - graphKeyPairs DsnpGraphEdge: type: object properties: @@ -106,7 +137,7 @@ components: properties: dsnpId: type: string - dsnpGraphEdge: + dsnpGraphEdges: type: array items: $ref: '#/components/schemas/DsnpGraphEdge' @@ -138,21 +169,6 @@ components: - privacyType - direction - connectionType - GraphKeyPairDto: - type: object - properties: - publicKey: - type: string - privateKey: - type: string - keyType: - type: string - enum: - - X25519 - required: - - publicKey - - privateKey - - keyType ProviderGraphDto: type: object properties: From ee9516f8cef485d3d95b4ccefa2270c50c5592d9 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Mon, 8 Jan 2024 17:50:30 -0600 Subject: [PATCH 18/53] minor fixes to request processor (#32) --- .../request.processor.service.ts | 55 +++++++++---------- libs/common/src/dtos/provider.graph.dto.ts | 2 - 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index b0ca04ba..95b4070c 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -3,18 +3,15 @@ import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; -import { ImportBundle, ConnectionType, GraphKeyPair, GraphKeyType, ImportBundleBuilder, ConnectAction, DsnpKeys, KeyData } from '@dsnp/graph-sdk'; -import { MessageSourceId, PaginatedStorageResponse, SchemaGrantResponse, ItemizedStoragePageResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; +import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys } from '@dsnp/graph-sdk'; +import { MessageSourceId, SchemaGrantResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { Option, Vec } from '@polkadot/types'; import { AnyNumber } from '@polkadot/types/types'; -import { hexToU8a } from '@polkadot/util'; import { BaseConsumer } from '../BaseConsumer'; import { ConnectionDto, - GraphKeyPairDto, GraphStateManager, GraphUpdateJob, - KeyType, PrivacyType, ProviderGraphUpdateJob, QueueConstants, @@ -57,32 +54,32 @@ export class RequestProcessorService extends BaseConsumer { } else { throw new Error(`Error applying actions: ${e}`); } - const exportedUpdates = this.graphStateManager.exportUserGraphUpdates(dsnpUserId.toString()); - // create a GraphUpdateJob for each exported update - const graphPublisherJobs: GraphUpdateJob[] = exportedUpdates.map((update) => ({ - referenceId: job.data.referenceId, - update, - })); - // add each GraphUpdateJob to the graph publisher queue - graphPublisherJobs.forEach((graphPublisherJob) => { - this.graphChangePublisherQueue.add(`Graph Publisher Job - ${graphPublisherJob.referenceId}`, graphPublisherJob, { - removeOnFail: false, - removeOnComplete: 2000, - }); + } + const exportedUpdates = this.graphStateManager.exportUserGraphUpdates(dsnpUserId.toString()); + this.logger.debug(`Exported ${exportedUpdates.length} updates for user ${dsnpUserId.toString()}`); + // create a GraphUpdateJob for each exported update + const graphPublisherJobs: GraphUpdateJob[] = exportedUpdates.map((update) => ({ + referenceId: job.data.referenceId, + update, + })); + // add each GraphUpdateJob to the graph publisher queue + graphPublisherJobs.forEach((graphPublisherJob) => { + this.graphChangePublisherQueue.add(`Graph Publisher Job - ${graphPublisherJob.referenceId}`, graphPublisherJob, { + removeOnFail: false, + removeOnComplete: 2000, }); - - const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); - if (reImported) { - // eslint-disable-next-line no-await-in-loop - const userGraphExists = this.graphStateManager.graphContainsUser(dsnpUserId.toString()); - if (!userGraphExists) { - throw new Error(`User graph does not exist for ${dsnpUserId.toString()}`); - } - } else { - throw new Error(`Error re-importing bundles for ${dsnpUserId.toString()}`); + }); + + const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + if (reImported) { + this.logger.debug(`Re-imported bundles for ${dsnpUserId.toString()}`); + // eslint-disable-next-line no-await-in-loop + const userGraphExists = this.graphStateManager.graphContainsUser(dsnpUserId.toString()); + if (!userGraphExists) { + throw new Error(`User graph does not exist for ${dsnpUserId.toString()}`); } - - /// TODO send DSNPGraphEdge[] to debounced queue + } else { + throw new Error(`Error re-importing bundles for ${dsnpUserId.toString()}`); } } catch (e) { this.logger.error(e); diff --git a/libs/common/src/dtos/provider.graph.dto.ts b/libs/common/src/dtos/provider.graph.dto.ts index 799cbc77..b99a0ff1 100644 --- a/libs/common/src/dtos/provider.graph.dto.ts +++ b/libs/common/src/dtos/provider.graph.dto.ts @@ -10,8 +10,6 @@ export class ProviderGraphDto { dsnpId: string; @IsNotEmpty() - @IsString() - @ValidateNested({ each: true }) @Type(() => ConnectionDto) connections: { data: ConnectionDto[] }; From a0f42ee82266ae664542d0154973e45dc276a0a0 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 12 Jan 2024 08:24:20 -0600 Subject: [PATCH 19/53] chore: set some basic queue settings to modules (#33) * set some basic queue settings to modules * some queue configs: todo better to create configs at one place * remove graph publish job on success * cleanups --- apps/api/src/api.module.ts | 20 +++++++++++++++++++ apps/api/src/api.service.ts | 2 +- .../graph.monitor.processor.module.ts | 13 +++++++++--- .../graph.monitor.processor.service.ts | 5 ----- .../graph.reconnection.processor.module.ts | 10 ++++++++++ .../graph.reconnection.processor.service.ts | 5 +---- .../request.processor.module.ts | 15 ++++++++++++++ .../request.processor.service.ts | 5 +---- apps/worker/src/worker.module.ts | 20 +++++++++++++++++++ .../services/blockchain-scanner.service.ts | 2 -- 10 files changed, 78 insertions(+), 19 deletions(-) diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index c383252e..e788d6e2 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -71,15 +71,35 @@ import { GraphStateManager, QueueConstants } from '../../../libs/common/src'; BullModule.registerQueue( { name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.RECONNECT_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, ), // Bullboard UI diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 9fa246a2..f237442e 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -51,7 +51,7 @@ export class ApiService implements OnApplicationShutdown { referenceId: this.calculateJobId(request), updateConnection: this.configService.getReconnectionServiceRequired(), }; - const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId, removeOnFail: false, removeOnComplete: false }); // TODO: should come from queue configs + const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId }); this.logger.debug(job); return { referenceId: data.referenceId, diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index 1dcf0771..1e2cc048 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -52,12 +52,19 @@ import { BlockchainService } from '../../../../libs/common/src/blockchain/blockc BullModule.registerQueue( { name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, - }, - { - name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.RECONNECT_REQUEST_QUEUE, diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 3c48a14c..82a3bb93 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -22,7 +22,6 @@ export class GraphNotifierService extends BaseConsumer { constructor( @InjectRedis() private cacheManager: Redis, @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private changeRequestQueue: Queue, - @InjectQueue(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) private publishQueue: Queue, @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectionQueue: Queue, private blockchainService: BlockchainService, private configService: ConfigService, @@ -57,7 +56,6 @@ export class GraphNotifierService extends BaseConsumer { if (errorReport.pause) { this.logger.debug(`Pausing queue ${job.data.referencePublishJob.referenceId}`); await this.changeRequestQueue.pause(); - await this.publishQueue.pause(); await this.reconnectionQueue.pause(); } if (errorReport.retry) { @@ -116,7 +114,6 @@ export class GraphNotifierService extends BaseConsumer { private async removeSuccessJobs(referenceId: string): Promise { this.logger.debug(`Removing success jobs for ${referenceId}`); this.changeRequestQueue.remove(referenceId); - this.publishQueue.remove(referenceId); this.reconnectionQueue.remove(referenceId); } @@ -130,8 +127,6 @@ export class GraphNotifierService extends BaseConsumer { await this.changeRequestQueue.remove(requestReferenceId); await this.changeRequestQueue.add(`Retrying publish job - ${requestReferenceId}`, requestJob.data, { jobId: requestReferenceId, - removeOnFail: false, - removeOnComplete: false, }); } diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts index 3abf964b..b0af20dd 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts @@ -51,9 +51,19 @@ import { GraphReconnectionService } from './graph.reconnection.processor.service BullModule.registerQueue( { name: QueueConstants.RECONNECT_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, ), ], diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index 1492b1f3..0028856a 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -43,10 +43,7 @@ export class GraphReconnectionService extends BaseConsumer { graphKeyPairs, updateConnection: false, }; - this.graphChangeRequestQueuue.add(`Provider Graph Job - ${providerGraphJob.referenceId}`, providerGraphJob, { - removeOnFail: false, - removeOnComplete: false, - }); + this.graphChangeRequestQueuue.add(`Provider Graph Job - ${providerGraphJob.referenceId}`, providerGraphJob); this.logger.debug(`Found ${graphConnections.length} connections for user ${job.data.dsnpId.toString()} from provider ${job.data.providerId.toString()}`); } catch (e) { this.logger.error(`Error getting user graph from provider: ${e}`); diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts index 0f26505a..11091d14 100644 --- a/apps/worker/src/request_processor/request.processor.module.ts +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -51,12 +51,27 @@ import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockch BullModule.registerQueue( { name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.RECONNECT_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, ), ], diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 95b4070c..08e78083 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -64,10 +64,7 @@ export class RequestProcessorService extends BaseConsumer { })); // add each GraphUpdateJob to the graph publisher queue graphPublisherJobs.forEach((graphPublisherJob) => { - this.graphChangePublisherQueue.add(`Graph Publisher Job - ${graphPublisherJob.referenceId}`, graphPublisherJob, { - removeOnFail: false, - removeOnComplete: 2000, - }); + this.graphChangePublisherQueue.add(`Graph Publisher Job - ${graphPublisherJob.referenceId}`, graphPublisherJob); }); const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index b38bd111..23b3232d 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -50,15 +50,35 @@ import { BlockchainScannerService } from '../../../libs/common/src/services/bloc BullModule.registerQueue( { name: QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + attempts: 3, + }, }, { name: QueueConstants.RECONNECT_REQUEST_QUEUE, + defaultJobOptions: { + removeOnComplete: false, + removeOnFail: false, + attempts: 3, + }, }, ), ScheduleModule.forRoot(), diff --git a/libs/common/src/services/blockchain-scanner.service.ts b/libs/common/src/services/blockchain-scanner.service.ts index 295277d1..56ca94a3 100644 --- a/libs/common/src/services/blockchain-scanner.service.ts +++ b/libs/common/src/services/blockchain-scanner.service.ts @@ -89,8 +89,6 @@ export class BlockchainScannerService implements OnApplicationBootstrap { } else { await this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId, - removeOnComplete: false, - removeOnFail: false, }); } }); From 47c9946de8af96fabe317a485da2ae466ac636e9 Mon Sep 17 00:00:00 2001 From: Matthew Orris <1466844+mattheworris@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:30:24 -0700 Subject: [PATCH 20/53] Graph change processor updates (#26) * wip: Basic logic and unit tests for GraphPublisherProcessorService * fix: Add BlockchainModule and NonceService to worker module * fix: Delete graph.publisher.processor.service.spec.ts * fix: translate job payload correctly * feat: Add launch.json configuration for debugging NestJS applications * fix: lint updates; Add send tx logic; Add monitor job logic; add getCurrentCapacityEpoch * feat: Update dependencies and add event handling for low capacity --- .env.dev | 31 +- .vscode/launch.json | 26 + apps/api/src/main.ts | 4 +- .../graph.monitor.processor.service.ts | 2 +- .../graph.publisher.processor.module.ts | 6 +- .../graph.publisher.processor.service.ts | 132 +- apps/worker/src/worker.module.ts | 13 +- docker-compose.dev.yaml | 3 + env.template | 31 +- .../src/blockchain/blockchain.service.ts | 5 + package-lock.json | 7977 +++++++++-------- package.json | 4 +- 12 files changed, 4667 insertions(+), 3567 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.env.dev b/.env.dev index 3db89e45..94a164df 100644 --- a/.env.dev +++ b/.env.dev @@ -11,7 +11,34 @@ GRAPH_ENVIRONMENT_TYPE=Dev # [NOTE]: The following config is only used for Dev environments. # Add the graph environment config in JSON format only used for Dev environments. # Be careful to escape any inner quotes as this is in a .env file. -GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' +GRAPH_ENVIRONMENT_DEV_CONFIG='{ + "sdkMaxStaleFriendshipDays": 100, + "maxPageId": 100, + "dsnpVersions": [ + "1.0" + ], + "maxGraphPageSizeBytes": 100, + "maxKeyPageSizeBytes": 100, + "schemaMap": { + "1": { + "dsnpVersion": "1.0", + "connectionType": "follow", + "privacyType": "public" + }, + "2": { + "dsnpVersion": "1.0", + "connectionType": "follow", + "privacyType": "private" + }, + "3": { + "dsnpVersion": "1.0", + "connectionType": "friendship", + "privacyType": "private" + } + }, + "graphPublicKeySchemaId": 4 +} +' PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" PROVIDER_ID=1 @@ -25,4 +52,4 @@ WEBHOOK_FAILURE_THRESHOLD=3 HEALTH_CHECK_SUCCESS_THRESHOLD=10 WEBHOOK_RETRY_INTERVAL_SECONDS=10 HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 -HEALTH_CHECK_MAX_RETRIES=4 \ No newline at end of file +HEALTH_CHECK_MAX_RETRIES=4 diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..d592e73c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug Worker (NestJS via ts-node)", + "args": ["${workspaceFolder}/apps/worker/src/main.ts"], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}", + }, + { + "type": "node", + "request": "launch", + "name": "Debug Api (NestJS via ts-node)", + "args": ["${workspaceFolder}/apps/api/src/main.ts"], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "sourceMaps": true, + "cwd": "${workspaceRoot}", + }, + ] +} diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 5cc6a304..662e1fc5 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -8,7 +8,9 @@ const logger = new Logger('main'); // Monkey-patch BigInt so that JSON.stringify will work // eslint-disable-next-line -BigInt.prototype['toJSON'] = function () { return this.toString() }; +BigInt.prototype['toJSON'] = function () { + return this.toString(); +}; async function bootstrap() { const app = await NestFactory.create(ApiModule, { diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 82a3bb93..62976a2a 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -75,7 +75,7 @@ export class GraphNotifierService extends BaseConsumer { if (job.data.referencePublishJob.update.type !== 'AddKey') { const graphKeyPairs = requestJob?.data.graphKeyPairs ?? []; const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.referencePublishJob.update.ownerDsnpUserId); - const schemaId: SchemaId = this.blockchainService.api.registry.createType('SchemaId', job.data.referencePublishJob.update.type); + const schemaId: SchemaId = this.blockchainService.api.registry.createType('SchemaId', job.data.referencePublishJob.update.schemaId); const graphEdges = await this.asyncDebouncerService.setGraphForSchemaId(dsnpUserId, schemaId, graphKeyPairs); if (graphEdges.length === 0) { this.logger.debug(`No graph edges found for ${dsnpUserId.toString()}`); diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts index a48e7d64..b6846e53 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts @@ -5,13 +5,15 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants } from '../../../../libs/common/src'; +import { NonceService, QueueConstants } from '../../../../libs/common/src'; import { GraphUpdatePublisherService } from './graph.publisher.processor.service'; @Module({ imports: [ + BlockchainModule, ConfigModule, RedisModule.forRootAsync( { @@ -59,7 +61,7 @@ import { GraphUpdatePublisherService } from './graph.publisher.processor.service }, ), ], - providers: [GraphUpdatePublisherService], + providers: [GraphUpdatePublisherService, NonceService], exports: [BullModule, GraphUpdatePublisherService], }) export class GraphUpdatePublisherModule {} diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index fae5fd7c..0863e5b4 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -1,31 +1,147 @@ import { InjectRedis } from '@liaoliaots/nestjs-redis'; -import { Processor } from '@nestjs/bullmq'; +import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; -import { Job } from 'bullmq'; +import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; +import { Hash } from '@polkadot/types/interfaces'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { SubmittableExtrinsic } from '@polkadot/api-base/types'; +import { ISubmittableResult } from '@polkadot/types/types'; +import { MILLISECONDS_PER_SECOND } from 'time-constants'; +import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants } from '../../../../libs/common/src'; +import { QueueConstants, NonceService } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; import { GraphUpdateJob } from '../../../../libs/common/src/dtos/graph.update.job'; +import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; +import { createKeys } from '../../../../libs/common/src/blockchain/create-keys'; +import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; + +export const SECONDS_PER_BLOCK = 12; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) export class GraphUpdatePublisherService extends BaseConsumer { constructor( @InjectRedis() private cacheManager: Redis, + @InjectQueue(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) private graphChangePublishQueue: Queue, + @InjectQueue(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) private graphChangeNotifyQueue: Queue, private configService: ConfigService, + private blockchainService: BlockchainService, + private nonceService: NonceService, + private emitter: EventEmitter2, ) { super(); } + /** + * Processes a job for graph update. + * @param job - The job to process. + * @returns A promise that resolves when the job is processed. + */ async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); + let statefulStorageTxHash: Hash = {} as Hash; + const lastFinalizedBlockHash = await this.blockchainService.getLatestFinalizedBlockHash(); + const currentCapacityEpoch = await this.blockchainService.getCurrentCapacityEpoch(); + try { + switch (job.data.update.type) { + case 'PersistPage': { + let payloadData: number[] = []; + if (typeof job.data.update.payload === 'object' && 'data' in job.data.update.payload) { + payloadData = Array.from((job.data.update.payload as { data: Uint8Array }).data); + } + const providerKeys = createKeys(this.configService.getProviderAccountSeedPhrase()); + const tx = this.blockchainService.createExtrinsicCall( + { pallet: 'statefulStorage', extrinsic: 'upsertPage' }, + job.data.update.ownerDsnpUserId, + job.data.update.schemaId, + job.data.update.pageId, + job.data.update.prevHash, + payloadData, + ); + statefulStorageTxHash = await this.processSingleBatch(providerKeys, tx); + break; + } + default: + break; + } + + this.logger.debug(`job: ${JSON.stringify(job, null, 2)}`); + + // Add a job to the graph change notify queue + const txMonitorJob: ITxMonitorJob = { + id: job.data.referenceId, + txHash: statefulStorageTxHash, + epoch: currentCapacityEpoch.toString(), + lastFinalizedBlockHash, + referencePublishJob: job.data, + }; + const blockDelay = SECONDS_PER_BLOCK * MILLISECONDS_PER_SECOND; + + this.graphChangeNotifyQueue.add(`Graph Change Notify Job - ${txMonitorJob.id}`, txMonitorJob, { + removeOnFail: false, + removeOnComplete: 2000, + delay: blockDelay, + }); + } catch (error: any) { + // If error message starts with `1010: Invalid Transaction: Inability to pay some fees, e.g. account balance too low` + // then emit an event to pause the queues + if (error.message.startsWith('1010: Invalid Transaction: Inability to pay some fees')) { + this.emitter.emit('lowCapacity'); + } + this.logger.error(error); + throw error; + } + } + + /** + * Processes a single batch by submitting a transaction to the blockchain. + * + * @param providerKeys The key pair used for signing the transaction. + * @param tx The transaction to be submitted. + * @returns The hash of the submitted transaction. + * @throws Error if the transaction hash is undefined or if there is an error processing the batch. + */ + async processSingleBatch(providerKeys: KeyringPair, tx: SubmittableExtrinsic<'rxjs', ISubmittableResult>): Promise { + this.logger.debug(`Submitting tx of size ${tx.length}`); try { - // TODO: add logic to send update to Frequency stateful storage - this.logger.debug(job.asJSON()); - } catch (e) { - this.logger.error(e); - throw e; + const ext = this.blockchainService.createExtrinsic( + { pallet: 'frequencyTxPayment', extrinsic: 'payWithCapacity' }, + { eventPallet: 'frequencyTxPayment', event: 'CapacityPaid' }, + providerKeys, + tx, + ); + const nonce = await this.nonceService.getNextNonce(); + const [txHash, _] = await ext.signAndSend(nonce); + if (!txHash) { + throw new Error('Tx hash is undefined'); + } + this.logger.debug(`Tx hash: ${txHash}`); + return txHash; + } catch (error: any) { + this.logger.error(`Error processing batch: ${error}`); + throw error; } } + + /** + * Handles low capacity by pausing the graph change notify queue. + * @returns A promise that resolves when the queue is paused. + */ + @OnEvent('lowCapacity', { async: true, promisify: true }) + private async handleLowCapacity(): Promise { + this.logger.debug('Pausing graph change notify queue'); + // await this.graphChangePublishQueue.pause(); + } + + /** + * Handles capacity recovered by resuming the graph change notify queue. + * @returns A promise that resolves when the queue is resumed. + */ + @OnEvent('capacityRecovered', { async: true, promisify: true }) + private async handleCapacityRecovered(): Promise { + this.logger.debug('Resuming graph change notify queue'); + // await this.graphChangeNotifyQueue.resume(); + } } diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 23b3232d..fdcb872c 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -12,7 +12,7 @@ import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.pr import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; -import { ProviderWebhookService, QueueConstants, GraphStateManager } from '../../../libs/common/src'; +import { ProviderWebhookService, NonceService, QueueConstants, GraphStateManager } from '../../../libs/common/src'; import { BlockchainScannerService } from '../../../libs/common/src/services/blockchain-scanner.service'; @Module({ @@ -87,6 +87,15 @@ import { BlockchainScannerService } from '../../../libs/common/src/services/bloc GraphUpdatePublisherModule, GraphNotifierModule, ], - providers: [ConfigService, RequestProcessorService, GraphUpdatePublisherService, GraphNotifierService, ProviderWebhookService, BlockchainScannerService, GraphStateManager], + providers: [ + ConfigService, + RequestProcessorService, + GraphUpdatePublisherService, + GraphNotifierService, + ProviderWebhookService, + NonceService, + BlockchainScannerService, + GraphStateManager, + ], }) export class WorkerModule {} diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index eca28b84..63331b67 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -12,6 +12,7 @@ services: frequency: image: frequencychain/instant-seal-node:latest + platform: linux/amd64 ports: - 9944:9944 profiles: ['', 'instant'] @@ -51,6 +52,7 @@ services: build: context: . dockerfile: dev.Dockerfile + platform: linux/amd64 ports: - 3000:3000 env_file: @@ -71,6 +73,7 @@ services: build: context: . dockerfile: dev.Dockerfile + platform: linux/amd64 env_file: - .env.dev environment: diff --git a/env.template b/env.template index 6ef10f2a..9cf95ea9 100644 --- a/env.template +++ b/env.template @@ -11,7 +11,34 @@ GRAPH_ENVIRONMENT_TYPE=Dev # [NOTE]: The following config is only used for Dev environments. # Add the graph environment config in JSON format only used for Dev environments. # Be careful to escape any inner quotes as this is in a .env file. -GRAPH_ENVIRONMENT_DEV_CONFIG='{"sdkMaxStaleFriendshipDays":100,"maxPageId":100,"dsnpVersions":["1.0"],"maxGraphPageSizeBytes":100,"maxKeyPageSizeBytes":100,"schemaMap":{"1":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"public"},"3":{"dsnpVersion":"1.0","connectionType":"follow","privacyType":"private"},"4":{"dsnpVersion":"1.0","connectionType":"friendship","privacyType":"private"}},"graphPublicKeySchemaId":5}' +GRAPH_ENVIRONMENT_DEV_CONFIG='{ + "sdkMaxStaleFriendshipDays": 100, + "maxPageId": 100, + "dsnpVersions": [ + "1.0" + ], + "maxGraphPageSizeBytes": 100, + "maxKeyPageSizeBytes": 100, + "schemaMap": { + "1": { + "dsnpVersion": "1.0", + "connectionType": "follow", + "privacyType": "public" + }, + "2": { + "dsnpVersion": "1.0", + "connectionType": "follow", + "privacyType": "private" + }, + "3": { + "dsnpVersion": "1.0", + "connectionType": "friendship", + "privacyType": "private" + } + }, + "graphPublicKeySchemaId": 4 + } + ' PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" PROVIDER_ID=1 @@ -25,4 +52,4 @@ WEBHOOK_FAILURE_THRESHOLD=3 HEALTH_CHECK_SUCCESS_THRESHOLD=10 WEBHOOK_RETRY_INTERVAL_SECONDS=10 HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 -HEALTH_CHECK_MAX_RETRIES=4 \ No newline at end of file +HEALTH_CHECK_MAX_RETRIES=4 diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts index 94c69baf..de83e639 100644 --- a/libs/common/src/blockchain/blockchain.service.ts +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -127,6 +127,11 @@ export class BlockchainService implements OnApplicationBootstrap, OnApplicationS return schema; } + public async getCurrentCapacityEpoch(): Promise { + const currentEpoch: u32 = await this.query('capacity', 'currentEpoch'); + return typeof currentEpoch === 'number' ? BigInt(currentEpoch) : currentEpoch.toBigInt(); + } + public async getCurrentEpochLength(): Promise { const epochLength: u32 = await this.query('capacity', 'epochLength'); return typeof epochLength === 'number' ? epochLength : epochLength.toNumber(); diff --git a/package-lock.json b/package-lock.json index 89c6a713..14626457 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@bull-board/nestjs": "^5.8.3", "@bull-board/ui": "^5.8.3", "@dsnp/frequency-schemas": "^1.0.2", - "@dsnp/graph-sdk": "^1.0.1", + "@dsnp/graph-sdk": "1.0.1", "@frequency-chain/api-augment": "1.7.0", "@jest/globals": "^29.5.0", "@liaoliaots/nestjs-redis": "^9.0.5", @@ -57,7 +57,7 @@ "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@types/time-constants": "^1.0.0", - "@typescript-eslint/parser": "^5.59.8", + "@typescript-eslint/parser": "^6.18.1", "@typescript-eslint/typescript-estree": "5.59.8", "dotenv": "^16.3.1", "eslint": "^8.42.0", @@ -89,15 +89,17 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -107,18 +109,19 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.0.tgz", - "integrity": "sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.9.tgz", + "integrity": "sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", + "picomatch": "3.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -131,60 +134,32 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@angular-devkit/core/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, "node_modules/@angular-devkit/schematics": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.0.tgz", - "integrity": "sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.9.tgz", + "integrity": "sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==", "dependencies": { - "@angular-devkit/core": "16.2.0", + "@angular-devkit/core": "17.0.9", "jsonc-parser": "3.2.0", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-16.2.0.tgz", - "integrity": "sha512-f3HjrDvSrRMvESogLsqsZXsEg//trIBySCHRXCglPrWLVdBbIRctGOhXqZoclRxXimIKUx14zLsOWzDwZG8+HQ==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.0.9.tgz", + "integrity": "sha512-tznzzB26sy8jVUlV9HhXcbFYZcIIFMAiDMOuyLko2LZFjfoqW+OPvwa1mwAQwvVVSQZVAKvdndFhzwyl/axwFQ==", "dependencies": { - "@angular-devkit/core": "16.2.0", - "@angular-devkit/schematics": "16.2.0", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", "ansi-colors": "4.1.3", - "inquirer": "8.2.4", + "inquirer": "9.2.11", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, @@ -192,42 +167,114 @@ "schematics": "bin/schematics.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics-cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", + "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.18.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -299,31 +346,33 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", + "@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/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -333,23 +382,20 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -358,60 +404,29 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -434,7 +449,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { "@babel/types": "^7.22.5" }, @@ -443,42 +459,46 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "license": "MIT", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@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.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { "@babel/types": "^7.22.5" }, @@ -498,8 +518,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } @@ -513,28 +534,30 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -609,9 +632,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -621,7 +644,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -631,7 +655,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -641,7 +666,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -651,7 +677,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -661,7 +688,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -670,8 +698,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -684,7 +713,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -694,7 +724,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -704,7 +735,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -714,7 +746,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -724,7 +757,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -734,7 +768,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -744,7 +779,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -756,8 +792,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "license": "MIT", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -768,17 +805,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.22.3", - "license": "MIT", - "peer": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -793,19 +819,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@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.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -814,17 +840,18 @@ }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -834,314 +861,108 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, "node_modules/@bull-board/api": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-5.8.3.tgz", - "integrity": "sha512-xiVSXc99WQIhrsXTo/rCVxmV9uphyJA4a6ytBP7RyTGO/+IGTg7zLo2yrnYdv3p8RYw4YzdJ4aY1E+MgP5mj8Q==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-5.13.0.tgz", + "integrity": "sha512-v5wvnGim1pmSK9PR1RYSx1dsCW6sOQYJnpvRgU6HZbVbW/5Z0luUBGpYYxM2Ry98uYKeU999mbS7xjunOkAQDw==", "dependencies": { "redis-info": "^3.0.8" }, "peerDependencies": { - "@bull-board/ui": "5.8.3" + "@bull-board/ui": "5.13.0" } }, "node_modules/@bull-board/express": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-5.8.3.tgz", - "integrity": "sha512-zZicV35gRfnojtx+Ypg02xuk/JSSmfDaMUgGbrXfXKvq1OdQCKPkhIa9uPyHP6a7d/QLHKqzQFgJknqgQVBkxw==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-5.13.0.tgz", + "integrity": "sha512-KWI+nGLkZ1rLsOnjHvR7DdeP371l9Fr7narG0ygn78pybR5vAdcHXWde0Uusmm80JyM0nN1JOiqrhMp3mJH7NA==", "dependencies": { - "@bull-board/api": "5.8.3", - "@bull-board/ui": "5.8.3", - "ejs": "3.1.7", - "express": "4.17.3" + "@bull-board/api": "5.13.0", + "@bull-board/ui": "5.13.0", + "ejs": "^3.1.7", + "express": "^4.17.3" } }, - "node_modules/@bull-board/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "node_modules/@bull-board/nestjs": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-5.13.0.tgz", + "integrity": "sha512-W5mAquKRIvL3voIrfZ5J/zKzPHOo9BmbN+zrBlJTQTB+SOZegK3/7CEQZR0x6FdmXW4Blq8bW/xC8u9e3yy2qA==", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "@nestjs/bull-shared": "^10.0.0" }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bull-board/express/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "@bull-board/api": "^5.13.0", + "@bull-board/express": "^5.13.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.1" } }, - "node_modules/@bull-board/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@bull-board/ui": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-5.13.0.tgz", + "integrity": "sha512-UZ88j0c/G/UI5+F3zh6If9LqgF4kMmvRmTgnNckm8HJbclUdqvrcHBpo/e0HfdCaWGGhI2Gc12hq+AECc6c4Sw==", "dependencies": { - "ms": "2.0.0" + "@bull-board/api": "5.13.0" } }, - "node_modules/@bull-board/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, "engines": { - "node": ">= 0.6" + "node": ">=0.1.90" } }, - "node_modules/@bull-board/express/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" - }, - "node_modules/@bull-board/express/node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">= 0.10.0" + "node": ">=12" } }, - "node_modules/@bull-board/express/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@bull-board/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "node_modules/@dsnp/frequency-schemas": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dsnp/frequency-schemas/-/frequency-schemas-1.1.0.tgz", + "integrity": "sha512-Su7FufZRisQMxpVmVkbXwnnJDqgxAT7mJV3b2lvUDT4FRFZwqlOB5bnUBmrgZGF7Ru8RyrFOmI9K/5R4y2egHA==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "@frequency-chain/api-augment": "^1.10.0", + "@polkadot/api": "^10.7.3", + "json-stringify-pretty-compact": "^4.0.0", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" }, - "engines": { - "node": ">= 0.6" + "optionalDependencies": { + "@dsnp/parquetjs": "^1.3.0" } }, - "node_modules/@bull-board/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/@bull-board/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/@dsnp/frequency-schemas/node_modules/@frequency-chain/api-augment": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.10.0.tgz", + "integrity": "sha512-AnjE4N78YQo1VRHoR0uqwfS0/RS1HBm6HSsoEUt40bZcie1BRP44EQ5/bm/xSg4+F7EQZyn8RRH1yM4SNfdQ3g==", "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bull-board/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/@bull-board/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@bull-board/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bull-board/express/node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@bull-board/express/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/@bull-board/express/node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@bull-board/express/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bull-board/nestjs": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-5.8.3.tgz", - "integrity": "sha512-Jyr9EhHrsv1OsjZlJeInHrTR5u3UVoEYbT2WLRr1YmQmQlqIbjMjH2B7G+E6JKk5jggVEJkLi06gSN8lV9y6uw==", - "dependencies": { - "@nestjs/bull-shared": "^10.0.0" - }, - "peerDependencies": { - "@bull-board/api": "^5.8.3", - "@bull-board/express": "^5.8.3", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" - } - }, - "node_modules/@bull-board/ui": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-5.8.3.tgz", - "integrity": "sha512-pQhmboukRZccs6WaTkRVGPZucL1ND8/+7JdK1pNKa0RVGVkpshH7QaHdfI30DR0h/Jv/VFaenWV1vS3KnvqeHw==", - "dependencies": { - "@bull-board/api": "5.8.3" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@dsnp/frequency-schemas": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@dsnp/frequency-schemas/-/frequency-schemas-1.0.2.tgz", - "integrity": "sha512-+u2Fwv9aYbMn7MI5LbiDn92dWK+YxcJJEwdy6r/wdQwFVz/jZtE5lR56KqPYS2piun/vINMJU+HNZUVYL4zkOg==", - "dependencies": { - "@frequency-chain/api-augment": "0.0.0-45e306", - "@polkadot/api": "^10.7.3", - "json-stringify-pretty-compact": "^4.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.0.4" - }, - "optionalDependencies": { - "@dsnp/parquetjs": "^1.3.0" - } - }, - "node_modules/@dsnp/frequency-schemas/node_modules/@frequency-chain/api-augment": { - "version": "0.0.0-45e306", - "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-0.0.0-45e306.tgz", - "integrity": "sha512-VzZIFwMX8LaY6dJfzsJ6t9WKZ28DzGA4+lEKys0OR6O+CIAV/fVWNb8FaHG9c6It0GmSz2Os0ehvn5p/rgWfug==", - "dependencies": { - "@polkadot/api": "^10.7.3", - "@polkadot/rpc-provider": "^10.7.3", - "@polkadot/types": "^10.7.3" + "@polkadot/api": "^10.9.1", + "@polkadot/rpc-provider": "^10.9.1", + "@polkadot/types": "^10.9.1" } }, "node_modules/@dsnp/graph-sdk": { @@ -1153,9 +974,9 @@ } }, "node_modules/@dsnp/parquetjs": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@dsnp/parquetjs/-/parquetjs-1.3.4.tgz", - "integrity": "sha512-DKRtMi+EZaoF/IUalz0UhSqRJ4P2/SCcL1aTwCJ5ZAgZGKFHKvOUYcCjM2XrMlsykfKcL3IMlJ4EZZONCGmRIQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@dsnp/parquetjs/-/parquetjs-1.4.0.tgz", + "integrity": "sha512-zVRCkXRV/Qg6LZbNcBQrd8Shu+e7zP6iPpwn1M/Wq73SAcBi3Vq9u7pdy6SUw82WJw6N7Q1IenH4wJzLumQ0JA==", "optional": true, "dependencies": { "@types/long": "^4.0.2", @@ -1173,13 +994,14 @@ "xxhash-wasm": "^1.0.2" }, "engines": { - "node": ">=16.15.1" + "node": ">=18.18.2" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1191,21 +1013,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1220,17 +1044,41 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@eslint/js": { - "version": "8.42.0", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@frequency-chain/api-augment": { "version": "1.7.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.7.0.tgz", + "integrity": "sha512-o1G4vepM2a6eTqdBf+5A92/UsCrawc6L9lrPgwYQN4Ev3Pq4xWt2VPy1/OuKkH/E2ZYhI+IAlIOfHtu5O6Dkcw==", "dependencies": { "@polkadot/api": "^10.7.3", "@polkadot/rpc-provider": "^10.7.3", @@ -1239,22 +1087,25 @@ }, "node_modules/@hapi/hoek": { "version": "9.3.0", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dependencies": { "@hapi/hoek": "^9.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1263,8 +1114,9 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1274,9 +1126,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true }, "node_modules/@ioredis/as-callback": { "version": "3.0.0", @@ -1286,11 +1139,102 @@ }, "node_modules/@ioredis/commands": { "version": "1.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1304,14 +1248,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1322,7 +1268,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1333,7 +1280,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { "p-locate": "^4.1.0" }, @@ -1343,7 +1291,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, @@ -1356,7 +1305,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { "p-limit": "^2.2.0" }, @@ -1366,28 +1316,36 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "engines": { "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1395,36 +1353,37 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1441,78 +1400,84 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1520,13 +1485,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1544,44 +1509,44 @@ } } }, - "node_modules/@jest/reporters/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -1589,35 +1554,14 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/source-map/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, "node_modules/@jest/test-result": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1626,13 +1570,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1640,20 +1585,21 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1663,30 +1609,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" - }, - "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, "node_modules/@jest/types": { - "version": "29.5.0", - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1699,7 +1627,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1711,14 +1640,16 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } @@ -1734,24 +1665,28 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "license": "MIT", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", + "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@kessler/tableify": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@kessler/tableify/-/tableify-1.0.2.tgz", + "integrity": "sha512-e4psVV9Fe2eBfS9xK2rzQ9lE5xS4tARm7EJzDb6sVZy3F+EMyHJ67i0NdBVR9BRyQx7YhogMCbB6R1QwXuBxMg==", + "dev": true }, "node_modules/@liaoliaots/nestjs-redis": { "version": "9.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@liaoliaots/nestjs-redis/-/nestjs-redis-9.0.5.tgz", + "integrity": "sha512-nPcGLj0zW4mEsYtQYfWx3o7PmrMjuzFk6+t/g2IRopAeWWUZZ/5nIJ4KTKiz/3DJEUkbX8PZqB+dOhklGF0SVA==", "dependencies": { "tslib": "2.4.1" }, @@ -1764,29 +1699,110 @@ "ioredis": "^5.0.0" } }, - "node_modules/@liaoliaots/nestjs-redis/node_modules/tslib": { - "version": "2.4.1", - "license": "0BSD" + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "engines": { "node": ">=8" } }, - "node_modules/@multiformats/blake2": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@multiformats/blake2/-/blake2-1.0.13.tgz", - "integrity": "sha512-T1Kzya0wjj85CaVeRSpJ858EnSvW1pw94GSitxYf84VsNdv5XYbJ6QG8y26Ft1bVALzrUCmqkQrR53QHSyu6RA==", - "dependencies": { - "blakejs": "^1.1.1", - "multiformats": "^9.5.4" - } - }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", + "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", + "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", + "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", + "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", + "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", + "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@multiformats/blake2": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@multiformats/blake2/-/blake2-1.0.13.tgz", + "integrity": "sha512-T1Kzya0wjj85CaVeRSpJ858EnSvW1pw94GSitxYf84VsNdv5XYbJ6QG8y26Ft1bVALzrUCmqkQrR53QHSyu6RA==", + "dependencies": { + "blakejs": "^1.1.1", + "multiformats": "^9.5.4" + } + }, "node_modules/@nestjs/axios": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-2.0.0.tgz", + "integrity": "sha512-F6oceoQLEn031uun8NiommeMkRIojQqVryxQy/mK7fx0CI0KbgkJL3SloCQcsOD+agoEnqKJKXZpEvL6FNswJg==", "peerDependencies": { "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", "axios": "^1.3.1", @@ -1795,62 +1811,74 @@ } }, "node_modules/@nestjs/bull-shared": { - "version": "10.0.0", - "license": "MIT", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-10.0.1.tgz", + "integrity": "sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==", "dependencies": { - "tslib": "2.5.3" + "tslib": "2.6.0" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" } }, + "node_modules/@nestjs/bull-shared/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, "node_modules/@nestjs/bullmq": { - "version": "10.0.0", - "license": "MIT", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/bullmq/-/bullmq-10.0.1.tgz", + "integrity": "sha512-YJtfJXfnQinN7OvGx/Qd6jlQFu56zVnI1SppftSS7gkthB2CbJQAjkrfCEPDjp11wbPptBhUnatIL2N+nH/3kA==", "dependencies": { - "@nestjs/bull-shared": "^10.0.0", - "tslib": "2.5.3" + "@nestjs/bull-shared": "^10.0.1", + "tslib": "2.6.0" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", - "bullmq": "^3.0.0" + "bullmq": "^3.0.0 || ^4.0.0" } }, + "node_modules/@nestjs/bullmq/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, "node_modules/@nestjs/cli": { - "version": "10.1.14", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.1.14.tgz", - "integrity": "sha512-oxfoebzrq6g+MKc6FRx2O8D86Vk0ViEmlP4B1E3dzwC3X5yjxlA1IDulLrVz3VIpGjuyuXmrQjjd8l0NUVZiKg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.3.0.tgz", + "integrity": "sha512-37h+wSDItY0NE/x3a/M9yb2cXzfsD4qoE26rHgFn592XXLelDN12wdnfn7dTIaiRZT7WOCdQ+BYP9mQikR4AsA==", "dependencies": { - "@angular-devkit/core": "16.2.0", - "@angular-devkit/schematics": "16.2.0", - "@angular-devkit/schematics-cli": "16.2.0", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", + "@angular-devkit/schematics-cli": "17.0.9", "@nestjs/schematics": "^10.0.1", "chalk": "4.1.2", "chokidar": "3.5.3", "cli-table3": "0.6.3", "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "8.0.0", + "fork-ts-checker-webpack-plugin": "9.0.2", + "glob": "10.3.10", "inquirer": "8.2.6", "node-emoji": "1.11.0", "ora": "5.4.1", - "os-name": "4.0.1", "rimraf": "4.4.1", "shelljs": "0.8.5", "source-map-support": "0.5.21", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", - "typescript": "5.1.6", - "webpack": "5.88.2", + "typescript": "5.3.3", + "webpack": "5.89.0", "webpack-node-externals": "3.0.0" }, "bin": { "nest": "bin/nest.js" }, "engines": { - "node": ">= 16" + "node": ">= 16.14" }, "peerDependencies": { "@swc/cli": "^0.1.62", @@ -1865,65 +1893,10 @@ } } }, - "node_modules/@nestjs/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@nestjs/cli/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@nestjs/cli/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@nestjs/cli/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@nestjs/common": { "version": "9.4.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.4.3.tgz", + "integrity": "sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==", "dependencies": { "iterare": "1.2.1", "tslib": "2.5.3", @@ -1952,9 +1925,15 @@ } } }, + "node_modules/@nestjs/common/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, "node_modules/@nestjs/config": { - "version": "2.3.3", - "license": "MIT", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.4.tgz", + "integrity": "sha512-IGdSF+0F9MJO6dCRTEahdxPz4iVijjtolcFBxnY+2QYM3bXYQvAgzskGZi+WkAFJN/VzR3TEp60gN5sI74GxPA==", "dependencies": { "dotenv": "16.1.4", "dotenv-expand": "10.0.0", @@ -1969,7 +1948,8 @@ }, "node_modules/@nestjs/config/node_modules/dotenv": { "version": "16.1.4", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", "engines": { "node": ">=12" }, @@ -1979,8 +1959,9 @@ }, "node_modules/@nestjs/core": { "version": "9.4.3", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.4.3.tgz", + "integrity": "sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", @@ -2013,9 +1994,15 @@ } } }, + "node_modules/@nestjs/core/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, "node_modules/@nestjs/event-emitter": { "version": "1.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-1.4.2.tgz", + "integrity": "sha512-5mskPMS4KVH6LghC+NynfdmGiMCOOv9CdgVpuWGipLrJECv5KWc7vaW5o/9BYrcqPkN7Ted6CJ+O4AfsTiRlgw==", "dependencies": { "eventemitter2": "6.4.9" }, @@ -2026,9 +2013,9 @@ } }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", - "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.4.tgz", + "integrity": "sha512-xl+gUSp0B+ln1VSNoUftlglk8dfpUes3DHGxKZ5knuBxS5g2H/8p9/DSBOYWUfO5f4u9s6ffBPZ71WO+tbe5SA==", "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "class-transformer": "^0.4.0 || ^0.5.0", @@ -2046,7 +2033,8 @@ }, "node_modules/@nestjs/platform-express": { "version": "9.4.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.4.3.tgz", + "integrity": "sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==", "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", @@ -2063,13 +2051,18 @@ "@nestjs/core": "^9.0.0" } }, + "node_modules/@nestjs/platform-express/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, "node_modules/@nestjs/schedule": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-3.0.3.tgz", - "integrity": "sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-3.0.4.tgz", + "integrity": "sha512-uFJpuZsXfpvgx2y7/KrIZW9e1L68TLiwRodZ6+Gc8xqQiHSUzAVn+9F4YMxWFlHITZvvkjWziUFgRNCitDcTZQ==", "dependencies": { - "cron": "2.4.1", - "uuid": "9.0.0" + "cron": "2.4.3", + "uuid": "9.0.1" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", @@ -2077,13 +2070,25 @@ "reflect-metadata": "^0.1.12" } }, + "node_modules/@nestjs/schedule/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@nestjs/schematics": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.0.2.tgz", - "integrity": "sha512-DaZZjymYoIfRqC5W62lnYXIIods1PDY6CGc8+IpRwyinzffjKxZ3DF3exu+mdyvllzkXo9DTXkoX4zOPSJHCkw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.0.tgz", + "integrity": "sha512-HQWvD3F7O0Sv3qHS2jineWxPLmBTLlyjT6VdSw2EAIXulitmV+ErxB3TCVQQORlNkl5p5cwRYWyBaOblDbNFIQ==", "dependencies": { - "@angular-devkit/core": "16.1.8", - "@angular-devkit/schematics": "16.1.8", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", "comment-json": "4.2.3", "jsonc-parser": "3.2.0", "pluralize": "8.0.0" @@ -2092,97 +2097,16 @@ "typescript": ">=4.8.2" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.8.tgz", - "integrity": "sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==", - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.8.tgz", - "integrity": "sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==", - "dependencies": { - "@angular-devkit/core": "16.1.8", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@nestjs/schematics/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@nestjs/schematics/node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nestjs/schematics/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, "node_modules/@nestjs/swagger": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.8.tgz", - "integrity": "sha512-Jpl3laGAqvyWccc3auLU0mMjl5hJ2kqzzDb63ynJi5NMbFlgBwrR8FCGBVstSsqL9YSJWLR4L1BZzVmVExcY+g==", + "version": "7.1.17", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.17.tgz", + "integrity": "sha512-ASCxBrvMEN2o/8vEEmrIPMNzrr/hVi7QIR4y1oNYvoBNXHuwoF1VSI3+4Rq/3xmwVnVveJxHlBIs2u5xY9VgGQ==", "dependencies": { - "@nestjs/mapped-types": "2.0.2", + "@nestjs/mapped-types": "2.0.4", "js-yaml": "4.1.0", "lodash": "4.17.21", "path-to-regexp": "3.2.0", - "swagger-ui-dist": "5.3.1" + "swagger-ui-dist": "5.10.3" }, "peerDependencies": { "@fastify/static": "^6.0.0", @@ -2206,7 +2130,8 @@ }, "node_modules/@nestjs/testing": { "version": "9.4.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.4.3.tgz", + "integrity": "sha512-LDT8Ai2eKnTzvnPaJwWOK03qTaFap5uHHsJCv6dL0uKWk6hyF9jms8DjyVaGsaujCaXDG8izl1mDEER0OmxaZA==", "dependencies": { "tslib": "2.5.3" }, @@ -2229,9 +2154,15 @@ } } }, + "node_modules/@nestjs/testing/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, "node_modules/@nestjs/typeorm": { "version": "9.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", + "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", "dependencies": { "uuid": "8.3.2" }, @@ -2245,24 +2176,27 @@ }, "node_modules/@nestjs/typeorm/node_modules/uuid": { "version": "8.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@noble/curves": { - "version": "1.1.0", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.3" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.1", - "license": "MIT", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", "engines": { "node": ">= 16" }, @@ -2272,8 +2206,9 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2284,16 +2219,18 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2304,7 +2241,8 @@ }, "node_modules/@nuxtjs/opencollective": { "version": "0.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", "dependencies": { "chalk": "^4.1.0", "consola": "^2.15.0", @@ -2318,36 +2256,20 @@ "npm": ">=5.0.0" } }, - "node_modules/@nuxtjs/opencollective/node_modules/node-fetch": { - "version": "2.6.11", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">=14" } }, - "node_modules/@pkgr/utils": { - "version": "2.4.1", + "node_modules/@pkgr/core": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", + "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.2.12", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.5.0" - }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -2356,165 +2278,220 @@ } }, "node_modules/@polkadot/api": { - "version": "10.9.1", - "license": "Apache-2.0", - "dependencies": { - "@polkadot/api-augment": "10.9.1", - "@polkadot/api-base": "10.9.1", - "@polkadot/api-derive": "10.9.1", - "@polkadot/keyring": "^12.3.1", - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/rpc-core": "10.9.1", - "@polkadot/rpc-provider": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-augment": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/types-create": "10.9.1", - "@polkadot/types-known": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.11.2.tgz", + "integrity": "sha512-AorCZxCWCoTtdbl4DPUZh+ACe/pbLIS1BkdQY0AFJuZllm0x/yWzjgampcPd5jQAA/O3iKShRBkZqj6Mk9yG/A==", + "dependencies": { + "@polkadot/api-augment": "10.11.2", + "@polkadot/api-base": "10.11.2", + "@polkadot/api-derive": "10.11.2", + "@polkadot/keyring": "^12.6.2", + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/rpc-provider": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/types-known": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", "eventemitter3": "^5.0.1", "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@polkadot/api-augment": { - "version": "10.9.1", - "license": "Apache-2.0", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.11.2.tgz", + "integrity": "sha512-PTpnqpezc75qBqUtgrc0GYB8h9UHjfbHSRZamAbecIVAJ2/zc6CqtnldeaBlIu1IKTgBzi3FFtTyYu+ZGbNT2Q==", "dependencies": { - "@polkadot/api-base": "10.9.1", - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-augment": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" + "@polkadot/api-base": "10.11.2", + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@polkadot/api-augment/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/api-base": { - "version": "10.9.1", - "license": "Apache-2.0", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.11.2.tgz", + "integrity": "sha512-4LIjaUfO9nOzilxo7XqzYKCNMtmUypdk8oHPdrRnSjKEsnK7vDsNi+979z2KXNXd2KFSCFHENmI523fYnMnReg==", "dependencies": { - "@polkadot/rpc-core": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/util": "^12.3.1", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/util": "^12.6.2", "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@polkadot/api-base/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/api-derive": { - "version": "10.9.1", - "license": "Apache-2.0", - "dependencies": { - "@polkadot/api": "10.9.1", - "@polkadot/api-augment": "10.9.1", - "@polkadot/api-base": "10.9.1", - "@polkadot/rpc-core": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.11.2.tgz", + "integrity": "sha512-m3BQbPionkd1iSlknddxnL2hDtolPIsT+aRyrtn4zgMRPoLjHFmTmovvg8RaUyYofJtZeYrnjMw0mdxiSXx7eA==", + "dependencies": { + "@polkadot/api": "10.11.2", + "@polkadot/api-augment": "10.11.2", + "@polkadot/api-base": "10.11.2", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@polkadot/api-derive/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/api/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/keyring": { - "version": "12.3.2", - "license": "Apache-2.0", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.6.2.tgz", + "integrity": "sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw==", "dependencies": { - "@polkadot/util": "12.3.2", - "@polkadot/util-crypto": "12.3.2", - "tslib": "^2.5.3" + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "12.3.2", - "@polkadot/util-crypto": "12.3.2" + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2" } }, + "node_modules/@polkadot/keyring/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/networks": { - "version": "12.3.2", - "license": "Apache-2.0", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.6.2.tgz", + "integrity": "sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==", "dependencies": { - "@polkadot/util": "12.3.2", - "@substrate/ss58-registry": "^1.40.0", - "tslib": "^2.5.3" + "@polkadot/util": "12.6.2", + "@substrate/ss58-registry": "^1.44.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@polkadot/networks/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/rpc-augment": { - "version": "10.9.1", - "license": "Apache-2.0", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.11.2.tgz", + "integrity": "sha512-9AhT0WW81/8jYbRcAC6PRmuxXqNhJje8OYiulBQHbG1DTCcjAfz+6VQBke9BwTStzPq7d526+yyBKD17O3zlAA==", "dependencies": { - "@polkadot/rpc-core": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@polkadot/rpc-augment/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/rpc-core": { - "version": "10.9.1", - "license": "Apache-2.0", - "dependencies": { - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/rpc-provider": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/util": "^12.3.1", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.11.2.tgz", + "integrity": "sha512-Ot0CFLWx8sZhLZog20WDuniPA01Bk2StNDsdAQgcFKPwZw6ShPaZQCHuKLQK6I6DodOrem9FXX7c1hvoKJP5Ww==", + "dependencies": { + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/rpc-provider": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/util": "^12.6.2", "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, + "node_modules/@polkadot/rpc-core/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/rpc-provider": { - "version": "10.9.1", - "license": "Apache-2.0", - "dependencies": { - "@polkadot/keyring": "^12.3.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-support": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", - "@polkadot/x-fetch": "^12.3.1", - "@polkadot/x-global": "^12.3.1", - "@polkadot/x-ws": "^12.3.1", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.11.2.tgz", + "integrity": "sha512-he5jWMpDJp7e+vUzTZDzpkB7ps3H8psRally+/ZvZZScPvFEjfczT7I1WWY9h58s8+ImeVP/lkXjL9h/gUOt3Q==", + "dependencies": { + "@polkadot/keyring": "^12.6.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-support": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "@polkadot/x-fetch": "^12.6.2", + "@polkadot/x-global": "^12.6.2", + "@polkadot/x-ws": "^12.6.2", "eventemitter3": "^5.0.1", - "mock-socket": "^9.2.1", - "nock": "^13.3.1", - "tslib": "^2.5.3" + "mock-socket": "^9.3.1", + "nock": "^13.4.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { - "@substrate/connect": "0.7.26" + "@substrate/connect": "0.7.35" } }, + "node_modules/@polkadot/rpc-provider/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/typegen": { "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/typegen/-/typegen-10.9.1.tgz", + "integrity": "sha512-SbG9U8/POyY8QwQUp70qzTnYsRxc6Rrjt4wzIWsBKmzVRy0i19O23EXSUo+81ukOBiLZj551GAJwRa3YBpdR+A==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@polkadot/api": "10.9.1", "@polkadot/api-augment": "10.9.1", @@ -2543,16 +2520,27 @@ "node": ">=16" } }, - "node_modules/@polkadot/types": { + "node_modules/@polkadot/typegen/node_modules/@polkadot/api": { "version": "10.9.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.9.1.tgz", + "integrity": "sha512-ND/2UqZBWvtt4PfV03OStTKg0mxmPk4UpMAgJKutdgsz/wP9CYJ1KbjwFgPNekL9JnzbKQsWyQNPVrcw7kQk8A==", + "dev": true, "dependencies": { + "@polkadot/api-augment": "10.9.1", + "@polkadot/api-base": "10.9.1", + "@polkadot/api-derive": "10.9.1", "@polkadot/keyring": "^12.3.1", + "@polkadot/rpc-augment": "10.9.1", + "@polkadot/rpc-core": "10.9.1", + "@polkadot/rpc-provider": "10.9.1", + "@polkadot/types": "10.9.1", "@polkadot/types-augment": "10.9.1", "@polkadot/types-codec": "10.9.1", "@polkadot/types-create": "10.9.1", + "@polkadot/types-known": "10.9.1", "@polkadot/util": "^12.3.1", "@polkadot/util-crypto": "^12.3.1", + "eventemitter3": "^5.0.1", "rxjs": "^7.8.1", "tslib": "^2.5.3" }, @@ -2560,11 +2548,16 @@ "node": ">=16" } }, - "node_modules/@polkadot/types-augment": { + "node_modules/@polkadot/typegen/node_modules/@polkadot/api-augment": { "version": "10.9.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.9.1.tgz", + "integrity": "sha512-kRZZvCFVcN4hAH4dJ+Qzfdy27/4EEq3oLDf3ihj0LTVrAezSWcKPGE3EVFy+Mn6Lo4SUc7RVyoKvIUhSk2l4Dg==", + "dev": true, "dependencies": { + "@polkadot/api-base": "10.9.1", + "@polkadot/rpc-augment": "10.9.1", "@polkadot/types": "10.9.1", + "@polkadot/types-augment": "10.9.1", "@polkadot/types-codec": "10.9.1", "@polkadot/util": "^12.3.1", "tslib": "^2.5.3" @@ -2573,33 +2566,51 @@ "node": ">=16" } }, - "node_modules/@polkadot/types-codec": { + "node_modules/@polkadot/typegen/node_modules/@polkadot/api-base": { "version": "10.9.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.9.1.tgz", + "integrity": "sha512-Q3m2KzlceMK2kX8bhnUZWk3RT6emmijeeFZZQgCePpEcrSeNjnqG4qjuTPgkveaOkUT8MAoDc5Avuzcc2jlW9g==", + "dev": true, "dependencies": { + "@polkadot/rpc-core": "10.9.1", + "@polkadot/types": "10.9.1", "@polkadot/util": "^12.3.1", - "@polkadot/x-bigint": "^12.3.1", + "rxjs": "^7.8.1", "tslib": "^2.5.3" }, "engines": { "node": ">=16" } }, - "node_modules/@polkadot/types-codec/node_modules/@polkadot/x-bigint": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/typegen/node_modules/@polkadot/api-derive": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.9.1.tgz", + "integrity": "sha512-mRud1UZCFIc4Z63qAoGSIHh/foyUYADfy1RQYCmPpeFKfIdCIrHpd7xFdJXTOMYOS0BwlM6u4qli/ZT4XigezQ==", + "dev": true, "dependencies": { - "@polkadot/x-global": "12.3.2", + "@polkadot/api": "10.9.1", + "@polkadot/api-augment": "10.9.1", + "@polkadot/api-base": "10.9.1", + "@polkadot/rpc-core": "10.9.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "rxjs": "^7.8.1", "tslib": "^2.5.3" }, "engines": { "node": ">=16" } }, - "node_modules/@polkadot/types-create": { + "node_modules/@polkadot/typegen/node_modules/@polkadot/rpc-augment": { "version": "10.9.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.9.1.tgz", + "integrity": "sha512-MaLHkNlyqN20ZRYr6uNd1BZr1OsrnX9qLAmsl0mcrri1vPGRH6VHjfFH1RBLkikpWD82v17g0l2hLwdV1ZHMcw==", + "dev": true, "dependencies": { + "@polkadot/rpc-core": "10.9.1", + "@polkadot/types": "10.9.1", "@polkadot/types-codec": "10.9.1", "@polkadot/util": "^12.3.1", "tslib": "^2.5.3" @@ -2608,25 +2619,76 @@ "node": ">=16" } }, - "node_modules/@polkadot/types-known": { + "node_modules/@polkadot/typegen/node_modules/@polkadot/rpc-core": { "version": "10.9.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.9.1.tgz", + "integrity": "sha512-ZtA8B8SfXSAwVkBlCcKRHw0eSM7ec/sbiNOM5GasXPeRujUgT7lOwSH2GbUZSqe9RfRDMp6DvO9c2JoGc3LLWw==", + "dev": true, "dependencies": { - "@polkadot/networks": "^12.3.1", + "@polkadot/rpc-augment": "10.9.1", + "@polkadot/rpc-provider": "10.9.1", "@polkadot/types": "10.9.1", + "@polkadot/util": "^12.3.1", + "rxjs": "^7.8.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@polkadot/typegen/node_modules/@polkadot/rpc-provider": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.9.1.tgz", + "integrity": "sha512-4QzT2QzD+320+eT6b79sGAA85Tt3Bb8fQvse4r5Mom2iiBd2SO81vOhxSAOaIe4GUsw25VzFJmsbe7+OObItdg==", + "dev": true, + "dependencies": { + "@polkadot/keyring": "^12.3.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-support": "10.9.1", + "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "@polkadot/x-fetch": "^12.3.1", + "@polkadot/x-global": "^12.3.1", + "@polkadot/x-ws": "^12.3.1", + "eventemitter3": "^5.0.1", + "mock-socket": "^9.2.1", + "nock": "^13.3.1", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@substrate/connect": "0.7.26" + } + }, + "node_modules/@polkadot/typegen/node_modules/@polkadot/types": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.9.1.tgz", + "integrity": "sha512-AG33i2ZGGfq7u+5rkAdGrXAQHHl844/Yv+junH5ZzX69xiCoWO1bH/yzDUNBdpki2GlACWvF9nLYh3F2tVF93w==", + "dev": true, + "dependencies": { + "@polkadot/keyring": "^12.3.1", + "@polkadot/types-augment": "10.9.1", "@polkadot/types-codec": "10.9.1", "@polkadot/types-create": "10.9.1", "@polkadot/util": "^12.3.1", + "@polkadot/util-crypto": "^12.3.1", + "rxjs": "^7.8.1", "tslib": "^2.5.3" }, "engines": { "node": ">=16" } }, - "node_modules/@polkadot/types-support": { + "node_modules/@polkadot/typegen/node_modules/@polkadot/types-augment": { "version": "10.9.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.9.1.tgz", + "integrity": "sha512-OY9/jTMFRFqYdkUnfcGwqMLC64A0Q25bjvCuVQCVjsPFKE3wl0Kt5rNT01eV2UmLXrR6fY0xWbR2w80bLA7CIQ==", + "dev": true, "dependencies": { + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", "@polkadot/util": "^12.3.1", "tslib": "^2.5.3" }, @@ -2634,321 +2696,578 @@ "node": ">=16" } }, - "node_modules/@polkadot/util": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/typegen/node_modules/@polkadot/types-codec": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.9.1.tgz", + "integrity": "sha512-mJ5OegKGraY1FLvEa8FopRCr3pQrhDkcn5RNOjmgJQozENVeRaxhk0NwxYz7IojFvSDnKnc6lNQfKaaSe5pLHg==", + "dev": true, "dependencies": { - "@polkadot/x-bigint": "12.3.2", - "@polkadot/x-global": "12.3.2", - "@polkadot/x-textdecoder": "12.3.2", - "@polkadot/x-textencoder": "12.3.2", - "@types/bn.js": "^5.1.1", - "bn.js": "^5.2.1", + "@polkadot/util": "^12.3.1", + "@polkadot/x-bigint": "^12.3.1", "tslib": "^2.5.3" }, "engines": { "node": ">=16" } }, - "node_modules/@polkadot/util-crypto": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/typegen/node_modules/@polkadot/types-create": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.9.1.tgz", + "integrity": "sha512-OVz50MGTTuiuVnRP/zAx4CTuLioc0hsiwNwqN2lNhmIJGtnQ4Vy/7mQRsIWehiYz6g0Vzzm5B3qWkTXO1NSN5w==", + "dev": true, "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@polkadot/networks": "12.3.2", - "@polkadot/util": "12.3.2", - "@polkadot/wasm-crypto": "^7.2.1", - "@polkadot/wasm-util": "^7.2.1", - "@polkadot/x-bigint": "12.3.2", - "@polkadot/x-randomvalues": "12.3.2", - "@scure/base": "1.1.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/util": "^12.3.1", "tslib": "^2.5.3" }, "engines": { "node": ">=16" + } + }, + "node_modules/@polkadot/typegen/node_modules/@polkadot/types-known": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.9.1.tgz", + "integrity": "sha512-zCMVWc4pJtkbMFPu72bD4IhvV/gkHXPX3C5uu92WdmCfnn0vEIEsMKWlVXVVvQQZKAqvs/awpqIfrUtEViOGEA==", + "dev": true, + "dependencies": { + "@polkadot/networks": "^12.3.1", + "@polkadot/types": "10.9.1", + "@polkadot/types-codec": "10.9.1", + "@polkadot/types-create": "10.9.1", + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" }, - "peerDependencies": { - "@polkadot/util": "12.3.2" + "engines": { + "node": ">=16" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/wasm-bridge": { - "version": "7.2.1", - "license": "Apache-2.0", + "node_modules/@polkadot/typegen/node_modules/@polkadot/types-support": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.9.1.tgz", + "integrity": "sha512-XsieuLDsszvMZQlleacQBfx07i/JkwQV/UxH9q8Hz7Okmaz9pEVEW1h3ka2/cPuC7a4l32JhaORBUYshBZNdJg==", + "dev": true, "dependencies": { - "@polkadot/wasm-util": "7.2.1", - "tslib": "^2.5.0" + "@polkadot/util": "^12.3.1", + "tslib": "^2.5.3" }, "engines": { "node": ">=16" + } + }, + "node_modules/@polkadot/typegen/node_modules/@substrate/connect": { + "version": "0.7.26", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.26.tgz", + "integrity": "sha512-uuGSiroGuKWj1+38n1kY5HReer5iL9bRwPCzuoLtqAOmI1fGI0hsSI2LlNQMAbfRgr7VRHXOk5MTuQf5ulsFRw==", + "dev": true, + "optional": true, + "dependencies": { + "@substrate/connect-extension-protocol": "^1.0.1", + "eventemitter3": "^4.0.7", + "smoldot": "1.0.4" + } + }, + "node_modules/@polkadot/typegen/node_modules/@substrate/connect/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "optional": true + }, + "node_modules/@polkadot/typegen/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true, + "optional": true + }, + "node_modules/@polkadot/typegen/node_modules/smoldot": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-1.0.4.tgz", + "integrity": "sha512-N3TazI1C4GGrseFH/piWyZCCCRJTRx2QhDfrUKRT4SzILlW5m8ayZ3QTKICcz1C/536T9cbHHJyP7afxI6Mi1A==", + "dev": true, + "optional": true, + "dependencies": { + "pako": "^2.0.4", + "ws": "^8.8.1" + } + }, + "node_modules/@polkadot/typegen/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@polkadot/types": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.11.2.tgz", + "integrity": "sha512-d52j3xXni+C8GdYZVTSfu8ROAnzXFMlyRvXtor0PudUc8UQHOaC4+mYAkTBGA2gKdmL8MHSfRSbhcxHhsikY6Q==", + "dependencies": { + "@polkadot/keyring": "^12.6.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@polkadot/util": "*", - "@polkadot/x-randomvalues": "*" + "engines": { + "node": ">=18" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/wasm-crypto": { - "version": "7.2.1", - "license": "Apache-2.0", + "node_modules/@polkadot/types-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.11.2.tgz", + "integrity": "sha512-8eB8ew04wZiE5GnmFvEFW1euJWmF62SGxb1O+8wL3zoUtB9Xgo1vB6w6xbTrd+HLV6jNSeXXnbbF1BEUvi9cNg==", "dependencies": { - "@polkadot/wasm-bridge": "7.2.1", - "@polkadot/wasm-crypto-asmjs": "7.2.1", - "@polkadot/wasm-crypto-init": "7.2.1", - "@polkadot/wasm-crypto-wasm": "7.2.1", - "@polkadot/wasm-util": "7.2.1", - "tslib": "^2.5.0" + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" + } + }, + "node_modules/@polkadot/types-augment/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/types-codec": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.11.2.tgz", + "integrity": "sha512-3xjOQL+LOOMzYqlgP9ROL0FQnzU8lGflgYewzau7AsDlFziSEtb49a9BpYo6zil4koC+QB8zQ9OHGFumG08T8w==", + "dependencies": { + "@polkadot/util": "^12.6.2", + "@polkadot/x-bigint": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-codec/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/types-create": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.11.2.tgz", + "integrity": "sha512-SJt23NxYvefRxVZZm6mT9ed1pR6FDoIGQ3xUpbjhTLfU2wuhpKjekMVorYQ6z/gK2JLMu2kV92Ardsz+6GX5XQ==", + "dependencies": { + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-create/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/types-known": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.11.2.tgz", + "integrity": "sha512-kbEIX7NUQFxpDB0FFGNyXX/odY7jbp56RGD+Z4A731fW2xh/DgAQrI994xTzuh0c0EqPE26oQm3kATSpseqo9w==", + "dependencies": { + "@polkadot/networks": "^12.6.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-known/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/types-support": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.11.2.tgz", + "integrity": "sha512-X11hoykFYv/3efg4coZy2hUOUc97JhjQMJLzDhHniFwGLlYU8MeLnPdCVGkXx0xDDjTo4/ptS1XpZ5HYcg+gRw==", + "dependencies": { + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-support/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/util": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.6.2.tgz", + "integrity": "sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==", + "dependencies": { + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-global": "12.6.2", + "@polkadot/x-textdecoder": "12.6.2", + "@polkadot/x-textencoder": "12.6.2", + "@types/bn.js": "^5.1.5", + "bn.js": "^5.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/util-crypto": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz", + "integrity": "sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==", + "dependencies": { + "@noble/curves": "^1.3.0", + "@noble/hashes": "^1.3.3", + "@polkadot/networks": "12.6.2", + "@polkadot/util": "12.6.2", + "@polkadot/wasm-crypto": "^7.3.2", + "@polkadot/wasm-util": "^7.3.2", + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-randomvalues": "12.6.2", + "@scure/base": "^1.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "*", - "@polkadot/x-randomvalues": "*" + "@polkadot/util": "12.6.2" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/wasm-crypto-init": { - "version": "7.2.1", - "license": "Apache-2.0", + "node_modules/@polkadot/util-crypto/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/util/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/wasm-bridge": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz", + "integrity": "sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==", "dependencies": { - "@polkadot/wasm-bridge": "7.2.1", - "@polkadot/wasm-crypto-asmjs": "7.2.1", - "@polkadot/wasm-crypto-wasm": "7.2.1", - "@polkadot/wasm-util": "7.2.1", - "tslib": "^2.5.0" + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { "@polkadot/util": "*", "@polkadot/x-randomvalues": "*" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-bigint": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/wasm-bridge/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/wasm-crypto": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz", + "integrity": "sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "tslib": "^2.5.3" + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-init": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, - "node_modules/@polkadot/util/node_modules/@polkadot/x-bigint": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz", + "integrity": "sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "tslib": "^2.5.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" } }, - "node_modules/@polkadot/wasm-crypto-asmjs": { - "version": "7.2.1", - "license": "Apache-2.0", + "node_modules/@polkadot/wasm-crypto-asmjs/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/wasm-crypto-init": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz", + "integrity": "sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==", "dependencies": { - "tslib": "^2.5.0" + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "*" + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, + "node_modules/@polkadot/wasm-crypto-init/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/wasm-crypto-wasm": { - "version": "7.2.1", - "license": "Apache-2.0", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz", + "integrity": "sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==", "dependencies": { - "@polkadot/wasm-util": "7.2.1", - "tslib": "^2.5.0" + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { "@polkadot/util": "*" } }, + "node_modules/@polkadot/wasm-crypto-wasm/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/wasm-crypto/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@polkadot/wasm-util": { - "version": "7.2.1", - "license": "Apache-2.0", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz", + "integrity": "sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { "@polkadot/util": "*" } }, - "node_modules/@polkadot/x-fetch": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/wasm-util/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/x-bigint": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz", + "integrity": "sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "node-fetch": "^3.3.1", - "tslib": "^2.5.3" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@polkadot/x-global": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/x-bigint/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/x-fetch": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz", + "integrity": "sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw==", "dependencies": { - "tslib": "^2.5.3" + "@polkadot/x-global": "12.6.2", + "node-fetch": "^3.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@polkadot/x-randomvalues": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/x-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "tslib": "^2.5.3" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">=16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "@polkadot/util": "12.3.2", - "@polkadot/wasm-util": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/@polkadot/x-textdecoder": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/x-fetch/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/x-global": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.6.2.tgz", + "integrity": "sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "tslib": "^2.5.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@polkadot/x-textencoder": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/x-global/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/x-randomvalues": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz", + "integrity": "sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "tslib": "^2.5.3" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/wasm-util": "*" } }, - "node_modules/@polkadot/x-ws": { - "version": "12.3.2", - "license": "Apache-2.0", + "node_modules/@polkadot/x-randomvalues/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@polkadot/x-textdecoder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz", + "integrity": "sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==", "dependencies": { - "@polkadot/x-global": "12.3.2", - "tslib": "^2.5.3", - "ws": "^8.13.0" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } + "node_modules/@polkadot/x-textdecoder/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@redis/client": { - "version": "1.5.8", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/@polkadot/x-textencoder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz", + "integrity": "sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==", "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.0", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" + "node": ">=18" } }, - "node_modules/@redis/json": { - "version": "1.0.4", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } + "node_modules/@polkadot/x-textencoder/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@redis/search": { - "version": "1.1.3", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" + "node_modules/@polkadot/x-ws": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.6.2.tgz", + "integrity": "sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2", + "ws": "^8.15.1" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@redis/time-series": { - "version": "1.0.4", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } + "node_modules/@polkadot/x-ws/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/@scure/base": { - "version": "1.1.1", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@sideway/address": { "version": "4.1.4", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "dependencies": { "@hapi/hoek": "^9.0.0" } }, "node_modules/@sideway/formula": { "version": "3.0.1", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "license": "MIT" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sindresorhus/is": { - "version": "5.4.1", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -2958,51 +3277,53 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.1.0", - "license": "BSD-3-Clause", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@sqltools/formatter": { "version": "1.2.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", "peer": true }, "node_modules/@substrate/connect": { - "version": "0.7.26", - "license": "GPL-3.0-only", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.35.tgz", + "integrity": "sha512-Io8vkalbwaye+7yXfG1Nj52tOOoJln2bMlc7Q9Yy3vEWqZEVkgKmcPVzbwV0CWL3QD+KMPDA2Dnw/X7EdwgoLw==", + "hasInstallScript": true, "optional": true, "dependencies": { "@substrate/connect-extension-protocol": "^1.0.1", - "eventemitter3": "^4.0.7", - "smoldot": "1.0.4" + "smoldot": "2.0.7" } }, "node_modules/@substrate/connect-extension-protocol": { "version": "1.0.1", - "license": "GPL-3.0-only", - "optional": true - }, - "node_modules/@substrate/connect/node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz", + "integrity": "sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==", "optional": true }, "node_modules/@substrate/ss58-registry": { - "version": "1.40.0", - "license": "Apache-2.0" + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.45.0.tgz", + "integrity": "sha512-NHmOkILimbLRPKvpnR+JGVckc1q4AJjxz9FnzZ3dKAVBL17AKknDy2FxXcwlJbmOXl9u7W3FS3bLDHgfKi4tQw==" }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, - "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -3012,24 +3333,29 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/babel__core": { - "version": "7.20.1", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -3039,86 +3365,91 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "license": "MIT", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/bn.js": { - "version": "5.1.1", - "license": "MIT", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", "dev": true }, "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3127,9 +3458,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.36", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", - "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3138,67 +3469,76 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "license": "MIT", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "dev": true, - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true }, "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/ioredis-mock": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ioredis-mock/-/ioredis-mock-8.2.2.tgz", - "integrity": "sha512-bnbPHOjxy4TUDjRh61MMoK2QvDNZqrMDXJYrEDZP/HPFvBubR24CQ0DBi5lgWhLxG4lvVsXPRDXtZ03+JgonoQ==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/@types/ioredis-mock/-/ioredis-mock-8.2.5.tgz", + "integrity": "sha512-cZyuwC9LGtg7s5G9/w6rpy3IOZ6F/hFR0pQlWYZESMo1xQUYbDpa6haqB4grTePjsGzcB/YLBFCjqRunK5wieg==", "dev": true, "peer": true, "dependencies": { + "@types/node": "*", "ioredis": ">=5" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "license": "MIT" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "license": "MIT", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "license": "MIT", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.2", + "version": "29.5.11", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", + "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "license": "MIT" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/long": { "version": "4.0.2", @@ -3206,77 +3546,83 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "optional": true }, + "node_modules/@types/luxon": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz", + "integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==" + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true + }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/multer": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", - "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", + "integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==", "dependencies": { "@types/express": "*" } }, "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-int64": { - "version": "0.4.29", - "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz", - "integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==", + "version": "0.4.32", + "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.32.tgz", + "integrity": "sha512-xf/JsSlnXQ+mzvc0IpXemcrO4BrCfpgNpMco+GLcXkFk01k/gW9lGJu+Vof0ZSvHK6DsHJDPSbjFPs36QkWXqw==", "optional": true, "dependencies": { "@types/node": "*" } }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "license": "MIT" - }, "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", "optional": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/semver": { - "version": "7.5.0", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -3284,42 +3630,46 @@ } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "license": "MIT" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, "node_modules/@types/strip-bom": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true }, "node_modules/@types/strip-json-comments": { "version": "0.0.30", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true }, "node_modules/@types/superagent": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", - "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.1.tgz", + "integrity": "sha512-YQyEXA4PgCl7EVOoSAS3o0fyPFU6erv5mMixztQYe1bqbWmmn8c+IrqoxjQeZe4MgwXikgcaZPiI/DsbmOVlzA==", "dev": true, "dependencies": { - "@types/cookiejar": "*", + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", "@types/node": "*" } }, "node_modules/@types/supertest": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", - "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.16.tgz", + "integrity": "sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==", "dev": true, "dependencies": { "@types/superagent": "*" } }, "node_modules/@types/thrift": { - "version": "0.10.13", - "resolved": "https://registry.npmjs.org/@types/thrift/-/thrift-0.10.13.tgz", - "integrity": "sha512-zNapgGgZP2tOC8zhS10LPKdJxH+U0owZ1WWwDZASgyb5HZGj03P4Wm+Yd3YDXDQEjSRqO2XQznUH13tcG4dkIA==", + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@types/thrift/-/thrift-0.10.17.tgz", + "integrity": "sha512-bDX6d5a5ZDWC81tgDv224n/3PKNYfIQJTPHzlbk4vBWJrYXF6Tg1ncaVmP/c3JbGN2AK9p7zmHorJC2D6oejGQ==", "optional": true, "dependencies": { "@types/node": "*", @@ -3328,57 +3678,63 @@ } }, "node_modules/@types/time-constants": { - "version": "1.0.0", - "dev": true, - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/time-constants/-/time-constants-1.0.2.tgz", + "integrity": "sha512-ttK/moi86ZT9UE6yRnLGKZBBEvoHiSD2tK46nR+7/7Vt5Mp/22AaB7Eng0dRFFs6Ieur0Cj8oBwuX4OxC1Zr7g==", + "dev": true }, "node_modules/@types/uuid": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.2.tgz", - "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==" + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", + "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" }, "node_modules/@types/validator": { - "version": "13.7.17", - "license": "MIT" + "version": "13.11.8", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.8.tgz", + "integrity": "sha512-c/hzNDBh7eRF+KbCf+OoZxKbnkpaK/cKp9iLQWqB7muXtM+MtL9SUUH8vCFcLn6dH1Qm05jiexK0ofWY7TfOhQ==" }, "node_modules/@types/yargs": { - "version": "17.0.24", - "license": "MIT", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "license": "MIT" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.11", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", + "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/type-utils": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/type-utils": "6.18.1", + "@typescript-eslint/utils": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3386,72 +3742,27 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.11", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.59.11", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.11", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "5.59.11", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.9", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz", + "integrity": "sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3460,20 +3771,22 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", + "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3485,16 +3798,41 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", + "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3502,61 +3840,51 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.11", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", + "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/utils": "6.18.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.11", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.11", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", + "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3568,29 +3896,39 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.11", + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "eslint-visitor-keys": "^3.3.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.9", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", + "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3599,8 +3937,9 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.59.8", "@typescript-eslint/visitor-keys": "5.59.8", @@ -3625,8 +3964,9 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3637,8 +3977,9 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" @@ -3652,77 +3993,49 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.11", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", + "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.11", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.11", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.11", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", + "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3734,39 +4047,55 @@ } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.11", + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "eslint-visitor-keys": "^3.3.0" + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", + "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.18.1", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", @@ -3910,7 +4239,8 @@ }, "node_modules/accepts": { "version": "1.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3920,8 +4250,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "license": "MIT", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -3939,26 +4270,29 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "license": "MIT", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "engines": { "node": ">=0.4.0" } }, "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -3982,34 +4316,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -4020,7 +4326,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { "type-fest": "^0.21.3" }, @@ -4033,7 +4340,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { "node": ">=10" }, @@ -4043,14 +4351,16 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -4063,12 +4373,14 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "peer": true }, "node_modules/anymatch": { "version": "3.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4077,9 +4389,21 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/app-root-path": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", "peer": true, "engines": { "node": ">= 6.0.0" @@ -4087,20 +4411,24 @@ }, "node_modules/append-field": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "node_modules/arg": { "version": "4.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -4111,17 +4439,19 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.6", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -4138,20 +4468,41 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4162,13 +4513,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4178,6 +4530,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -4185,8 +4558,9 @@ "dev": true }, "node_modules/async": { - "version": "3.2.3", - "license": "MIT" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-limiter": { "version": "1.0.1", @@ -4196,12 +4570,14 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4210,23 +4586,25 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "license": "MIT", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/babel-jest": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -4240,7 +4618,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -4252,10 +4631,34 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -4268,7 +4671,8 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -4288,11 +4692,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -4304,10 +4709,13 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4321,20 +4729,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } + ] }, "node_modules/binary-extensions": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } @@ -4349,29 +4749,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -4392,11 +4769,13 @@ }, "node_modules/bn.js": { "version": "5.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { "version": "1.20.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -4418,29 +4797,21 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "license": "MIT" - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/brace-expansion": { "version": "1.1.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4448,7 +4819,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, @@ -4471,14 +4843,10 @@ "pako": "~1.0.5" } }, - "node_modules/browserify-zlib/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "optional": true - }, "node_modules/browserslist": { - "version": "4.21.8", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "funding": [ { "type": "opencollective", @@ -4493,12 +4861,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001502", - "electron-to-chromium": "^1.4.428", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -4509,8 +4876,9 @@ }, "node_modules/bs-logger": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -4520,7 +4888,8 @@ }, "node_modules/bser": { "version": "2.1.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dependencies": { "node-int64": "^0.4.0" } @@ -4537,7 +4906,7 @@ "node": ">=6.9.0" } }, - "node_modules/bson/node_modules/buffer": { + "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", @@ -4555,50 +4924,29 @@ "url": "https://feross.org/support" } ], - "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/bullmq": { "version": "3.15.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-3.15.8.tgz", + "integrity": "sha512-k3uimHGhl5svqD7SEak+iI6c5DxeLOaOXzCufI9Ic0ST3nJr69v71TGR4cXCTXdgCff3tLec5HgoBnfyWjgn5A==", "dependencies": { "cron-parser": "^4.6.0", "glob": "^8.0.3", @@ -4612,14 +4960,16 @@ }, "node_modules/bullmq/node_modules/brace-expansion": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/bullmq/node_modules/glob": { "version": "8.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4636,7 +4986,8 @@ }, "node_modules/bullmq/node_modules/minimatch": { "version": "5.1.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4644,22 +4995,10 @@ "node": ">=10" } }, - "node_modules/bundle-name": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/busboy": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -4669,48 +5008,31 @@ }, "node_modules/bytes": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, - "node_modules/cache-manager": { - "version": "4.1.0", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "async": "3.2.3", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^7.10.1" - } - }, - "node_modules/cache-manager/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/cacheable-lookup": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "10.2.12", + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, - "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.1", + "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", + "keyv": "^4.5.3", "mimic-response": "^4.0.0", "normalize-url": "^8.0.0", "responselike": "^3.0.0" @@ -4720,11 +5042,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4732,20 +5056,24 @@ }, "node_modules/callsites": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001502", + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", "funding": [ { "type": "opencollective", @@ -4759,12 +5087,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4778,8 +5106,9 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -4791,13 +5120,14 @@ }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4814,16 +5144,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -4833,34 +5153,38 @@ } }, "node_modules/ci-info": { - "version": "3.8.0", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.2.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true }, "node_modules/class-transformer": { "version": "0.5.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" }, "node_modules/class-validator": { - "version": "0.14.0", - "license": "MIT", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", "dependencies": { - "@types/validator": "^13.7.10", - "libphonenumber-js": "^1.10.14", - "validator": "^13.7.0" + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" } }, "node_modules/cli-cursor": { @@ -4876,7 +5200,8 @@ }, "node_modules/cli-highlight": { "version": "2.1.11", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -4896,7 +5221,8 @@ }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "peer": true, "dependencies": { "string-width": "^4.2.0", @@ -4904,9 +5230,27 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/cli-highlight/node_modules/yargs": { "version": "16.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "peer": true, "dependencies": { "cliui": "^7.0.2", @@ -4923,16 +5267,17 @@ }, "node_modules/cli-highlight/node_modules/yargs-parser": { "version": "20.2.9", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "peer": true, "engines": { "node": ">=10" } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { "node": ">=6" }, @@ -4964,7 +5309,8 @@ }, "node_modules/cliui": { "version": "8.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4974,6 +5320,22 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -4984,28 +5346,32 @@ }, "node_modules/cluster-key-slot": { "version": "1.1.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "engines": { "node": ">=0.10.0" } }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "dev": true, - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true }, "node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -5015,11 +5381,13 @@ }, "node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5051,21 +5419,26 @@ } }, "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/concat-map": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "engines": [ "node >= 0.8" ], - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5075,16 +5448,19 @@ }, "node_modules/confusing-browser-globals": { "version": "1.0.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true }, "node_modules/consola": { "version": "2.15.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, "node_modules/content-disposition": { "version": "0.5.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { "safe-buffer": "5.2.1" }, @@ -5094,25 +5470,29 @@ }, "node_modules/content-type": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { "version": "0.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/cookiejar": { "version": "2.1.4", @@ -5122,11 +5502,13 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -5136,35 +5518,69 @@ } }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/create-require": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cron": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.1.tgz", - "integrity": "sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.3.tgz", + "integrity": "sha512-YBvExkQYF7w0PxyeFLRyr817YVDhGxaCi5/uRRMqa4aWD3IFKRd+uNbpW1VWMdqQy8PZ7CElc+accXJcauPKzQ==", "dependencies": { - "luxon": "^3.2.1" + "@types/luxon": "~3.3.0", + "luxon": "~3.3.0" } }, "node_modules/cron-parser": { - "version": "4.8.1", - "license": "MIT", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dependencies": { "luxon": "^3.2.1" }, @@ -5181,29 +5597,10 @@ "node-fetch": "^2.6.12" } }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/cross-spawn": { "version": "7.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5215,29 +5612,22 @@ }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "engines": { "node": ">= 12" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "peer": true }, "node_modules/debug": { "version": "4.3.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -5252,8 +5642,9 @@ }, "node_modules/decompress-response": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -5266,8 +5657,9 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -5276,62 +5668,42 @@ } }, "node_modules/dedent": { - "version": "0.7.0", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, - "license": "MIT" + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-extend": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -5345,28 +5717,33 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, "node_modules/define-properties": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5379,28 +5756,32 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/denque": { "version": "2.1.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { "node": ">=0.10" } }, "node_modules/depd": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -5408,8 +5789,9 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5426,22 +5808,25 @@ }, "node_modules/diff": { "version": "4.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5451,8 +5836,9 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5462,7 +5848,8 @@ }, "node_modules/dotenv": { "version": "16.3.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" }, @@ -5472,27 +5859,35 @@ }, "node_modules/dotenv-expand": { "version": "10.0.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", "engines": { "node": ">=12" } }, "node_modules/dynamic-dedupe": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", "dev": true, - "license": "MIT", "dependencies": { "xtend": "^4.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ee-first": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dependencies": { "jake": "^10.8.5" }, @@ -5504,13 +5899,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.429", - "license": "ISC" + "version": "1.4.630", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.630.tgz", + "integrity": "sha512-osHqhtjojpCsACVnuD11xO5g9xaCyw7Qqn/C2KParkMv42i8jrJJgx3g7mkHfpxwhy9MnOJr8+pKOdZ7qzgizg==" }, "node_modules/emittery": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5520,23 +5917,17 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -5551,35 +5942,39 @@ }, "node_modules/eol": { "version": "0.9.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", + "dev": true }, "node_modules/error-ex": { "version": "1.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.21.2", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -5587,19 +5982,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "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", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "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.9" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -5609,35 +6008,38 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5652,19 +6054,22 @@ }, "node_modules/escalade": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -5673,26 +6078,28 @@ } }, "node_modules/eslint": { - "version": "8.42.0", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5702,7 +6109,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -5712,9 +6118,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -5729,8 +6134,9 @@ }, "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, - "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -5747,30 +6153,33 @@ }, "node_modules/eslint-config-airbnb-base/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-config-airbnb-typescript": { - "version": "17.0.0", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", "dev": true, - "license": "MIT", "dependencies": { "eslint-config-airbnb-base": "^15.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", "eslint": "^7.32.0 || ^8.2.0", "eslint-plugin-import": "^2.25.3" } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5779,81 +6188,55 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/slash": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=12" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" } }, "node_modules/eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -5868,16 +6251,18 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-es": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, - "license": "MIT", "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" @@ -5894,8 +6279,9 @@ }, "node_modules/eslint-plugin-es/node_modules/eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -5908,32 +6294,36 @@ }, "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -5944,16 +6334,18 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5963,8 +6355,9 @@ }, "node_modules/eslint-plugin-import/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -5974,16 +6367,27 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.14.2", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -5993,8 +6397,9 @@ }, "node_modules/eslint-plugin-n": { "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, - "license": "MIT", "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", @@ -6017,8 +6422,9 @@ }, "node_modules/eslint-plugin-nestjs": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-nestjs/-/eslint-plugin-nestjs-1.2.3.tgz", + "integrity": "sha512-CYS2l+oO9sZ8QN1B0/Xgz+2CERfiWCiHDmDslX30yrJrNlBNKFypeCac/7g/NE+LDuox5MH13uvd4qd52Tlt5w==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -6028,27 +6434,29 @@ }, "node_modules/eslint-plugin-nestjs/node_modules/tslib": { "version": "1.14.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" + "synckit": "^0.8.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/prettier" + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", + "eslint-config-prettier": "*", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -6062,8 +6470,9 @@ }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, - "license": "ISC", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6072,20 +6481,26 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -6101,16 +6516,18 @@ }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6118,35 +6535,47 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "BSD-2-Clause", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=4.0" + "node": ">=10.13.0" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/espree": { - "version": "9.5.2", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -6159,7 +6588,8 @@ }, "node_modules/esprima": { "version": "4.0.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6170,8 +6600,9 @@ }, "node_modules/esquery": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -6179,17 +6610,10 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dependencies": { "estraverse": "^5.2.0" }, @@ -6197,42 +6621,40 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter2": { "version": "6.4.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" }, "node_modules/eventemitter3": { "version": "5.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/events": { "version": "3.3.0", @@ -6243,43 +6665,53 @@ } }, "node_modules/execa": { - "version": "7.1.1", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6287,7 +6719,8 @@ }, "node_modules/express": { "version": "4.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -6327,7 +6760,8 @@ }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -6349,22 +6783,26 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/express/node_modules/raw-body": { "version": "2.5.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -6390,17 +6828,20 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6412,41 +6853,35 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fastq": { - "version": "1.15.0", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { "version": "2.0.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dependencies": { "bser": "2.1.1" } @@ -6471,14 +6906,10 @@ "fengari": "^0.1.0" } }, - "node_modules/fengari/node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, "node_modules/fetch-blob": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "funding": [ { "type": "github", @@ -6489,7 +6920,6 @@ "url": "https://paypal.me/jimmywarting" } ], - "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -6522,8 +6952,9 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -6560,7 +6991,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6570,7 +7002,8 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -6586,19 +7019,22 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6611,31 +7047,70 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flatted": { - "version": "3.2.7", + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "license": "ISC" + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -6647,34 +7122,37 @@ }, "node_modules/for-each": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dependencies": { "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", + "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", + "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", @@ -6695,7 +7173,8 @@ }, "node_modules/form-data": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -6707,15 +7186,17 @@ }, "node_modules/form-data-encoder": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.17" } }, "node_modules/formdata-polyfill": { "version": "4.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -6740,14 +7221,16 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, "node_modules/fresh": { "version": "0.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -6766,27 +7249,46 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "node_modules/fs.realpath": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6797,43 +7299,38 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "license": "MIT", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6841,23 +7338,26 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "engines": { "node": ">=8.0.0" } }, "node_modules/get-stdin": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6867,8 +7367,9 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -6881,9 +7382,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.6.0", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -6892,32 +7394,35 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/glob-to-regexp": { @@ -6925,10 +7430,33 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { - "version": "13.20.0", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6941,8 +7469,9 @@ }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -6955,8 +7484,9 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6974,8 +7504,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6984,9 +7514,10 @@ } }, "node_modules/got": { - "version": "12.6.1", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", "dev": true, - "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -7001,7 +7532,7 @@ "responselike": "^3.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -7009,26 +7540,23 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/handlebars": { - "version": "4.7.7", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -7042,27 +7570,28 @@ "uglify-js": "^3.1.4" } }, - "node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } @@ -7076,11 +7605,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7088,7 +7617,8 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, @@ -7098,7 +7628,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -7108,8 +7639,9 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -7120,6 +7652,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/haxec": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/haxec/-/haxec-2.0.1.tgz", @@ -7133,6 +7676,25 @@ "node": ">=10" } }, + "node_modules/haxec/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/haxec/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -7144,7 +7706,8 @@ }, "node_modules/highlight.js": { "version": "10.7.3", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "peer": true, "engines": { "node": "*" @@ -7152,17 +7715,20 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -7175,9 +7741,10 @@ } }, "node_modules/http2-wrapper": { - "version": "2.2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, - "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -7187,16 +7754,18 @@ } }, "node_modules/human-signals": { - "version": "4.3.1", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=14.18.0" + "node": ">=10.17.0" } }, "node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7206,6 +7775,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -7219,20 +7790,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { - "version": "5.2.4", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7246,8 +7818,9 @@ }, "node_modules/import-local": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -7264,14 +7837,16 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7279,12 +7854,14 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/inquirer": { "version": "8.2.6", @@ -7311,19 +7888,6 @@ "node": ">=12.0.0" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/int53": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/int53/-/int53-0.2.4.tgz", @@ -7331,12 +7895,13 @@ "optional": true }, "node_modules/internal-slot": { - "version": "1.0.5", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -7353,7 +7918,8 @@ }, "node_modules/ioredis": { "version": "5.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -7374,9 +7940,9 @@ } }, "node_modules/ioredis-mock": { - "version": "8.8.3", - "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-8.8.3.tgz", - "integrity": "sha512-LkF17WIyYkPfUhvp0fjIZ+HKhILEoq1J2b71vv+9EOW054UlkySVEvgQ2RolXM+eI759MteHtXQvv0oRn0lkUg==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-8.9.0.tgz", + "integrity": "sha512-yIglcCkI1lvhwJVoMsR51fotZVsPsSk07ecTCgRTRlicG0Vq3lke6aAaHklyjmRNRsdYAgswqC2A0bPtQK4LSw==", "dev": true, "dependencies": { "@ioredis/as-callback": "^3.0.0", @@ -7395,15 +7961,17 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { "node": ">= 0.10" } }, "node_modules/is-array-buffer": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -7415,12 +7983,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -7430,7 +8000,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7440,8 +8011,9 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7455,8 +8027,9 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7465,10 +8038,11 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "license": "MIT", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7476,8 +8050,9 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7488,45 +8063,35 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-glob": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -7534,23 +8099,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -7561,8 +8109,9 @@ }, "node_modules/is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7572,15 +8121,17 @@ }, "node_modules/is-number": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7593,16 +8144,18 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7616,8 +8169,9 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -7626,11 +8180,12 @@ } }, "node_modules/is-stream": { - "version": "3.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7638,8 +8193,9 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7652,8 +8208,9 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -7665,15 +8222,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, - "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -7695,8 +8249,9 @@ }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -7713,38 +8268,15 @@ "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isomorphic-ws": { "version": "4.0.1", @@ -7756,50 +8288,48 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "license": "BSD-3-Clause", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "license": "BSD-3-Clause", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -7809,10 +8339,20 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-reports": { - "version": "3.1.5", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -7823,11 +8363,29 @@ }, "node_modules/iterare": { "version": "1.2.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", "engines": { "node": ">=6" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -7846,14 +8404,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -7871,121 +8430,42 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/jest-circus": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7995,21 +8475,21 @@ } }, "node_modules/jest-cli": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -8028,30 +8508,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "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.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -8071,23 +8552,45 @@ } } }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-diff": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.4.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -8096,56 +8599,60 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8157,41 +8664,44 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "license": "MIT", "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8200,12 +8710,13 @@ } }, "node_modules/jest-mock": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8213,8 +8724,9 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -8228,23 +8740,25 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8254,41 +8768,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "license": "MIT", "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8296,40 +8812,51 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8337,51 +8864,62 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "MIT", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -8392,17 +8930,29 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-validate": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8410,8 +8960,9 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -8420,17 +8971,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8438,11 +8990,12 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -8452,7 +9005,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, @@ -8464,8 +9018,9 @@ } }, "node_modules/joi": { - "version": "17.9.2", - "license": "BSD-3-Clause", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -8481,7 +9036,8 @@ }, "node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -8491,7 +9047,8 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, @@ -8501,21 +9058,25 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json-stringify-pretty-compact": { "version": "4.0.0", @@ -8524,11 +9085,13 @@ }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { "version": "2.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -8553,33 +9116,37 @@ } }, "node_modules/keyv": { - "version": "4.5.2", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kleur": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/leven": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8589,20 +9156,22 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.34", - "license": "MIT" + "version": "1.10.53", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.53.tgz", + "integrity": "sha512-sDTnnqlWK4vH4AlDQuswz3n4Hx7bIQWTpIcScJX+Sp7St3LXHmfiax/ZFfyYxHmkdCvydOLSuvtAO/XpXiSySw==" }, "node_modules/license-report": { - "version": "6.4.0", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/license-report/-/license-report-6.5.0.tgz", + "integrity": "sha512-e8VbNeBb2UumBaTCciINTmW0MquM9HmSSGskCxFqIPjsypYHWlwoz5k6ydGP1lk5GaYUHBZsN+XoENJ5C9c04A==", "dev": true, - "license": "MIT", "dependencies": { "@kessler/tableify": "^1.0.2", "debug": "^4.3.4", "eol": "^0.9.1", - "got": "^12.6.0", + "got": "^13.0.0", "rc": "^1.2.8", - "semver": "^7.3.8", + "semver": "^7.5.4", "tablemark": "^3.0.0", "text-table": "^0.2.0", "visit-values": "^2.0.0" @@ -8611,12 +9180,13 @@ "license-report": "index.js" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -8628,8 +9198,9 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -8642,31 +9213,30 @@ }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "license": "MIT", - "optional": true, - "peer": true + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.defaults": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", @@ -8691,16 +9261,18 @@ }, "node_modules/lower-case": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lowercase-keys": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8709,37 +9281,25 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/luxon": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", "engines": { "node": ">=12" } }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -8748,41 +9308,37 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", - "license": "ISC" + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/makeerror": { "version": "1.0.12", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/media-typer": { "version": "0.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } @@ -8800,30 +9356,35 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -8832,9 +9393,21 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "1.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, @@ -8844,14 +9417,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, @@ -8860,20 +9435,18 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/mimic-response": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8883,7 +9456,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8893,22 +9467,24 @@ }, "node_modules/minimist": { "version": "1.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { "version": "0.5.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, @@ -8917,27 +9493,31 @@ } }, "node_modules/mock-socket": { - "version": "9.2.1", - "license": "MIT", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", "engines": { "node": ">= 8" } }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msgpackr": { - "version": "1.9.5", - "license": "MIT", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.1.tgz", + "integrity": "sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==", "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", + "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.0.7" @@ -8956,7 +9536,8 @@ }, "node_modules/multer": { "version": "1.4.4-lts.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -8982,7 +9563,8 @@ }, "node_modules/mz": { "version": "2.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "peer": true, "dependencies": { "any-promise": "^1.0.0", @@ -8992,38 +9574,36 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { "version": "0.6.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/no-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, - "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/nock": { - "version": "13.3.8", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.8.tgz", - "integrity": "sha512-96yVFal0c/W1lG7mmfRe7eO+hovrhJYd2obzzOZ90f6fjpeU/XNvd9cYHZKZAQJumDfhXgoTpkpJ9pvMj+hqHw==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", @@ -9040,6 +9620,8 @@ }, "node_modules/node-domexception": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", "funding": [ { "type": "github", @@ -9050,7 +9632,6 @@ "url": "https://paypal.me/jimmywarting" } ], - "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -9064,24 +9645,28 @@ } }, "node_modules/node-fetch": { - "version": "3.3.1", - "license": "MIT", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-gyp-build-optional-packages": { "version": "5.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", + "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", "optional": true, "bin": { "node-gyp-build-optional-packages": "bin.js", @@ -9091,23 +9676,27 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.12", - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -9116,59 +9705,50 @@ } }, "node_modules/npm-run-path": { - "version": "5.1.0", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/object-assign": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.3", - "license": "MIT", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -9180,26 +9760,57 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" } }, "node_modules/object.values": { - "version": "1.1.6", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -9210,7 +9821,8 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -9220,37 +9832,21 @@ }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "9.1.0", - "dev": true, - "license": "MIT", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9258,8 +9854,9 @@ }, "node_modules/optionator": { "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, - "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -9294,21 +9891,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -9319,16 +9901,18 @@ }, "node_modules/p-cancelable": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9341,8 +9925,9 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -9355,19 +9940,22 @@ }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, "node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "optional": true }, "node_modules/parent-module": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dependencies": { "callsites": "^3.0.0" }, @@ -9377,7 +9965,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -9393,12 +9982,14 @@ }, "node_modules/parse5": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "peer": true }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "peer": true, "dependencies": { "parse5": "^6.0.1" @@ -9406,40 +9997,46 @@ }, "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "peer": true }, "node_modules/parseurl": { "version": "1.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { "node": ">= 0.8" } }, "node_modules/path-exists": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", @@ -9457,57 +10054,55 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "engines": { "node": "14 || >=16.14" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { "version": "3.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" }, "node_modules/path-type": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { "node": ">=8" } }, "node_modules/picocolors": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pirates": { - "version": "4.0.5", - "license": "MIT", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -9517,8 +10112,9 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9529,8 +10125,9 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -9540,8 +10137,9 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -9554,8 +10152,9 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -9573,16 +10172,17 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.1.tgz", + "integrity": "sha512-qSUWshj1IobVbKc226Gw2pync27t0Kf0EdufZa9j7uBSJay1CC+B3K5lAAZoqgX3ASiKuWsk6OmzKRetXNObWg==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -9596,8 +10196,9 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -9606,10 +10207,11 @@ } }, "node_modules/pretty-format": { - "version": "29.5.0", - "license": "MIT", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -9619,7 +10221,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { "node": ">=10" }, @@ -9629,12 +10232,14 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/prompts": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -9645,14 +10250,16 @@ }, "node_modules/propagate": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "engines": { "node": ">= 8" } }, "node_modules/proxy-addr": { "version": "2.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -9663,26 +10270,21 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/punycode": { - "version": "2.3.0", - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { - "version": "6.0.2", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { @@ -9693,8 +10295,7 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/q": { "version": "1.5.1", @@ -9708,7 +10309,8 @@ }, "node_modules/qs": { "version": "6.11.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -9721,6 +10323,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -9735,13 +10339,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-lru": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -9759,14 +10363,16 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -9779,8 +10385,9 @@ }, "node_modules/rc": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -9793,19 +10400,22 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-is": { "version": "18.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9818,11 +10428,13 @@ }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readdirp": { "version": "3.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -9830,6 +10442,17 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/readline-sync": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", @@ -9850,26 +10473,10 @@ "node": ">= 0.10" } }, - "node_modules/redis": { - "version": "4.6.7", - "license": "MIT", - "optional": true, - "peer": true, - "workspaces": [ - "./packages/*" - ], - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.8", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.3", - "@redis/time-series": "1.0.4" - } - }, "node_modules/redis-errors": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", "engines": { "node": ">=4" } @@ -9884,7 +10491,8 @@ }, "node_modules/redis-parser": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "dependencies": { "redis-errors": "^1.0.0" }, @@ -13348,23 +13956,20 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "peer": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -13375,8 +13980,9 @@ }, "node_modules/regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -13394,7 +14000,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } @@ -13408,10 +14015,11 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "license": "MIT", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -13424,13 +14032,15 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -13440,39 +14050,44 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/resolve.exports": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/responselike": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, - "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -13495,145 +14110,83 @@ "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dependencies": { - "glob": "^7.1.3" + "glob": "^9.2.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-applescript": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0" } }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/run-applescript/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dependencies": { - "mimic-fn": "^2.1.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/run-async": { @@ -13646,6 +14199,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -13661,7 +14216,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -13674,8 +14228,34 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -13689,25 +14269,29 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/schema-utils": { "version": "3.3.0", @@ -13726,6 +14310,34 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -13740,9 +14352,26 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/send": { "version": "0.18.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13764,23 +14393,27 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sentence-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "dev": true, - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -13788,16 +14421,17 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.15.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -13808,13 +14442,43 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "peer": true, "dependencies": { "inherits": "^2.0.1", @@ -13826,7 +14490,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -13836,7 +14501,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { "node": ">=8" } @@ -13857,9 +14523,29 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/side-channel": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -13870,27 +14556,36 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sisteransi": { "version": "1.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, "node_modules/slash": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { "node": ">=8" } }, "node_modules/smoldot": { - "version": "1.0.4", - "license": "GPL-3.0-or-later WITH Classpath-exception-2.0", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.7.tgz", + "integrity": "sha512-VAOBqEen6vises36/zgrmAT1GWk2qE3X8AGnO7lmQFdskbKx8EovnwS22rtPAG+Y1Rk23/S22kDJUdPANyPkBA==", "optional": true, "dependencies": { - "pako": "^2.0.4", "ws": "^8.8.1" } }, @@ -13901,20 +14596,30 @@ "optional": true }, "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -13932,10 +14637,89 @@ "node": ">=8" } }, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spawn-wrap/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spawn-wrap/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/spawn-wrap/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/split-text-to-chunks": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split-text-to-chunks/-/split-text-to-chunks-1.0.0.tgz", + "integrity": "sha512-HLtEwXK/T4l7QZSJ/kOSsZC0o5e2Xg3GzKKFxm0ZexJXw0Bo4CaEl39l7MCSRHk9EOOL5jT8JIDjmhTtcoe6lQ==", "dev": true, - "license": "MIT", "dependencies": { "get-stdin": "^5.0.1", "minimist": "^1.2.0" @@ -13945,12 +14729,15 @@ } }, "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -13960,43 +14747,51 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "engines": { "node": ">=8" } }, "node_modules/standard-as-callback": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" }, "node_modules/statuses": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, "node_modules/streamsearch": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -14007,7 +14802,22 @@ }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14018,13 +14828,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -14034,26 +14845,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14061,7 +14874,20 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14070,27 +14896,28 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-final-newline": { - "version": "3.0.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -14146,7 +14973,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -14156,7 +14984,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -14165,9 +14994,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.3.1.tgz", - "integrity": "sha512-El78OvXp9zMasfPrshtkW1CRx8AugAKoZuGGOTW+8llJzOV1RtDJYqQRz/6+2OakjeWWnZuRlN2Qj1Y0ilux3w==" + "version": "5.10.3", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.3.tgz", + "integrity": "sha512-fu3aozjxFWsmcO1vyt1q1Ji2kN7KlTd1vHy27E9WgPyXo9nrEzhQPqgxaAjbMsOmb8XFKNGo4Sa3Q+84Fh+pFw==" }, "node_modules/symbol-observable": { "version": "4.0.0", @@ -14178,12 +15007,13 @@ } }, "node_modules/synckit": { - "version": "0.8.5", + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", "dev": true, - "license": "MIT", "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -14192,10 +15022,17 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/tablemark": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-3.0.0.tgz", + "integrity": "sha512-7N05gRK7t6B4g8AtedUsKoKtPjplmUjOPr/V4kVB+7U3yGiB3WvKqMTTQzVCZyhfZUXgQFp9YyN9ZgC52uCPKw==", "dev": true, - "license": "MIT", "dependencies": { "sentence-case": "^3.0.4", "split-text-to-chunks": "^1.0.0" @@ -14206,15 +15043,16 @@ }, "node_modules/tapable": { "version": "2.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -14229,15 +15067,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -14261,15 +15099,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -14304,7 +15133,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -14314,14 +15144,35 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/thenify": { "version": "3.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "peer": true, "dependencies": { "any-promise": "^1.0.0" @@ -14329,7 +15180,8 @@ }, "node_modules/thenify-all": { "version": "1.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "peer": true, "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -14370,18 +15222,8 @@ }, "node_modules/time-constants": { "version": "1.0.3", - "license": "ISC" - }, - "node_modules/titleize": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "resolved": "https://registry.npmjs.org/time-constants/-/time-constants-1.0.3.tgz", + "integrity": "sha512-cppe5TusAujrdnXmbUWuCe89oSjBJVyhndrceWvELg0WLmlv3/IRlo9cx8sBgRgmMmiC/D0NKspJg+tCc92Xug==" }, "node_modules/tmp": { "version": "0.0.33", @@ -14396,18 +15238,21 @@ }, "node_modules/tmpl": { "version": "1.0.5", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-fast-properties": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -14417,14 +15262,16 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } }, "node_modules/tr46": { "version": "0.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trace-unhandled": { "version": "2.0.1", @@ -14443,15 +15290,29 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "bin": { "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { - "version": "29.1.0", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -14459,7 +15320,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { @@ -14491,15 +15352,16 @@ } }, "node_modules/ts-loader": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", - "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -14510,8 +15372,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "license": "MIT", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -14584,10 +15447,31 @@ } } }, + "node_modules/ts-node-dev/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ts-node-dev/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -14597,8 +15481,9 @@ }, "node_modules/ts-node-dev/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14608,8 +15493,9 @@ }, "node_modules/tsconfig": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", "dev": true, - "license": "MIT", "dependencies": { "@types/strip-bom": "^3.0.0", "@types/strip-json-comments": "0.0.30", @@ -14619,7 +15505,8 @@ }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -14642,22 +15529,42 @@ "node": ">=10.13.0" } }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tsconfig/node_modules/strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tslib": { - "version": "2.5.3", - "license": "0BSD" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -14670,13 +15577,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -14686,37 +15595,92 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/type-fest": { - "version": "0.20.2", + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -14728,11 +15692,13 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typeorm": { - "version": "0.3.16", - "license": "MIT", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.19.tgz", + "integrity": "sha512-OGelrY5qEoAU80mR1iyvmUHiKCPUydL6xp6bebXzS7jyv/X70Gp/jBWRAfF4qGOfy2A7orMiGRfwsBUNbEL65g==", "peer": true, "dependencies": { "@sqltools/formatter": "^1.2.5", @@ -14740,10 +15706,10 @@ "buffer": "^6.0.3", "chalk": "^4.1.2", "cli-highlight": "^2.1.11", - "date-fns": "^2.29.3", + "dayjs": "^1.11.9", "debug": "^4.3.4", "dotenv": "^16.0.3", - "glob": "^8.1.0", + "glob": "^10.3.10", "mkdirp": "^2.1.3", "reflect-metadata": "^0.1.13", "sha.js": "^2.4.11", @@ -14765,13 +15731,13 @@ "peerDependencies": { "@google-cloud/spanner": "^5.18.0", "@sap/hana-client": "^2.12.25", - "better-sqlite3": "^7.1.2 || ^8.0.0", + "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", - "mongodb": "^5.2.0", - "mssql": "^9.1.1", + "mongodb": "^5.8.0", + "mssql": "^9.1.1 || ^10.0.1", "mysql2": "^2.2.5 || ^3.0.1", - "oracledb": "^5.1.0", + "oracledb": "^6.3.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", @@ -14835,46 +15801,34 @@ } } }, - "node_modules/typeorm/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typeorm/node_modules/glob": { - "version": "8.1.0", - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/typeorm/node_modules/mkdirp": { "version": "2.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", "peer": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" @@ -14886,10 +15840,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typeorm/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "peer": true + }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14900,8 +15860,9 @@ }, "node_modules/uglify-js": { "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -14912,7 +15873,8 @@ }, "node_modules/uid": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", "dependencies": { "@lukeed/csprng": "^1.0.0" }, @@ -14922,8 +15884,9 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -14934,31 +15897,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, - "node_modules/untildify": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.11", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -14973,7 +15936,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -14987,26 +15949,30 @@ }, "node_modules/upper-case-first": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/uri-js": { "version": "4.4.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } @@ -15021,51 +15987,27 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, - "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, "node_modules/validator": { - "version": "13.9.0", - "license": "MIT", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { "node": ">= 0.10" } @@ -15078,19 +16020,22 @@ }, "node_modules/vary": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, "node_modules/visit-values": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/visit-values/-/visit-values-2.0.0.tgz", + "integrity": "sha512-vLFU70y3D915d611GnHYeHkEmq6ZZETzTH4P1hM6I9E3lBwH2VeBBEESe/bGCY+gAyK0qqLFn5bNFpui/GKmww==", + "dev": true }, "node_modules/walker": { "version": "1.0.8", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dependencies": { "makeerror": "1.0.12" } @@ -15122,20 +16067,22 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "license": "MIT", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", "engines": { "node": ">= 8" } }, "node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -15194,9 +16141,30 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -15204,7 +16172,8 @@ }, "node_modules/which": { "version": "2.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, @@ -15217,8 +16186,9 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -15231,16 +16201,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15249,124 +16219,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { - "path-key": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/windows-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15381,11 +16257,13 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -15394,9 +16272,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/ws": { - "version": "8.13.0", - "license": "MIT", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -15415,7 +16299,8 @@ }, "node_modules/xtend": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } @@ -15428,26 +16313,21 @@ }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "17.7.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -15463,22 +16343,25 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 5a0a39b4..c3142493 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@bull-board/nestjs": "^5.8.3", "@bull-board/ui": "^5.8.3", "@dsnp/frequency-schemas": "^1.0.2", - "@dsnp/graph-sdk": "^1.0.1", + "@dsnp/graph-sdk": "1.0.1", "@frequency-chain/api-augment": "1.7.0", "@jest/globals": "^29.5.0", "@liaoliaots/nestjs-redis": "^9.0.5", @@ -86,7 +86,7 @@ "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@types/time-constants": "^1.0.0", - "@typescript-eslint/parser": "^5.59.8", + "@typescript-eslint/parser": "^6.18.1", "@typescript-eslint/typescript-estree": "5.59.8", "dotenv": "^16.3.1", "eslint": "^8.42.0", From cebcc306223b07b8fa0463ec3c60cc7a75f980b9 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:29:21 -0600 Subject: [PATCH 21/53] setup for e2e tests (#36) * setup for e2e tests * fix a bug * test placeholder * fix bug, add test * add private graph test * update readme with ways to run the service * enqueue same job easily * cleanup jobs on success * address comment * fix docker compose * add profile instant in simple test * simplify, for detailed e2e test scenario * detailed e2e test case * cleanup --- Makefile | 8 ++ README.md | 83 +++++++++++++++++ apps/api/src/api.service.ts | 18 ++-- apps/api/test/app.e2e-spec.ts | 90 +++++++++++++++++++ apps/api/test/jest-e2e.json | 9 ++ .../graph.publisher.processor.module.ts | 4 + .../graph.publisher.processor.service.ts | 2 - docker-compose.dev.yaml | 2 + env.template | 2 +- package.json | 3 +- 10 files changed, 205 insertions(+), 16 deletions(-) create mode 100644 apps/api/test/app.e2e-spec.ts create mode 100644 apps/api/test/jest-e2e.json diff --git a/Makefile b/Makefile index 2e2ae091..c12fbd41 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,14 @@ clean: clean-graph-service clean-graph-service: @rm -rf dist +###### +###### Testing targets +###### + +.PHONY: test-e2e +test-e2e: + @(npm run test:e2e) + ###### ###### Running apps targets ###### diff --git a/README.md b/README.md index 2be17b0f..dc8eeb17 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,86 @@ # Graph-Service A service enabling easy interaction with DSNP private and public graphs on Frequency + +## Table of Contents + +- [Graph-Service](#graph-service) + - [Table of Contents](#table-of-contents) + - [Prerequisites](#prerequisites) + - [Getting Started](#getting-started) + +## Prerequisites + +- [Docker](https://docs.docker.com/get-docker/) + +## Getting Started + +1. Clone the repository + + ```bash + git clone https://github.com/amplicalabls/graph-service.git + ``` + +2. Start docker compose + + ```bash + docker-compose -f docker-compose.dev.yaml --profile instant up + ``` + + This will start Frequency, Redis and Graph Service api/worker containers. + +3. Run a graph scenario from [frequency scenario templates](https://github.com/AmplicaLabs/frequency-scenario-template/tree/graph-service-setup). Note the use of branch `graph-service-setup` of the frequency scenario template repo. + + ```bash + git clone https://github.com/AmplicaLabs/frequency-scenario-template.git + cd frequency-scenario-template + git checkout graph-service-setup + npm run run-example --example=graph-migration-setup + ``` + + This will create `//Ferdie` as provider along with DSNPIds 2,3,4,5 and 6 as users. The template will also add a public key for each user in itemized storage needed for private graph operations. + +4. Go to [BullUI](http://0.0.0.0:3000/queues/) and check the graph service queue. +5. Check the [Swagger](http://0.0.0.0:3000/api/docs/swagger) for API documentation. + +## Running E2E tests + +1. Start redis and frequency with instant profile. + + ```bash + docker-compose -f docker-compose.dev.yaml --profile instant up frequency redis + ``` + + This will start Frequency and Redis containers. + +2. Using nest cli start the api and worker. + + ```bash + npx nest start api + npx nest start worker + ``` + + This will start the api and worker in watch mode. + +3. Run a graph scenario from [frequency scenario templates](https://github.com/AmplicaLabs/frequency-scenario-template/tree/graph-service-setup). Note the use of branch `graph-service-setup` of the frequency scenario template repo. + + ```bash + git clone https://github.com/AmplicaLabs/frequency-scenario-template.git + cd frequency-scenario-template + git checkout graph-service-setup + npm run run-example --example=graph-migration-setup + ``` + + This will create `//Ferdie` as provider along with DSNPIds 2,3,4,5 and 6 as users. The template will also add a public key for each user in itemized storage needed for private graph operations. + +4. Check the job in [BullUI](http://0.0.0.0:3000/queues/), to monitor job progress based on defined tests. + +5. Run the tests + + ```bash + npm run test:e2e + ``` + + This will run the tests in `apps/api/test` folder. + +6. Check e2e test file for more details on the test. diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index f237442e..aa130730 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -37,9 +37,7 @@ export class ApiService implements OnApplicationShutdown { } onApplicationShutdown(signal?: string | undefined) { - this.cleanupOnShutdown().then(() => { - this.logger.log('Cleanup on shutdown completed.'); - }); + this.logger.log('Cleanup on shutdown completed.'); } async enqueueRequest(request: ProviderGraphDto): Promise { @@ -48,9 +46,14 @@ export class ApiService implements OnApplicationShutdown { dsnpId: request.dsnpId, providerId, connections: request.connections.data, + graphKeyPairs: request.graphKeyPairs, referenceId: this.calculateJobId(request), updateConnection: this.configService.getReconnectionServiceRequired(), }; + const jobOld = await this.graphChangeRequestQueue.getJob(data.referenceId); + if (jobOld && (await jobOld.isCompleted())) { + await jobOld.remove(); + } const job = await this.graphChangeRequestQueue.add(`Request Job - ${data.referenceId}`, data, { jobId: data.referenceId }); this.logger.debug(job); return { @@ -89,13 +92,4 @@ export class ApiService implements OnApplicationShutdown { const stringVal = JSON.stringify(jobWithoutId); return createHash('sha1').update(stringVal).digest('base64url'); } - - private async cleanupOnShutdown(): Promise { - const keys = await this.redis.keys(`${QueueConstants.REDIS_WATCHER_PREFIX}:*`); - - if (keys.length > 0) { - await this.redis.del(keys); - this.logger.log(`Removed keys on shutdown: ${keys.join(', ')}`); - } - } } diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts new file mode 100644 index 00000000..26c48370 --- /dev/null +++ b/apps/api/test/app.e2e-spec.ts @@ -0,0 +1,90 @@ +/* eslint-disable import/no-extraneous-dependencies */ +/* eslint-disable no-undef */ +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import request from 'supertest'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { ApiModule } from '../src/api.module'; +import { ConnectionDto, GraphKeyPairDto, KeyType, PrivacyType, ProviderGraphDto } from '../../../libs/common/src'; +import { Direction } from '../../../libs/common/src/dtos/direction.dto'; +import { ConnectionType } from '../../../libs/common/src/dtos/connection.type.dto'; + +describe('Graph Service E2E request verification!', () => { + let app: INestApplication; + let module: TestingModule; + // eslint-disable-next-line no-promise-executor-return + const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); + beforeEach(async () => { + module = await Test.createTestingModule({ + imports: [ApiModule], + }).compile(); + + app = module.createNestApplication(); + const eventEmitter = app.get(EventEmitter2); + eventEmitter.on('shutdown', async () => { + await app.close(); + }); + app.useGlobalPipes(new ValidationPipe()); + app.enableShutdownHooks(); + await app.init(); + }); + + it('(GET) /api/health', () => request(app.getHttpServer()).get('/api/health').expect(200).expect({ status: 200, message: 'Service is healthy' })); + + describe('(POST) /api/update-graph', () => { + it('Valid public graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '2', + connections: { + data: [ + { + dsnpId: '4', + privacyType: PrivacyType.Public, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '2', + connections: { + data: [ + { + dsnpId: '4', + privacyType: PrivacyType.Private, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ + { + keyType: KeyType.X25519, + publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', + privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + } as GraphKeyPairDto, + ], + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + }); + + afterEach(async () => { + await app.close(); + }); +}); diff --git a/apps/api/test/jest-e2e.json b/apps/api/test/jest-e2e.json new file mode 100644 index 00000000..ac432d93 --- /dev/null +++ b/apps/api/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} \ No newline at end of file diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts index b6846e53..67921f49 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts @@ -58,6 +58,10 @@ import { GraphUpdatePublisherService } from './graph.publisher.processor.service }, { name: QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE, + defaultJobOptions: { + removeOnComplete: true, + removeOnFail: false, + }, }, ), ], diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index 0863e5b4..036938b1 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -80,8 +80,6 @@ export class GraphUpdatePublisherService extends BaseConsumer { const blockDelay = SECONDS_PER_BLOCK * MILLISECONDS_PER_SECOND; this.graphChangeNotifyQueue.add(`Graph Change Notify Job - ${txMonitorJob.id}`, txMonitorJob, { - removeOnFail: false, - removeOnComplete: 2000, delay: blockDelay, }); } catch (error: any) { diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 63331b67..865506d3 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -68,6 +68,7 @@ services: - frequency networks: - graph-service-service + profiles: ['instant'] graph-service-worker: build: @@ -87,6 +88,7 @@ services: - frequency networks: - graph-service-service + profiles: ['instant'] volumes: redis_data: chainstorage: diff --git a/env.template b/env.template index 9cf95ea9..d22ddfe4 100644 --- a/env.template +++ b/env.template @@ -39,7 +39,7 @@ GRAPH_ENVIRONMENT_DEV_CONFIG='{ "graphPublicKeySchemaId": 4 } ' -PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" +PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" PROVIDER_ID=1 # following are optional if reconnection service is is required diff --git a/package.json b/package.json index c3142493..1975c24a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "clean": "rm -Rf dist", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "pretest": "cp env.template .env", - "test": "jest --coverage --verbose" + "test": "jest --coverage --verbose", + "test:e2e": "set -a ; . .env ; jest --config ./apps/api/test/jest-e2e.json --detectOpenHandles" }, "repository": { "type": "git", From 6d820d729b78a24bbb37021e455540dbccfa7894 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Tue, 23 Jan 2024 11:31:17 -0600 Subject: [PATCH 22/53] Add e2e tests for get graph (#38) * add e2e tests for get graph * error handling for get graphs private * fix a bug in get graphs, all works private and public * free graph state upon debounced --- apps/api/test/app.e2e-spec.ts | 15 ++++++++++++++- .../graph.monitor.processor.service.ts | 3 ++- libs/common/src/services/async_debouncer.ts | 17 ++++++++++++----- libs/common/src/services/graph-state-manager.ts | 4 +++- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 26c48370..4cb18129 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -5,7 +5,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import request from 'supertest'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { ApiModule } from '../src/api.module'; -import { ConnectionDto, GraphKeyPairDto, KeyType, PrivacyType, ProviderGraphDto } from '../../../libs/common/src'; +import { ConnectionDto, GraphKeyPairDto, GraphsQueryParamsDto, KeyType, PrivacyType, ProviderGraphDto } from '../../../libs/common/src'; import { Direction } from '../../../libs/common/src/dtos/direction.dto'; import { ConnectionType } from '../../../libs/common/src/dtos/connection.type.dto'; @@ -82,6 +82,19 @@ describe('Graph Service E2E request verification!', () => { .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); }); + + it('Get graph request should work', async () => { + const userGraphGet: GraphsQueryParamsDto = { + dsnpIds: ['2'], + privacyType: PrivacyType.Public, + } as GraphsQueryParamsDto; + + await request(app.getHttpServer()) + .put(`/api/graphs`) + .send(userGraphGet) + .expect(200) + .expect((res) => expect(res.body[0].dsnpId).toBe('2')); + }); }); afterEach(async () => { diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 62976a2a..6c4c200f 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -66,13 +66,13 @@ export class GraphNotifierService extends BaseConsumer { } if (txResult.success) { - await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); this.logger.verbose(`Successfully found ${job.data.txHash} found in block ${txResult.blockHash}`); const webhookList = await this.getWebhookList(job.data.referencePublishJob.update.ownerDsnpUserId); this.logger.debug(`Found ${webhookList.length} webhooks for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); const requestJob: Job | undefined = await this.changeRequestQueue.getJob(job.data.referencePublishJob.referenceId); if (job.data.referencePublishJob.update.type !== 'AddKey') { + this.logger.debug(`Setting graph for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); const graphKeyPairs = requestJob?.data.graphKeyPairs ?? []; const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.referencePublishJob.update.ownerDsnpUserId); const schemaId: SchemaId = this.blockchainService.api.registry.createType('SchemaId', job.data.referencePublishJob.update.schemaId); @@ -103,6 +103,7 @@ export class GraphNotifierService extends BaseConsumer { } } }); + await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); } } } catch (e) { diff --git a/libs/common/src/services/async_debouncer.ts b/libs/common/src/services/async_debouncer.ts index f97a67f9..ef97ba62 100644 --- a/libs/common/src/services/async_debouncer.ts +++ b/libs/common/src/services/async_debouncer.ts @@ -47,6 +47,9 @@ export class AsyncDebouncerService { let privacyTypeValue = PrivacyType.Public; if (privacyType === 'private') { + if (!graphKeyPairs || graphKeyPairs.length === 0) { + throw new Error('Graph key pairs are required for private graph'); + } privacyTypeValue = PrivacyType.Private; } let graphEdges: DsnpGraphEdge[] = []; @@ -59,14 +62,18 @@ export class AsyncDebouncerService { } const debounceTime = this.configService.getDebounceSeconds(); await this.redis.setex(cacheKey, debounceTime, JSON.stringify(graphEdges)); - + // Remove the graph from the graph state after the debounce time + this.scheduleRemoveUserGraph(dsnpId, debounceTime); return Promise.resolve(graphEdges); } - async getInflightFuture(key: string, privacyType: string): Promise { - const cacheKey = this.getCacheKey(key, privacyType); - const cachedFuture = await this.redis.get(cacheKey); - return cachedFuture ? JSON.parse(cachedFuture) : null; + private async scheduleRemoveUserGraph(dsnpId: MessageSourceId, debounceTime: number): Promise { + return new Promise((resolve) => { + setTimeout(() => { + this.graphStateManager.removeUserGraph(dsnpId.toString()); + resolve(); + }, debounceTime * 1000); + }); } private getCacheKey(key: string, privacyType: string): string { diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts index 00d767a5..ea68f8c4 100644 --- a/libs/common/src/services/graph-state-manager.ts +++ b/libs/common/src/services/graph-state-manager.ts @@ -172,7 +172,9 @@ export class GraphStateManager implements OnApplicationBootstrap { if (privacyType === PrivacyType.Private) { const privateFollowConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), privateFollowSchemaId, false); const privateFriendConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), privateFriendSchemaId, false); - return privateFollowConnections.concat(privateFriendConnections); + if (privateFollowConnections.length > 0 || privateFriendConnections.length > 0) { + return privateFollowConnections.concat(privateFriendConnections); + } } if (privacyType === PrivacyType.Public) { const publicFollowConnections = this.graphState.getConnectionsForUserGraph(dsnpUserId.toString(), publicFollowSchemaId, false); From 338ff6cb3e989945d5e765defcc378b2b3324522 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:38:04 -0600 Subject: [PATCH 23/53] Add disconnecting action to API (#39) * disconnect action in graph service, follow/unfollow * undo changes * add a reconnection job for other graph to get updated --- .../request.processor.service.ts | 31 +++++++++++++------ docker-compose.dev.yaml | 2 +- libs/common/src/dtos/direction.dto.ts | 1 + swagger.yaml | 1 + 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 08e78083..adb4e3e1 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -3,7 +3,7 @@ import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; -import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys } from '@dsnp/graph-sdk'; +import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys, DisconnectAction, Action } from '@dsnp/graph-sdk'; import { MessageSourceId, SchemaGrantResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { Option, Vec } from '@polkadot/types'; import { AnyNumber } from '@polkadot/types/types'; @@ -41,7 +41,7 @@ export class RequestProcessorService extends BaseConsumer { const providerId: ProviderId = this.blockchainService.api.registry.createType('ProviderId', job.data.providerId); await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); // using graphConnections form Action[] and update the user's DSNP Graph - const actions: ConnectAction[] = await this.formConnections(dsnpUserId, providerId, job.data.updateConnection, job.data.connections); + const actions: Action[] = await this.formConnections(dsnpUserId, providerId, job.data.updateConnection, job.data.connections); try { if (actions.length === 0) { this.logger.debug(`No actions to apply for user ${dsnpUserId.toString()}`); @@ -103,9 +103,9 @@ export class RequestProcessorService extends BaseConsumer { providerId: MessageSourceId | AnyNumber, isTransitive: boolean, graphConnections: ConnectionDto[], - ): Promise { + ): Promise { const dsnpKeys: DsnpKeys = await this.graphStateManager.formDsnpKeys(dsnpUserId); - const actions: ConnectAction[] = []; + const actions: Action[] = []; // this.logger.debug(`Graph connections for user ${dsnpUserId.toString()}: ${JSON.stringify(graphConnections)}`); // Import DSNP public graph keys for connected users in private friendship connections await this.importConnectionKeys(graphConnections); @@ -164,11 +164,7 @@ export class RequestProcessorService extends BaseConsumer { if (isDelegatedConnection) { const { key: jobId, data } = createReconnectionJob(connection.dsnpId, providerId, SkipTransitiveGraphs); this.reconnectionQueue.remove(jobId); - this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { - jobId, - removeOnComplete: false, - removeOnFail: false, - }); + this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); } break; } @@ -195,6 +191,23 @@ export class RequestProcessorService extends BaseConsumer { } break; } + case 'disconnect': { + const connectionAction: DisconnectAction = { + type: 'Disconnect', + ownerDsnpUserId: dsnpUserId.toString(), + connection: { + dsnpUserId: connection.dsnpId, + schemaId, + }, + }; + actions.push(connectionAction); + if (isDelegatedConnection) { + const { key: jobId, data } = createReconnectionJob(connection.dsnpId, providerId, SkipTransitiveGraphs); + this.reconnectionQueue.remove(jobId); + this.reconnectionQueue.add(`graphUpdate:${data.dsnpId}`, data, { jobId }); + } + break; + } default: throw new Error(`Unrecognized connection direction: ${connection.direction}`); } diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 865506d3..0f9db7a8 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -47,7 +47,6 @@ services: container_name: frequency-manual-node volumes: - chainstorage:/data - graph-service-api: build: context: . @@ -89,6 +88,7 @@ services: networks: - graph-service-service profiles: ['instant'] + volumes: redis_data: chainstorage: diff --git a/libs/common/src/dtos/direction.dto.ts b/libs/common/src/dtos/direction.dto.ts index 599dcfce..97c0175e 100644 --- a/libs/common/src/dtos/direction.dto.ts +++ b/libs/common/src/dtos/direction.dto.ts @@ -3,4 +3,5 @@ export enum Direction { ConnectionTo = 'connectionTo', ConnectionFrom = 'connectionFrom', Bidirectional = 'bidirectional', + Disconnect = 'disconnect', } diff --git a/swagger.yaml b/swagger.yaml index 418f58ef..eba329be 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -159,6 +159,7 @@ components: - connectionTo - connectionFrom - bidirectional + - disconnect connectionType: type: string enum: From 7209acbdc07bd939fbd5cdda378a27240491d4ef Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:02:47 -0600 Subject: [PATCH 24/53] E2E test for disconnection (#41) * disconnect action in graph service, follow/unfollow * undo changes * add a reconnection job for other graph to get updated * add e2e disconnect test --- apps/api/test/app.e2e-spec.ts | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 4cb18129..2a6c7306 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -95,6 +95,81 @@ describe('Graph Service E2E request verification!', () => { .expect(200) .expect((res) => expect(res.body[0].dsnpId).toBe('2')); }); + + it('Get graph request should work with private graph', async () => { + const userGraphGet: GraphsQueryParamsDto = { + dsnpIds: ['2'], + privacyType: PrivacyType.Private, + graphKeyPairs: [ + { + keyType: KeyType.X25519, + publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', + privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + } as GraphKeyPairDto, + ], + } as GraphsQueryParamsDto; + + await request(app.getHttpServer()) + .put(`/api/graphs`) + .send(userGraphGet) + .expect(200) + .expect((res) => expect(res.body[0].dsnpId).toBe('2')); + }); + }); + + describe('(POST) /api/update-graph with public disconnect', () => { + it('Valid public graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '2', + connections: { + data: [ + { + dsnpId: '4', + privacyType: PrivacyType.Public, + direction: Direction.Disconnect, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + }); + + describe('(POST) /api/update-graph with private disconnect', () => { + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '2', + connections: { + data: [ + { + dsnpId: '4', + privacyType: PrivacyType.Private, + direction: Direction.Disconnect, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ + { + keyType: KeyType.X25519, + publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', + privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + } as GraphKeyPairDto, + ], + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); }); afterEach(async () => { From bbe79a5bb32aea76da3661f8279ec9a514b04edc Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Thu, 25 Jan 2024 12:35:34 -0600 Subject: [PATCH 25/53] add e2e test for bidrectional connection request (#42) * add test for bidrectional connection request * clear graph before processing and add e3e test for private friendship --- apps/api/test/app.e2e-spec.ts | 85 +++++++++++++++++++ .../request.processor.service.ts | 1 + 2 files changed, 86 insertions(+) diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 2a6c7306..9a194915 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -172,6 +172,91 @@ describe('Graph Service E2E request verification!', () => { }); }); + describe('(POST) /api/update-graph with private friend request from 2', () => { + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '2', + connections: { + data: [ + { + dsnpId: '3', + privacyType: PrivacyType.Private, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Friendship, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ + { + keyType: KeyType.X25519, + publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', + privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + } as GraphKeyPairDto, + ], + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + }); + + describe('(POST) /api/update-graph with private friend request from 3', () => { + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '3', + connections: { + data: [ + { + dsnpId: '2', + privacyType: PrivacyType.Private, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Friendship, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ + { + keyType: KeyType.X25519, + publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', + privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + } as GraphKeyPairDto, + ], + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + }); + describe('(POST) /api/update-graph with bi-directional connection', () => { + it('Valid public graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: '2', + connections: { + data: [ + { + dsnpId: '5', + privacyType: PrivacyType.Public, + direction: Direction.Bidirectional, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }; + + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + }); + afterEach(async () => { await app.close(); }); diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index adb4e3e1..72809305 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -39,6 +39,7 @@ export class RequestProcessorService extends BaseConsumer { try { const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.dsnpId); const providerId: ProviderId = this.blockchainService.api.registry.createType('ProviderId', job.data.providerId); + this.graphStateManager.removeUserGraph(dsnpUserId.toString()); await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); // using graphConnections form Action[] and update the user's DSNP Graph const actions: Action[] = await this.formConnections(dsnpUserId, providerId, job.data.updateConnection, job.data.connections); From 6ed82e62724d1d0f4ef836baea7b7bbd93c6349b Mon Sep 17 00:00:00 2001 From: Matthew Orris <1466844+mattheworris@users.noreply.github.com> Date: Fri, 26 Jan 2024 02:50:07 +0800 Subject: [PATCH 26/53] feat: Add 'DeletePage' case to GraphUpdatePublisherService (#43) --- .../graph.publisher.processor.service.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index 036938b1..d3037332 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -63,6 +63,18 @@ export class GraphUpdatePublisherService extends BaseConsumer { statefulStorageTxHash = await this.processSingleBatch(providerKeys, tx); break; } + case 'DeletePage': { + const providerKeys = createKeys(this.configService.getProviderAccountSeedPhrase()); + const tx = this.blockchainService.createExtrinsicCall( + { pallet: 'statefulStorage', extrinsic: 'deletePage' }, + job.data.update.ownerDsnpUserId, + job.data.update.schemaId, + job.data.update.pageId, + job.data.update.prevHash, + ); + statefulStorageTxHash = await this.processSingleBatch(providerKeys, tx); + break; + } default: break; } From 1184869d7f94c31560e4553907d255e3a47cbf48 Mon Sep 17 00:00:00 2001 From: Matthew Orris <1466844+mattheworris@users.noreply.github.com> Date: Wed, 31 Jan 2024 02:50:18 +0800 Subject: [PATCH 27/53] feat: Add capacity limit configuration and pause/resume publish queue (#37) The Graph Service can be configured to use a specified amount or percentage of Capacity per Epoch. Example configuration from env.template # Configure the amount of capacity Graph Service can use. CAPACITY_LIMIT='{"type":"percentage", "value":80}' When the limit is reached, Graph Service will determine how many seconds until the next Capacity Epoch and set a timeout to check if Capacity is refilled at that time. If the Graph Service CAPACITY_LIMIT is not reached, but an update transaction fails due to low balance, that failed transaction will be retried when the capacity is refilled. How to Test: - npm run test:e2e should pass To cause a capacity transaction to fail: - Setup the testing environment as per the README.md in your local environment, including the frequency scenario template. - Use the polkadot UI to unstake from Ferdie who is provider 1 with amount 2000000000000000 - Use the swagger api to send an update to the graph service. - Check the log messages from the Nest Worker App to confirm the queue is paused, and the BullMQ Dashboard to see that a job has failed in the graphChangePublish queue. - Use the polkadot UI to stake back to Ferdie, msa 1, amount 2000000000000000 - Check the worker logs to see the failed job is retried. Closes #34 --- .env.dev | 3 + .vscode/launch.json | 7 + apps/api/src/api.module.ts | 2 +- apps/api/test/app.e2e-spec.ts | 42 ++++++ .../graph.publisher.processor.service.ts | 132 ++++++++++++++---- .../request.processor.module.ts | 2 +- apps/worker/src/worker.module.ts | 2 +- env.template | 3 + .../src/blockchain/blockchain.service.spec.ts | 55 +++++++- .../src/blockchain/blockchain.service.ts | 30 ++++ libs/common/src/config/config.service.spec.ts | 18 +++ libs/common/src/config/config.service.ts | 9 ++ libs/common/src/config/env.config.ts | 27 ++++ .../interfaces/capacity-limit.interface.ts | 4 + package.json | 2 +- 15 files changed, 303 insertions(+), 35 deletions(-) create mode 100644 libs/common/src/interfaces/capacity-limit.interface.ts diff --git a/.env.dev b/.env.dev index 94a164df..db842972 100644 --- a/.env.dev +++ b/.env.dev @@ -5,6 +5,9 @@ QUEUE_HIGH_WATER=1000 API_PORT=3000 DEBOUNCE_SECONDS=10 +# Configure the amount of capacity Graph Service can use. +CAPACITY_LIMIT='{"type":"percentage", "value":80}' + # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev diff --git a/.vscode/launch.json b/.vscode/launch.json index d592e73c..efb99404 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -22,5 +22,12 @@ "sourceMaps": true, "cwd": "${workspaceRoot}", }, + { + "type": "node", + "request": "attach", + "name": "Attach to Worker", + "port": 9230, + "restart": true, + } ] } diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index e788d6e2..73ab32ce 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -82,7 +82,7 @@ import { GraphStateManager, QueueConstants } from '../../../libs/common/src'; defaultJobOptions: { removeOnComplete: true, removeOnFail: false, - attempts: 3, + attempts: 1, }, }, { diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 9a194915..d258c883 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -54,6 +54,48 @@ describe('Graph Service E2E request verification!', () => { .expect((res) => expect(res.text).toContain('referenceId')); }); + it('Two Valid public graph update requests should work', async () => { + const validGraphChangeRequests: ProviderGraphDto[] = [ + { + dsnpId: '4', + connections: { + data: [ + { + dsnpId: '5', + privacyType: PrivacyType.Public, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }, + { + dsnpId: '6', + connections: { + data: [ + { + dsnpId: '3', + privacyType: PrivacyType.Public, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }, + ]; + + const requests = validGraphChangeRequests.map((requestPayload) => { + console.log(`requestPayload.dsnpId: ${requestPayload.dsnpId}`); + return request(app.getHttpServer()) + .post(`/api/update-graph`) + .send(requestPayload) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); + + await Promise.all(requests); + }); + it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: '2', diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index d3037332..64073b04 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -1,6 +1,6 @@ import { InjectRedis } from '@liaoliaots/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; -import { Injectable } from '@nestjs/common'; +import { Injectable, OnApplicationShutdown } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; import { Hash } from '@polkadot/types/interfaces'; @@ -8,7 +8,7 @@ import { KeyringPair } from '@polkadot/keyring/types'; import { SubmittableExtrinsic } from '@polkadot/api-base/types'; import { ISubmittableResult } from '@polkadot/types/types'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; -import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; +import { SchedulerRegistry } from '@nestjs/schedule'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; import { QueueConstants, NonceService } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; @@ -18,10 +18,26 @@ import { createKeys } from '../../../../libs/common/src/blockchain/create-keys'; import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; export const SECONDS_PER_BLOCK = 12; +const CAPACITY_EPOCH_TIMEOUT_NAME = 'capacity_check'; +/** + * Service responsible for publishing graph updates. + */ @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) -export class GraphUpdatePublisherService extends BaseConsumer { +export class GraphUpdatePublisherService extends BaseConsumer implements OnApplicationShutdown { + public async onApplicationBootstrap() { + await this.checkCapacity(); + } + + public async onApplicationShutdown(signal?: string | undefined): Promise { + try { + this.schedulerRegistry.deleteTimeout(CAPACITY_EPOCH_TIMEOUT_NAME); + } catch (err) { + // ignore + } + } + constructor( @InjectRedis() private cacheManager: Redis, @InjectQueue(QueueConstants.GRAPH_CHANGE_PUBLISH_QUEUE) private graphChangePublishQueue: Queue, @@ -29,7 +45,7 @@ export class GraphUpdatePublisherService extends BaseConsumer { private configService: ConfigService, private blockchainService: BlockchainService, private nonceService: NonceService, - private emitter: EventEmitter2, + private schedulerRegistry: SchedulerRegistry, ) { super(); } @@ -40,11 +56,11 @@ export class GraphUpdatePublisherService extends BaseConsumer { * @returns A promise that resolves when the job is processed. */ async process(job: Job): Promise { - this.logger.log(`Processing job ${job.id} of type ${job.name}`); let statefulStorageTxHash: Hash = {} as Hash; - const lastFinalizedBlockHash = await this.blockchainService.getLatestFinalizedBlockHash(); - const currentCapacityEpoch = await this.blockchainService.getCurrentCapacityEpoch(); try { + this.logger.log(`Processing job ${job.id} of type ${job.name}`); + const lastFinalizedBlockHash = await this.blockchainService.getLatestFinalizedBlockHash(); + const currentCapacityEpoch = await this.blockchainService.getCurrentCapacityEpoch(); switch (job.data.update.type) { case 'PersistPage': { let payloadData: number[] = []; @@ -79,7 +95,7 @@ export class GraphUpdatePublisherService extends BaseConsumer { break; } - this.logger.debug(`job: ${JSON.stringify(job, null, 2)}`); + this.logger.debug(`successful job: ${JSON.stringify(job, null, 2)}`); // Add a job to the graph change notify queue const txMonitorJob: ITxMonitorJob = { @@ -91,17 +107,15 @@ export class GraphUpdatePublisherService extends BaseConsumer { }; const blockDelay = SECONDS_PER_BLOCK * MILLISECONDS_PER_SECOND; + this.logger.debug(`Adding job to graph change notify queue: ${txMonitorJob.id}`); this.graphChangeNotifyQueue.add(`Graph Change Notify Job - ${txMonitorJob.id}`, txMonitorJob, { delay: blockDelay, }); } catch (error: any) { - // If error message starts with `1010: Invalid Transaction: Inability to pay some fees, e.g. account balance too low` - // then emit an event to pause the queues - if (error.message.startsWith('1010: Invalid Transaction: Inability to pay some fees')) { - this.emitter.emit('lowCapacity'); - } this.logger.error(error); throw error; + } finally { + await this.checkCapacity(); } } @@ -114,7 +128,7 @@ export class GraphUpdatePublisherService extends BaseConsumer { * @throws Error if the transaction hash is undefined or if there is an error processing the batch. */ async processSingleBatch(providerKeys: KeyringPair, tx: SubmittableExtrinsic<'rxjs', ISubmittableResult>): Promise { - this.logger.debug(`Submitting tx of size ${tx.length}`); + this.logger.debug(`Submitting tx of size ${tx.length}, nonce:${tx.nonce}, method: ${tx.method.section}.${tx.method.method}`); try { const ext = this.blockchainService.createExtrinsic( { pallet: 'frequencyTxPayment', extrinsic: 'payWithCapacity' }, @@ -123,6 +137,7 @@ export class GraphUpdatePublisherService extends BaseConsumer { tx, ); const nonce = await this.nonceService.getNextNonce(); + this.logger.debug(`Capacity Wrapped Extrinsic: ${ext}, nonce:${nonce}`); const [txHash, _] = await ext.signAndSend(nonce); if (!txHash) { throw new Error('Tx hash is undefined'); @@ -136,22 +151,81 @@ export class GraphUpdatePublisherService extends BaseConsumer { } /** - * Handles low capacity by pausing the graph change notify queue. - * @returns A promise that resolves when the queue is paused. + * Checks the capacity of the graph publisher and takes appropriate actions based on the capacity status. + * If the capacity is exhausted, it pauses the graph change publish queue and sets a timeout to check the capacity again. + * If the capacity is refilled, it resumes the graph change publish queue and clears the timeout. + * If any jobs failed due to low balance/no capacity, it retries them. + * If any error occurs during the capacity check, it logs the error. */ - @OnEvent('lowCapacity', { async: true, promisify: true }) - private async handleLowCapacity(): Promise { - this.logger.debug('Pausing graph change notify queue'); - // await this.graphChangePublishQueue.pause(); - } + private async checkCapacity(): Promise { + try { + const capacityLimit = this.configService.getCapacityLimit(); + const capacityInfo = await this.blockchainService.capacityInfo(this.configService.getProviderId()); + const { remainingCapacity } = capacityInfo; + const { currentEpoch } = capacityInfo; + const epochCapacityKey = `epochCapacity:${currentEpoch}`; + const epochUsedCapacity = BigInt((await this.cacheManager.get(epochCapacityKey)) ?? 0); // Fetch capacity used by the service + let outOfCapacity = remainingCapacity <= 0n; - /** - * Handles capacity recovered by resuming the graph change notify queue. - * @returns A promise that resolves when the queue is resumed. - */ - @OnEvent('capacityRecovered', { async: true, promisify: true }) - private async handleCapacityRecovered(): Promise { - this.logger.debug('Resuming graph change notify queue'); - // await this.graphChangeNotifyQueue.resume(); + if (!outOfCapacity) { + this.logger.debug(`Capacity remaining: ${remainingCapacity}`); + if (capacityLimit.type === 'percentage') { + const capacityLimitPercentage = BigInt(capacityLimit.value); + const capacityLimitThreshold = (capacityInfo.totalCapacityIssued * capacityLimitPercentage) / 100n; + this.logger.debug(`Capacity limit threshold: ${capacityLimitThreshold}`); + if (epochUsedCapacity >= capacityLimitThreshold) { + outOfCapacity = true; + this.logger.warn(`Capacity threshold reached: used ${epochUsedCapacity} of ${capacityLimitThreshold}`); + } + } else if (epochUsedCapacity >= capacityLimit.value) { + outOfCapacity = true; + this.logger.warn(`Capacity threshold reached: used ${epochUsedCapacity} of ${capacityLimit.value}`); + } + } + + if (outOfCapacity) { + await this.graphChangePublishQueue.pause(); + const blocksRemaining = capacityInfo.nextEpochStart - capacityInfo.currentBlockNumber; + const epochTimeout = blocksRemaining * SECONDS_PER_BLOCK * MILLISECONDS_PER_SECOND; + this.logger.warn(`Capacity Exhausted: Pausing graph change publish queue until next epoch: ${epochTimeout / 1000} seconds`); + try { + // Check if a timeout with the same name already exists + if (this.schedulerRegistry.doesExist('timeout', CAPACITY_EPOCH_TIMEOUT_NAME)) { + // If it does, delete it + this.schedulerRegistry.deleteTimeout(CAPACITY_EPOCH_TIMEOUT_NAME); + } + + // Add the new timeout + this.schedulerRegistry.addTimeout( + CAPACITY_EPOCH_TIMEOUT_NAME, + setTimeout(() => this.checkCapacity(), epochTimeout), + ); + } catch (err) { + // Handle any errors + console.error(err); + } + } else { + this.logger.verbose('Capacity Available: Resuming graph change publish queue and clearing timeout'); + // Get the failed jobs and check if they failed due to capacity + const failedJobs = await this.graphChangePublishQueue.getFailed(); + const capacityFailedJobs = failedJobs.filter((job) => job.failedReason?.includes('1010: Invalid Transaction: Inability to pay some fees')); + // Retry the failed jobs + await Promise.all( + capacityFailedJobs.map(async (job) => { + this.logger.debug(`Retrying job ${job.id}`); + job.retry(); + }), + ); + try { + this.schedulerRegistry.deleteTimeout(CAPACITY_EPOCH_TIMEOUT_NAME); + } catch (err) { + // ignore + } + + await this.graphChangePublishQueue.resume(); + } + } catch (err) { + this.logger.error('Caught error in checkCapacity', err); + } } } diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts index 11091d14..63ea6d9d 100644 --- a/apps/worker/src/request_processor/request.processor.module.ts +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -62,7 +62,7 @@ import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockch defaultJobOptions: { removeOnComplete: true, removeOnFail: false, - attempts: 3, + attempts: 1, }, }, { diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index fdcb872c..128ff0ea 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -61,7 +61,7 @@ import { BlockchainScannerService } from '../../../libs/common/src/services/bloc defaultJobOptions: { removeOnComplete: true, removeOnFail: false, - attempts: 3, + attempts: 1, }, }, { diff --git a/env.template b/env.template index d22ddfe4..27381055 100644 --- a/env.template +++ b/env.template @@ -5,6 +5,9 @@ QUEUE_HIGH_WATER=1000 API_PORT=3000 DEBOUNCE_SECONDS=10 +# Configure the amount of capacity Graph Service can use. +CAPACITY_LIMIT='{"type":"percentage", "value":80}' + # Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev diff --git a/libs/common/src/blockchain/blockchain.service.spec.ts b/libs/common/src/blockchain/blockchain.service.spec.ts index 1a172bf9..a6468b19 100644 --- a/libs/common/src/blockchain/blockchain.service.spec.ts +++ b/libs/common/src/blockchain/blockchain.service.spec.ts @@ -1,10 +1,45 @@ -import { describe, it, beforeEach } from '@jest/globals'; +import { describe, it, beforeEach, jest, expect } from '@jest/globals'; +import { u32 } from '@polkadot/types'; import { BlockchainService } from './blockchain.service'; +import { ConfigService } from '../config/config.service'; describe('BlockchainService', () => { + let mockApi: any; let blockchainService: BlockchainService; - beforeEach(async () => {}); + beforeEach(async () => { + mockApi = { + createType: jest.fn(), + query: jest.fn(), + }; + const configService = { + logger: jest.fn(), + nestConfigService: jest.fn(), + providerBaseUrl: jest.fn(), + providerApiToken: jest.fn(), + getProviderId: jest.fn(), + getQueueHighWater: jest.fn(), + getApiPort: jest.fn(), + getReconnectionServiceRequired: jest.fn(), + getBlockchainScanIntervalMinutes: jest.fn(), + getRedisUrl: jest.fn(), + getFrequencyUrl: jest.fn(), + getGraphEnvironmentType: jest.fn(), + getGraphEnvironmentConfig: jest.fn(), + getProviderAccountSeedPhrase: jest.fn(), + redisUrl: jest.fn(), + frequencyUrl: jest.fn(), + getHealthCheckMaxRetries: jest.fn(), + getHealthCheckMaxRetryIntervalSeconds: jest.fn(), + getHealthCheckSuccessThreshold: jest.fn(), + getWebhookFailureThreshold: jest.fn(), + getWebhookRetryIntervalSeconds: jest.fn(), + webhookRetryIntervalSeconds: jest.fn(), + getPageSize: jest.fn(), + getDebounceSeconds: jest.fn(), + }; + blockchainService = new BlockchainService(configService as unknown as ConfigService); + }); describe('createExtrinsicCall', () => { it('should return an extrinsic call', async () => { @@ -15,4 +50,20 @@ describe('BlockchainService', () => { const payloadLength = 100; }); }); + + describe('getCurrentCapacityEpochStart', () => { + it('should return the current capacity epoch start', async () => { + // Arrange + const expectedEpochStart: u32 = mockApi.createType('u32', 123); + const currentEpochInfo = { epochStart: expectedEpochStart }; + + jest.spyOn(blockchainService, 'query').mockResolvedValue(currentEpochInfo); + + // Act + const result = await blockchainService.getCurrentCapacityEpochStart(); + + // Assert + expect(result).toBe(expectedEpochStart); + }); + }); }); diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts index de83e639..fa2c1e04 100644 --- a/libs/common/src/blockchain/blockchain.service.ts +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -127,11 +127,41 @@ export class BlockchainService implements OnApplicationBootstrap, OnApplicationS return schema; } + public async capacityInfo(providerId: string): Promise<{ + providerId: string; + currentBlockNumber: number; + nextEpochStart: number; + remainingCapacity: bigint; + totalCapacityIssued: bigint; + currentEpoch: bigint; + }> { + const providerU64 = this.api.createType('u64', providerId); + const { epochStart }: PalletCapacityEpochInfo = await this.query('capacity', 'currentEpochInfo'); + const epochBlockLength: u32 = await this.query('capacity', 'epochLength'); + const capacityDetailsOption: Option = await this.query('capacity', 'capacityLedger', providerU64); + const { remainingCapacity, totalCapacityIssued } = capacityDetailsOption.unwrapOr({ remainingCapacity: 0, totalCapacityIssued: 0 }); + const currentBlock: u32 = await this.query('system', 'number'); + const currentEpoch = await this.getCurrentCapacityEpoch(); + return { + currentEpoch, + providerId, + currentBlockNumber: currentBlock.toNumber(), + nextEpochStart: epochStart.add(epochBlockLength).toNumber(), + remainingCapacity: typeof remainingCapacity === 'number' ? BigInt(remainingCapacity) : remainingCapacity.toBigInt(), + totalCapacityIssued: typeof totalCapacityIssued === 'number' ? BigInt(totalCapacityIssued) : totalCapacityIssued.toBigInt(), + }; + } + public async getCurrentCapacityEpoch(): Promise { const currentEpoch: u32 = await this.query('capacity', 'currentEpoch'); return typeof currentEpoch === 'number' ? BigInt(currentEpoch) : currentEpoch.toBigInt(); } + public async getCurrentCapacityEpochStart(): Promise { + const currentEpochInfo: PalletCapacityEpochInfo = await this.query('capacity', 'currentEpochInfo'); + return currentEpochInfo.epochStart; + } + public async getCurrentEpochLength(): Promise { const epochLength: u32 = await this.query('capacity', 'epochLength'); return typeof epochLength === 'number' ? epochLength : epochLength.toNumber(); diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index 4cd65411..0f895365 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -55,6 +55,7 @@ describe('GraphSericeConfig', () => { HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: undefined, HEALTH_CHECK_MAX_RETRIES: undefined, PAGE_SIZE: undefined, + CAPACITY_LIMIT: undefined, }; beforeAll(() => { @@ -98,6 +99,19 @@ describe('GraphSericeConfig', () => { const { GRAPH_ENVIRONMENT_TYPE: dummy, GRAPH_ENVIRONMENT_DEV_CONFIG: dummy2, ...env } = ALL_ENV; await expect(setupConfigService({ GRAPH_ENVIRONMENT_TYPE: 'Dev', GRAPH_ENVIRONMENT_DEV_CONFIG: 'invalid json', ...env })).rejects.toBeDefined(); }); + + it('missing capacity limits should fail', async () => { + const { CAPACITY_LIMIT: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ CAPACITY_LIMIT: undefined, ...env })).rejects.toBeDefined(); + }); + + it('invalid capacity limit should fail', async () => { + const { CAPACITY_LIMIT: dummy, ...env } = ALL_ENV; + await expect(setupConfigService({ CAPACITY_LIMIT: '{ "type": "bad type", "value": 0 }', ...env })).rejects.toBeDefined(); + await expect(async () => setupConfigService({ CAPACITY_LIMIT: '{ "type": "percentage", "value": -1 }', ...env })).rejects.toBeDefined(); + await expect(setupConfigService({ CAPACITY_LIMIT: '{ "type": "percentage", "value": 101 }', ...env })).rejects.toBeDefined(); + await expect(setupConfigService({ CAPACITY_LIMIT: '{ "type": "amount", "value": -1 }', ...env })).rejects.toBeDefined(); + }); }); describe('valid environment', () => { @@ -185,5 +199,9 @@ describe('GraphSericeConfig', () => { it('should get debounce seconds', () => { expect(graphServiceConfig.getDebounceSeconds()).toStrictEqual(parseInt(ALL_ENV.DEBOUNCE_SECONDS as string, 10)); }); + + it('should get capacity limit', () => { + expect(graphServiceConfig.getCapacityLimit()).toStrictEqual(JSON.parse(ALL_ENV.CAPACITY_LIMIT!)); + }); }); }); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index b47b78b0..f9b04eda 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -5,6 +5,7 @@ https://docs.nestjs.com/providers#services import { EnvironmentType } from '@dsnp/graph-sdk'; import { Injectable, Logger } from '@nestjs/common'; import { ConfigService as NestConfigService } from '@nestjs/config'; +import { ICapacityLimit } from '../interfaces/capacity-limit.interface'; export interface ConfigEnvironmentVariables { REDIS_URL: URL; @@ -26,15 +27,19 @@ export interface ConfigEnvironmentVariables { HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: number; HEALTH_CHECK_MAX_RETRIES: number; PAGE_SIZE: number; + CAPACITY_LIMIT: number; } /// Config service to get global app and provider-specific config values. @Injectable() export class ConfigService { + private capacityLimit: ICapacityLimit; + private logger: Logger; constructor(private nestConfigService: NestConfigService) { this.logger = new Logger(this.constructor.name); + this.capacityLimit = JSON.parse(this.nestConfigService.get('CAPACITY_LIMIT')!); } public get providerBaseUrl(): URL { @@ -124,4 +129,8 @@ export class ConfigService { public getDebounceSeconds(): number { return this.nestConfigService.get('DEBOUNCE_SECONDS')!; } + + public getCapacityLimit(): ICapacityLimit { + return this.capacityLimit; + } } diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index 4dfa0753..11c948bf 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -51,5 +51,32 @@ export const configModuleOptions: ConfigModuleOptions = { HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: Joi.number().min(1).default(64), HEALTH_CHECK_MAX_RETRIES: Joi.number().min(0).default(20), PAGE_SIZE: Joi.number().min(1).default(100), + CAPACITY_LIMIT: Joi.string() + .custom((value: string, helpers) => { + try { + const obj = JSON.parse(value); + const schema = Joi.object({ + type: Joi.string() + .required() + .pattern(/^(percentage|amount)$/), + value: Joi.alternatives() + .conditional('type', { + is: 'percentage', + then: Joi.number().min(0).max(100), + otherwise: Joi.number().min(0), + }) + .required(), + }); + const result = schema.validate(obj); + if (result.error) { + return helpers.error('any.invalid'); + } + } catch (e) { + return helpers.error('any.invalid'); + } + + return value; + }) + .required(), }), }; diff --git a/libs/common/src/interfaces/capacity-limit.interface.ts b/libs/common/src/interfaces/capacity-limit.interface.ts new file mode 100644 index 00000000..d2b1d858 --- /dev/null +++ b/libs/common/src/interfaces/capacity-limit.interface.ts @@ -0,0 +1,4 @@ +export interface ICapacityLimit { + type: 'percentage' | 'amount'; + value: number; +} diff --git a/package.json b/package.json index 1975c24a..5e307c56 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "start:worker": "nest start worker", "start:worker:prod": "node dist/apps/worker/main.js", "start:worker:dev": "set -a ; . .env ; nest start worker", - "start:worker:debug": "set -a ; . .env ;nest start worker --debug --watch", + "start:worker:debug": "set -a ; . .env ;nest start worker --debug=9230 --watch", "docker-build": "docker build -t graph-service-service .", "docker-build:dev": "docker-compose -f docker-compose.dev.yaml build", "docker-run": " build -t graph-service-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-service-deploy", From 868ad8b50b53eaef976418180986c2e350cee3d0 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat Date: Wed, 31 Jan 2024 18:37:24 -0600 Subject: [PATCH 28/53] fix docker build for worker --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e307c56..552c59dc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Graph Service enabling handling of users graph data on the Frequency Network", "main": "dist/apps/api/main.js", "scripts": { - "build": "nest build", + "build": "nest build api && nest build worker", "build:swagger": "npx ts-node apps/api/src/generate-metadata.ts", "generate-swagger-ui": "redoc-cli bundle swagger.yaml --output=./docs/index.html", "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", From cc1a8c44558f5068ae964b3ec128db5b3ef4d452 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Thu, 1 Feb 2024 09:51:57 -0600 Subject: [PATCH 29/53] use published docker image for test env (#49) * use published docker image for test env * park * remove hc * fix build and address feedback * fix build * update readme for e2e: cant hc frq so start separately * update readme * run scenario before starting api/worker * make signSend async * fix docker env * fix default compose * e2e tests with docker images --- .env.dev | 4 +- README.md | 25 +++---- docker-compose.dev.yaml | 6 +- docker-compose.yaml | 95 +++++++++++++++++++++++++ libs/common/src/blockchain/extrinsic.ts | 23 +++--- 5 files changed, 123 insertions(+), 30 deletions(-) create mode 100644 docker-compose.yaml diff --git a/.env.dev b/.env.dev index db842972..32dccb67 100644 --- a/.env.dev +++ b/.env.dev @@ -1,6 +1,6 @@ # Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development -FREQUENCY_URL=ws://0.0.0.0:9944 -REDIS_URL=redis://0.0.0.0:6379 +FREQUENCY_URL=ws://frequency:9944 +REDIS_URL=redis://redis:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 DEBOUNCE_SECONDS=10 diff --git a/README.md b/README.md index dc8eeb17..fb272778 100644 --- a/README.md +++ b/README.md @@ -45,24 +45,17 @@ A service enabling easy interaction with DSNP private and public graphs on Frequ ## Running E2E tests -1. Start redis and frequency with instant profile. - - ```bash - docker-compose -f docker-compose.dev.yaml --profile instant up frequency redis - ``` - - This will start Frequency and Redis containers. +Note: using [docker compose file](docker-compose.yaml) with `instant` profile to start the services. This will start the services in development mode. -2. Using nest cli start the api and worker. +1. Start redis and frequency with instant profile. ```bash - npx nest start api - npx nest start worker + docker-compose --profile instant up -d redis frequency ``` - This will start the api and worker in watch mode. + This will start Frequency and Redis -3. Run a graph scenario from [frequency scenario templates](https://github.com/AmplicaLabs/frequency-scenario-template/tree/graph-service-setup). Note the use of branch `graph-service-setup` of the frequency scenario template repo. +2. Once [Frequency](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer) is up. Run a graph scenario from [frequency scenario templates](https://github.com/AmplicaLabs/frequency-scenario-template/tree/graph-service-setup). Note the use of branch `graph-service-setup` of the frequency scenario template repo. ```bash git clone https://github.com/AmplicaLabs/frequency-scenario-template.git @@ -73,6 +66,14 @@ A service enabling easy interaction with DSNP private and public graphs on Frequ This will create `//Ferdie` as provider along with DSNPIds 2,3,4,5 and 6 as users. The template will also add a public key for each user in itemized storage needed for private graph operations. +3. Run the following command to start the graph service api and worker containers. + + ```bash + docker-compose --profile instant up -d api worker + ``` + + This will start the graph service api and worker in development mode. + 4. Check the job in [BullUI](http://0.0.0.0:3000/queues/), to monitor job progress based on defined tests. 5. Run the tests diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 0f9db7a8..af0557c3 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -58,8 +58,6 @@ services: - .env.dev environment: - START_PROCESS=api - - REDIS_URL=redis://redis:6379 - - FREQUENCY_URL=http://frequency:9944 volumes: - ./:/app depends_on: @@ -68,6 +66,7 @@ services: networks: - graph-service-service profiles: ['instant'] + restart: on-failure graph-service-worker: build: @@ -78,8 +77,6 @@ services: - .env.dev environment: - START_PROCESS=worker - - REDIS_URL=redis://redis:6379 - - FREQUENCY_URL=http://frequency:9944 volumes: - ./:/app depends_on: @@ -88,6 +85,7 @@ services: networks: - graph-service-service profiles: ['instant'] + restart: on-failure volumes: redis_data: diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..a536cdb9 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,95 @@ +version: '3' + +services: + redis: + image: redis:latest + ports: + - 6379:6379 + volumes: + - redis_data:/data/redis + networks: + - graph-service-service + + frequency: + image: frequencychain/instant-seal-node:latest + platform: linux/amd64 + ports: + - 9944:9944 + profiles: ['', 'instant'] + networks: + - graph-service-service + container_name: frequency + volumes: + - chainstorage:/data + + frequency-interval: + image: frequencychain/instant-seal-node:latest + command: --sealing=interval --sealing-interval 3 --sealing-create-empty-blocks + ports: + - 9944:9944 + profiles: + - 'interval' + networks: + - graph-service-service + container_name: frequency-interval-node + volumes: + - chainstorage:/data + + frequency-manual: + image: frequencychain/instant-seal-node:latest + command: --sealing=manual + ports: + - 9944:9944 + profiles: + - 'manual' + networks: + - graph-service-service + container_name: frequency-manual-node + volumes: + - chainstorage:/data + + api: + image: amplicalabs/graph-service-service:api-0.0.2-rc2 + platform: linux/amd64 + ports: + - 3000:3000 + env_file: + - .env.dev + environment: + - START_PROCESS=api + volumes: + - ./:/app + depends_on: + - redis + - frequency + networks: + - graph-service-service + restart: on-failure + profiles: ['instant'] + + worker: + image: amplicalabs/graph-service-service:api-0.0.2-rc2 + platform: linux/amd64 + env_file: + - .env.dev + environment: + - START_PROCESS=worker + volumes: + - ./:/app + depends_on: + - redis + - frequency + networks: + - graph-service-service + restart: on-failure + profiles: ['instant'] + +volumes: + redis_data: + chainstorage: + external: false + +networks: + graph-service-service: + + diff --git a/libs/common/src/blockchain/extrinsic.ts b/libs/common/src/blockchain/extrinsic.ts index d40cdc13..c07f0c59 100644 --- a/libs/common/src/blockchain/extrinsic.ts +++ b/libs/common/src/blockchain/extrinsic.ts @@ -62,18 +62,17 @@ export class Extrinsic { - return firstValueFrom(this.extrinsic.signAndSend(this.keys, { nonce })).then(({ status, events, txHash }) => { - if (status.isFinalized || status.isInBlock) { - const eventMap: EventMap = {}; - events.forEach((record: EventRecord) => { - const { event } = record; - eventMap[eventKey(event)] = event; - }); - return [txHash, eventMap]; - } - return [txHash, {}]; - }); + public async signAndSend(nonce?: number): Promise<[Hash, EventMap]> { + const { status, events, txHash } = await firstValueFrom(this.extrinsic.signAndSend(this.keys, { nonce })); + if (status.isFinalized || status.isInBlock) { + const eventMap: EventMap = {}; + events.forEach((record: EventRecord) => { + const { event } = record; + eventMap[eventKey(event)] = event; + }); + return [txHash, eventMap]; + } + return [txHash, {}]; } public getCall(): Call { From 06a631ad6212b1cf04ae4e8a93542a46449a4b59 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:37:40 -0600 Subject: [PATCH 30/53] Localized setup for graph service for ease of test (#50) * add local setup script * finalize localize setup --- .dockerignore | 2 + .env.dev | 2 +- Makefile | 4 + README.md | 33 +- apps/api/test/setup/index.js | 186 ++++ apps/api/test/setup/package-lock.json | 1260 +++++++++++++++++++++++++ apps/api/test/setup/package.json | 22 + 7 files changed, 1484 insertions(+), 25 deletions(-) create mode 100644 apps/api/test/setup/index.js create mode 100644 apps/api/test/setup/package-lock.json create mode 100644 apps/api/test/setup/package.json diff --git a/.dockerignore b/.dockerignore index b1f29d38..154af95a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,3 +5,5 @@ npm-debug.log dist .env* env.template +**/node_modules +**/test diff --git a/.env.dev b/.env.dev index 32dccb67..7a763aaa 100644 --- a/.env.dev +++ b/.env.dev @@ -42,7 +42,7 @@ GRAPH_ENVIRONMENT_DEV_CONFIG='{ "graphPublicKeySchemaId": 4 } ' -PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" +PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" PROVIDER_ID=1 # following are optional if reconnection service is is required diff --git a/Makefile b/Makefile index c12fbd41..d51abe03 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,10 @@ clean-graph-service: ###### Testing targets ###### +.PHONY: setuup +setup: + @cd apps/api/test/setup && npm install && npm run main + .PHONY: test-e2e test-e2e: @(npm run test:e2e) diff --git a/README.md b/README.md index fb272778..ca84e149 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ A service enabling easy interaction with DSNP private and public graphs on Frequ - [Table of Contents](#table-of-contents) - [Prerequisites](#prerequisites) - [Getting Started](#getting-started) + - [Running E2E tests](#running-e2e-tests) ## Prerequisites @@ -29,19 +30,8 @@ A service enabling easy interaction with DSNP private and public graphs on Frequ This will start Frequency, Redis and Graph Service api/worker containers. -3. Run a graph scenario from [frequency scenario templates](https://github.com/AmplicaLabs/frequency-scenario-template/tree/graph-service-setup). Note the use of branch `graph-service-setup` of the frequency scenario template repo. - - ```bash - git clone https://github.com/AmplicaLabs/frequency-scenario-template.git - cd frequency-scenario-template - git checkout graph-service-setup - npm run run-example --example=graph-migration-setup - ``` - - This will create `//Ferdie` as provider along with DSNPIds 2,3,4,5 and 6 as users. The template will also add a public key for each user in itemized storage needed for private graph operations. - -4. Go to [BullUI](http://0.0.0.0:3000/queues/) and check the graph service queue. -5. Check the [Swagger](http://0.0.0.0:3000/api/docs/swagger) for API documentation. +3. Go to [BullUI](http://0.0.0.0:3000/queues/) and check the graph service queue. +4. Check the [Swagger](http://0.0.0.0:3000/api/docs/swagger) for API documentation. ## Running E2E tests @@ -55,21 +45,16 @@ Note: using [docker compose file](docker-compose.yaml) with `instant` profile to This will start Frequency and Redis -2. Once [Frequency](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer) is up. Run a graph scenario from [frequency scenario templates](https://github.com/AmplicaLabs/frequency-scenario-template/tree/graph-service-setup). Note the use of branch `graph-service-setup` of the frequency scenario template repo. - - ```bash - git clone https://github.com/AmplicaLabs/frequency-scenario-template.git - cd frequency-scenario-template - git checkout graph-service-setup - npm run run-example --example=graph-migration-setup - ``` +2. Once [Frequency](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer) is up. Run a graph setup with Alice as provider 1 and 2,3,4,5,6 as users. - This will create `//Ferdie` as provider along with DSNPIds 2,3,4,5 and 6 as users. The template will also add a public key for each user in itemized storage needed for private graph operations. + ```bash + make setup + ``` 3. Run the following command to start the graph service api and worker containers. ```bash - docker-compose --profile instant up -d api worker + docker-compose --profile instant up -d api worker ``` This will start the graph service api and worker in development mode. @@ -79,7 +64,7 @@ Note: using [docker compose file](docker-compose.yaml) with `instant` profile to 5. Run the tests ```bash - npm run test:e2e + make test-e2e ``` This will run the tests in `apps/api/test` folder. diff --git a/apps/api/test/setup/index.js b/apps/api/test/setup/index.js new file mode 100644 index 00000000..bca6e5be --- /dev/null +++ b/apps/api/test/setup/index.js @@ -0,0 +1,186 @@ +import { ApiPromise, WsProvider } from '@polkadot/api'; +import { Keyring } from '@polkadot/keyring'; +import { waitReady } from '@polkadot/wasm-crypto'; +import { _0n, hexToU8a, u8aToHex, u8aWrapBytes } from '@polkadot/util'; +import { userPrivateConnections, userPrivateFollows, publicKey, userPublicFollows } from '@dsnp/frequency-schemas/dsnp'; +import { + DsnpVersion, + Graph, + EnvironmentType, + ConnectionType, + PrivacyType, +} from '@dsnp/graph-sdk'; + +const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://127.0.0.1:9944'; + +function signPayloadWithKeyring(signingAccount, payload) { + return { Sr25519: u8aToHex(signingAccount.sign(u8aWrapBytes(payload.toU8a()))) }; +} + +const sendStatusCb = + (resolve) => + ({ status, events }) => { + if (status.isInBlock || status.isFinalized) { + const msaCreated = events.map(({ event }) => event).find((event) => event.method === 'MsaCreated'); + const schemaCreated = events.map(({ event }) => event).find((event) => event.method === 'SchemaCreated'); + const itemizedPageUpdated = events.map(({ event }) => event).find((event) => event.method === 'ItemizedPageUpdated'); + if (msaCreated) { + resolve(msaCreated.data.msaId); + } else { + resolve(); + } + if (schemaCreated) { + console.log('Schema Created: ' + schemaCreated.data); + resolve(schemaCreated.data.schemaId); + } else { + resolve(); + } + if (itemizedPageUpdated) { + console.log('Itemized Page Updated: ' + itemizedPageUpdated.data); + resolve(itemizedPageUpdated.data); + } else { + resolve(); + } + } + }; + +const createViaDelegation = (api, provider) => async (keyUri, baseNonce) => { + // Create delegate + const keyring = new Keyring({ type: 'sr25519' }); + const delegator = keyring.addFromUri(keyUri); + const rawPayload = { authorizedMsaId: 1, expiration: 100, schemaIds: [1, 2, 3, 4] }; + const addProviderPayload = api.registry.createType('PalletMsaAddProvider', rawPayload); + const proof = signPayloadWithKeyring(delegator, addProviderPayload); + + const tx = api.tx.msa.createSponsoredAccountWithDelegation(delegator.address, proof, addProviderPayload.toU8a()); + await new Promise((resolve) => tx.signAndSend(provider, { nonce: baseNonce }, sendStatusCb(resolve))); + + const msaId = await api.query.msa.publicKeyToMsaId(delegator.address); + if (msaId.isNone) throw new Error('Failed to create MSA'); + const msaIdStr = msaId.value.toString(); + + console.log(keyUri + ' should have MSA Id ' + msaIdStr); +}; + +async function main() { + await waitReady(); + const provider = new WsProvider(FREQUENCY_URL, 500, {}, 3_000); + // Connect to the API + const api = await ApiPromise.create({ + provider, + // throwOnConnect: true, + }); + await Promise.race([api.isReady, new Promise((_, reject) => setTimeout(() => reject(new Error('WS Connection Timeout')), 30_000))]); + + console.log('API Connected'); + const keyring = new Keyring({ type: 'sr25519' }); + const alice = keyring.addFromUri('//Alice'); + + // Create Alice MSA + await new Promise((resolve) => api.tx.msa.create().signAndSend(alice, sendStatusCb(resolve))); + console.log('Alice should have MSA Id 1'); + // Create Alice Provider + await new Promise((resolve) => api.tx.msa.createProvider('Alice').signAndSend(alice, sendStatusCb(resolve))); + console.log('Alice (MSA Id 1) should be a provider now'); + + let currentNonce = (await api.rpc.system.accountNextIndex(alice.address)).toBn().toNumber(); + console.log('Current nonce: ' + currentNonce); + // Create Schemas + const txSchema1 = api.tx.schemas.createSchema(JSON.stringify(userPublicFollows), 'AvroBinary', 'Paginated'); + await new Promise((resolve) => txSchema1.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); + currentNonce++; + console.log('Public Follow Schema created'); + const txSchema2 = api.tx.schemas.createSchema(JSON.stringify(userPrivateFollows), 'AvroBinary', 'Paginated'); + await new Promise((resolve) => txSchema2.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); + currentNonce++; + console.log('Private Follow Schema created'); + const txSchema3 = api.tx.schemas.createSchema(JSON.stringify(userPrivateConnections), 'AvroBinary', 'Paginated'); + await new Promise((resolve) => txSchema3.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); + currentNonce++; + console.log('Private Friend Schema created'); + const txSchema4 = api.tx.schemas.createSchemaViaGovernance(alice.publicKey, JSON.stringify(publicKey), 'AvroBinary', 'Itemized', ['AppendOnly']); + let sudoTx = api.tx.sudo.sudo(txSchema4); + await new Promise((resolve) => sudoTx.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); + currentNonce++; + console.log('Public Key Schema created'); + // Delegations + const delegators = ['//Bob', '//Charlie', '//Dave', '//Eve', '//Ferdie']; + const create = createViaDelegation(api, alice); + await Promise.all(delegators.map((delegator, i) => create(delegator, currentNonce++))); + let msaUsers1to6 = ['2', '3', '4', '5', '6']; + let graphPubKey = hexToU8a('0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02'); + // let graphPrivKey = hexToU8a('0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5'); + // Add public to users + const environment = { environmentType: EnvironmentType.Dev, config: getTestConfig(4) }; + const graph = new Graph(environment); + + // eslint-disable-next-line no-restricted-syntax + for (const msaId of msaUsers1to6) { + const actions = [ + { + type: 'AddGraphKey', + ownerDsnpUserId: msaId.toString(), + newPublicKey: graphPubKey + }, + ]; + graph.applyActions(actions); + const keyExport = graph.exportUserGraphUpdates(msaId.toString()); + const keyActions = [ + { + Add: { + data: Array.from(keyExport[0].payload), + }, + }, + ]; + let tx = api.tx.statefulStorage.applyItemActions(msaId, 4, 0, keyActions); + // eslint-disable-next-line no-await-in-loop + await new Promise((resolve) => tx.signAndSend(alice, { + nonce: currentNonce + }, sendStatusCb(resolve))); + currentNonce++; + } + const capacityResult = (await api.query.capacity.capacityLedger(1)); + const capacity = capacityResult.unwrapOr({ totalCapacityIssued: 0n }); + const stakeAmount = 2000000000000000n - (typeof capacity.totalCapacityIssued === 'bigint' ? capacity.totalCapacityIssued : capacity.totalCapacityIssued.toBigInt()); + await api.tx.capacity.stake(1, stakeAmount).signAndSend(alice, { nonce: currentNonce }); + + console.log('Create Provider 1 as Alice and Delegator 2, 3, 4, 5, 6'); + console.log('Public keys added to delegators'); + console.log('Staked capacity to provider: ' + stakeAmount); + console.log('Setup complete'); +} + +function getTestConfig(keySchemaId) { + const config = {}; + config.sdkMaxStaleFriendshipDays = 100; + config.maxPageId = 100; + config.dsnpVersions = [DsnpVersion.Version1_0]; + config.maxGraphPageSizeBytes = 100; + config.maxKeyPageSizeBytes = 100; + const schemaMap = {}; + schemaMap[1] = { + dsnpVersion: DsnpVersion.Version1_0, + connectionType: ConnectionType.Follow, + privacyType: PrivacyType.Public, + }; + schemaMap[2] = { + dsnpVersion: DsnpVersion.Version1_0, + connectionType: ConnectionType.Follow, + privacyType: PrivacyType.Private, + }; + schemaMap[3] = { + dsnpVersion: DsnpVersion.Version1_0, + connectionType: ConnectionType.Friendship, + privacyType: PrivacyType.Private, + }; + config.schemaMap = schemaMap; + config.graphPublicKeySchemaId = keySchemaId; + return config; +} + +main() + .catch((r) => { + console.error(r); + process.exit(1); + }) + .finally(process.exit); \ No newline at end of file diff --git a/apps/api/test/setup/package-lock.json b/apps/api/test/setup/package-lock.json new file mode 100644 index 00000000..b06553d2 --- /dev/null +++ b/apps/api/test/setup/package-lock.json @@ -0,0 +1,1260 @@ +{ + "name": "setup", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "setup", + "version": "1.0.0", + "license": "UNLICENSED", + "dependencies": { + "@dsnp/frequency-schemas": "^1.1.0", + "@dsnp/graph-sdk": "^1.0.1", + "@frequency-chain/api-augment": "^1.10.0", + "@polkadot/api": "^10.9.1", + "@polkadot/keyring": "^12.4.2", + "@polkadot/types": "^10.11.2", + "@polkadot/util": "^12.4.2" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@dsnp/frequency-schemas": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dsnp/frequency-schemas/-/frequency-schemas-1.1.0.tgz", + "integrity": "sha512-Su7FufZRisQMxpVmVkbXwnnJDqgxAT7mJV3b2lvUDT4FRFZwqlOB5bnUBmrgZGF7Ru8RyrFOmI9K/5R4y2egHA==", + "dependencies": { + "@frequency-chain/api-augment": "^1.10.0", + "@polkadot/api": "^10.7.3", + "json-stringify-pretty-compact": "^4.0.0", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" + }, + "optionalDependencies": { + "@dsnp/parquetjs": "^1.3.0" + } + }, + "node_modules/@dsnp/graph-sdk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.0.1.tgz", + "integrity": "sha512-kzrk0OpCLRzcIpqrKiC4Ij+qyxYEp9wDmHgp70eIBRd+gQup2nZHNesHppi4Ua7HdENd20a6k+KCaRIqvcVAOw==", + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/@dsnp/parquetjs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@dsnp/parquetjs/-/parquetjs-1.5.0.tgz", + "integrity": "sha512-xn37Eg+LVYsNQSh+H/gNj6qEmD5yHNjojlVnXgtK4FXWZWqn9l+pZxU0ZWyTqC6Y/4vYe3800Ordgs74cz8w3w==", + "optional": true, + "dependencies": { + "@types/long": "^4.0.2", + "@types/node-int64": "^0.4.29", + "@types/thrift": "^0.10.11", + "browserify-zlib": "^0.2.0", + "bson": "4.6.3", + "cross-fetch": "^3.1.4", + "int53": "^0.2.4", + "long": "^4.0.0", + "snappyjs": "^0.6.1", + "thrift": "0.16.0", + "varint": "^6.0.0", + "wasm-brotli": "^2.0.2", + "xxhash-wasm": "^1.0.2" + }, + "engines": { + "node": ">=18.18.2" + } + }, + "node_modules/@frequency-chain/api-augment": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.10.0.tgz", + "integrity": "sha512-AnjE4N78YQo1VRHoR0uqwfS0/RS1HBm6HSsoEUt40bZcie1BRP44EQ5/bm/xSg4+F7EQZyn8RRH1yM4SNfdQ3g==", + "dependencies": { + "@polkadot/api": "^10.9.1", + "@polkadot/rpc-provider": "^10.9.1", + "@polkadot/types": "^10.9.1" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@polkadot/api": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.11.2.tgz", + "integrity": "sha512-AorCZxCWCoTtdbl4DPUZh+ACe/pbLIS1BkdQY0AFJuZllm0x/yWzjgampcPd5jQAA/O3iKShRBkZqj6Mk9yG/A==", + "dependencies": { + "@polkadot/api-augment": "10.11.2", + "@polkadot/api-base": "10.11.2", + "@polkadot/api-derive": "10.11.2", + "@polkadot/keyring": "^12.6.2", + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/rpc-provider": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/types-known": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "eventemitter3": "^5.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.11.2.tgz", + "integrity": "sha512-PTpnqpezc75qBqUtgrc0GYB8h9UHjfbHSRZamAbecIVAJ2/zc6CqtnldeaBlIu1IKTgBzi3FFtTyYu+ZGbNT2Q==", + "dependencies": { + "@polkadot/api-base": "10.11.2", + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-base": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.11.2.tgz", + "integrity": "sha512-4LIjaUfO9nOzilxo7XqzYKCNMtmUypdk8oHPdrRnSjKEsnK7vDsNi+979z2KXNXd2KFSCFHENmI523fYnMnReg==", + "dependencies": { + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/util": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-derive": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.11.2.tgz", + "integrity": "sha512-m3BQbPionkd1iSlknddxnL2hDtolPIsT+aRyrtn4zgMRPoLjHFmTmovvg8RaUyYofJtZeYrnjMw0mdxiSXx7eA==", + "dependencies": { + "@polkadot/api": "10.11.2", + "@polkadot/api-augment": "10.11.2", + "@polkadot/api-base": "10.11.2", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/keyring": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.6.2.tgz", + "integrity": "sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw==", + "dependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2" + } + }, + "node_modules/@polkadot/networks": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.6.2.tgz", + "integrity": "sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==", + "dependencies": { + "@polkadot/util": "12.6.2", + "@substrate/ss58-registry": "^1.44.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.11.2.tgz", + "integrity": "sha512-9AhT0WW81/8jYbRcAC6PRmuxXqNhJje8OYiulBQHbG1DTCcjAfz+6VQBke9BwTStzPq7d526+yyBKD17O3zlAA==", + "dependencies": { + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-core": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.11.2.tgz", + "integrity": "sha512-Ot0CFLWx8sZhLZog20WDuniPA01Bk2StNDsdAQgcFKPwZw6ShPaZQCHuKLQK6I6DodOrem9FXX7c1hvoKJP5Ww==", + "dependencies": { + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/rpc-provider": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/util": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-provider": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.11.2.tgz", + "integrity": "sha512-he5jWMpDJp7e+vUzTZDzpkB7ps3H8psRally+/ZvZZScPvFEjfczT7I1WWY9h58s8+ImeVP/lkXjL9h/gUOt3Q==", + "dependencies": { + "@polkadot/keyring": "^12.6.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-support": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "@polkadot/x-fetch": "^12.6.2", + "@polkadot/x-global": "^12.6.2", + "@polkadot/x-ws": "^12.6.2", + "eventemitter3": "^5.0.1", + "mock-socket": "^9.3.1", + "nock": "^13.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@substrate/connect": "0.7.35" + } + }, + "node_modules/@polkadot/types": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.11.2.tgz", + "integrity": "sha512-d52j3xXni+C8GdYZVTSfu8ROAnzXFMlyRvXtor0PudUc8UQHOaC4+mYAkTBGA2gKdmL8MHSfRSbhcxHhsikY6Q==", + "dependencies": { + "@polkadot/keyring": "^12.6.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.11.2.tgz", + "integrity": "sha512-8eB8ew04wZiE5GnmFvEFW1euJWmF62SGxb1O+8wL3zoUtB9Xgo1vB6w6xbTrd+HLV6jNSeXXnbbF1BEUvi9cNg==", + "dependencies": { + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-codec": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.11.2.tgz", + "integrity": "sha512-3xjOQL+LOOMzYqlgP9ROL0FQnzU8lGflgYewzau7AsDlFziSEtb49a9BpYo6zil4koC+QB8zQ9OHGFumG08T8w==", + "dependencies": { + "@polkadot/util": "^12.6.2", + "@polkadot/x-bigint": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-create": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.11.2.tgz", + "integrity": "sha512-SJt23NxYvefRxVZZm6mT9ed1pR6FDoIGQ3xUpbjhTLfU2wuhpKjekMVorYQ6z/gK2JLMu2kV92Ardsz+6GX5XQ==", + "dependencies": { + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-known": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.11.2.tgz", + "integrity": "sha512-kbEIX7NUQFxpDB0FFGNyXX/odY7jbp56RGD+Z4A731fW2xh/DgAQrI994xTzuh0c0EqPE26oQm3kATSpseqo9w==", + "dependencies": { + "@polkadot/networks": "^12.6.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-support": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.11.2.tgz", + "integrity": "sha512-X11hoykFYv/3efg4coZy2hUOUc97JhjQMJLzDhHniFwGLlYU8MeLnPdCVGkXx0xDDjTo4/ptS1XpZ5HYcg+gRw==", + "dependencies": { + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/util": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.6.2.tgz", + "integrity": "sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==", + "dependencies": { + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-global": "12.6.2", + "@polkadot/x-textdecoder": "12.6.2", + "@polkadot/x-textencoder": "12.6.2", + "@types/bn.js": "^5.1.5", + "bn.js": "^5.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/util-crypto": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz", + "integrity": "sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==", + "dependencies": { + "@noble/curves": "^1.3.0", + "@noble/hashes": "^1.3.3", + "@polkadot/networks": "12.6.2", + "@polkadot/util": "12.6.2", + "@polkadot/wasm-crypto": "^7.3.2", + "@polkadot/wasm-util": "^7.3.2", + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-randomvalues": "12.6.2", + "@scure/base": "^1.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2" + } + }, + "node_modules/@polkadot/wasm-bridge": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz", + "integrity": "sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==", + "dependencies": { + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz", + "integrity": "sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==", + "dependencies": { + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-init": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz", + "integrity": "sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-init": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz", + "integrity": "sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==", + "dependencies": { + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz", + "integrity": "sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==", + "dependencies": { + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-util": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz", + "integrity": "sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/x-bigint": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz", + "integrity": "sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-fetch": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz", + "integrity": "sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "node-fetch": "^3.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-global": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.6.2.tgz", + "integrity": "sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-randomvalues": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz", + "integrity": "sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/wasm-util": "*" + } + }, + "node_modules/@polkadot/x-textdecoder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz", + "integrity": "sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-textencoder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz", + "integrity": "sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-ws": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.6.2.tgz", + "integrity": "sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2", + "ws": "^8.15.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@scure/base": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@substrate/connect": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.35.tgz", + "integrity": "sha512-Io8vkalbwaye+7yXfG1Nj52tOOoJln2bMlc7Q9Yy3vEWqZEVkgKmcPVzbwV0CWL3QD+KMPDA2Dnw/X7EdwgoLw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@substrate/connect-extension-protocol": "^1.0.1", + "smoldot": "2.0.7" + } + }, + "node_modules/@substrate/connect-extension-protocol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz", + "integrity": "sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==", + "optional": true + }, + "node_modules/@substrate/ss58-registry": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.46.0.tgz", + "integrity": "sha512-rBvWnlrBeFTd5LVG7oX3rOHzR16yqyffOFHKmUiVcblpXI3D89CXOvAljW9tWlA1H/2/FegaZnHPhdObPsvi+w==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "optional": true + }, + "node_modules/@types/node": { + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-int64": { + "version": "0.4.32", + "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.32.tgz", + "integrity": "sha512-xf/JsSlnXQ+mzvc0IpXemcrO4BrCfpgNpMco+GLcXkFk01k/gW9lGJu+Vof0ZSvHK6DsHJDPSbjFPs36QkWXqw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "optional": true + }, + "node_modules/@types/thrift": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@types/thrift/-/thrift-0.10.17.tgz", + "integrity": "sha512-bDX6d5a5ZDWC81tgDv224n/3PKNYfIQJTPHzlbk4vBWJrYXF6Tg1ncaVmP/c3JbGN2AK9p7zmHorJC2D6oejGQ==", + "optional": true, + "dependencies": { + "@types/node": "*", + "@types/node-int64": "*", + "@types/q": "*" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/browser-or-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz", + "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==", + "optional": true + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "optional": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/bson": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.3.tgz", + "integrity": "sha512-rAqP5hcUVJhXP2MCSNVsf0oM2OGU1So6A9pVRDYayvJ5+hygXHQApf87wd5NlhPM1J9RJnbqxIG/f8QTzRoQ4A==", + "optional": true, + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "optional": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/int53": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/int53/-/int53-0.2.4.tgz", + "integrity": "sha512-a5jlKftS7HUOhkUyYD7j2sJ/ZnvWiNlZS1ldR+g1ifQ+/UuZXIE+YTc/lK1qGj/GwAU5F8Z0e1eVq2t1J5Ob2g==", + "optional": true + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "optional": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "optional": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/mock-socket": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nock": { + "version": "13.5.1", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.1.tgz", + "integrity": "sha512-+s7b73fzj5KnxbKH4Oaqz07tQ8degcMilU4rrmnKvI//b0JMBU4wEXFQ8zqr+3+L4eWSfU3H/UoIVGUV0tue1Q==", + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "optional": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "optional": true + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "optional": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/smoldot": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.7.tgz", + "integrity": "sha512-VAOBqEen6vises36/zgrmAT1GWk2qE3X8AGnO7lmQFdskbKx8EovnwS22rtPAG+Y1Rk23/S22kDJUdPANyPkBA==", + "optional": true, + "dependencies": { + "ws": "^8.8.1" + } + }, + "node_modules/snappyjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==", + "optional": true + }, + "node_modules/thrift": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/thrift/-/thrift-0.16.0.tgz", + "integrity": "sha512-W8DpGyTPlIaK3f+e1XOCLxefaUWXtrOXAaVIDbfYhmVyriYeAKgsBVFNJUV1F9SQ2SPt2sG44AZQxSGwGj/3VA==", + "optional": true, + "dependencies": { + "browser-or-node": "^1.2.1", + "isomorphic-ws": "^4.0.1", + "node-int64": "^0.4.0", + "q": "^1.5.0", + "ws": "^5.2.3" + }, + "engines": { + "node": ">= 10.18.0" + } + }, + "node_modules/thrift/node_modules/ws": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "optional": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "optional": true + }, + "node_modules/wasm-brotli": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/wasm-brotli/-/wasm-brotli-2.0.2.tgz", + "integrity": "sha512-DgjRlpZz9z5br4TjQHSlDHRF9NIuGXHUj3AqO08koDCXz7EYzmPDb7T/6oar5UKLYgPp9Yxc2ImGpx4BMFwbNQ==", + "optional": true + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "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 + } + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "optional": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/apps/api/test/setup/package.json b/apps/api/test/setup/package.json new file mode 100644 index 00000000..98aa960a --- /dev/null +++ b/apps/api/test/setup/package.json @@ -0,0 +1,22 @@ +{ + "name": "setup", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "main": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "type": "module", + "author": "", + "license": "UNLICENSED", + "dependencies": { + "@dsnp/frequency-schemas": "^1.1.0", + "@dsnp/graph-sdk": "^1.0.1", + "@frequency-chain/api-augment": "^1.10.0", + "@polkadot/api": "^10.9.1", + "@polkadot/keyring": "^12.4.2", + "@polkadot/types": "^10.11.2", + "@polkadot/util": "^12.4.2" + } +} From a1bc0088ca244def0dbeafdcbe2e10ab06b0122c Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:19:02 -0600 Subject: [PATCH 31/53] handle stale hash for back to back same user jobs (#47) * handle stale hash for back to back same user jobs * set expiry to blockdelay * put an atomic check for updating last processed dnsp key --- Makefile | 2 +- apps/api/src/api.service.ts | 9 +++++++- .../request.processor.service.ts | 23 +++++++++++++++++-- docker-compose.dev.yaml | 4 ++-- docker-compose.yaml | 4 ++-- libs/common/src/utils/queues.ts | 6 +++++ lua/updateLastProcessed.lua | 16 +++++++++++++ 7 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 lua/updateLastProcessed.lua diff --git a/Makefile b/Makefile index d51abe03..dfdd7b41 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ clean-graph-service: ###### Testing targets ###### -.PHONY: setuup +.PHONY: setup setup: @cd apps/api/test/setup && npm install && npm run main diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index aa130730..d959ee15 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -37,7 +37,14 @@ export class ApiService implements OnApplicationShutdown { } onApplicationShutdown(signal?: string | undefined) { - this.logger.log('Cleanup on shutdown completed.'); + try { + this.redis.del(QueueConstants.REDIS_WATCHER_PREFIX); + this.redis.del(QueueConstants.DEBOUNCER_CACHE_KEY); + this.redis.del(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY); + this.logger.log('Cleanup on shutdown completed.'); + } catch (e) { + this.logger.error(`Error during cleanup on shutdown: ${e}`); + } } async enqueueRequest(request: ProviderGraphDto): Promise { diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 72809305..186bf53e 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -1,12 +1,13 @@ import { InjectRedis } from '@liaoliaots/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys, DisconnectAction, Action } from '@dsnp/graph-sdk'; import { MessageSourceId, SchemaGrantResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { Option, Vec } from '@polkadot/types'; import { AnyNumber } from '@polkadot/types/types'; +import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { BaseConsumer } from '../BaseConsumer'; import { ConnectionDto, @@ -20,7 +21,8 @@ import { } from '../../../../libs/common/src'; import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; import { Direction } from '../../../../libs/common/src/dtos/direction.dto'; - +import { SECONDS_PER_BLOCK } from '../graph_publisher/graph.publisher.processor.service'; +import fs from 'fs'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) export class RequestProcessorService extends BaseConsumer { @@ -32,11 +34,25 @@ export class RequestProcessorService extends BaseConsumer { private blockchainService: BlockchainService, ) { super(); + cacheManager.defineCommand('updateLastProcessed', { + numberOfKeys: 1, + lua: fs.readFileSync('lua/updateLastProcessed.lua', 'utf8'), + }); + this.logger = new Logger(RequestProcessorService.name); } async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); + const blockDelay = SECONDS_PER_BLOCK * MILLISECONDS_PER_SECOND; try { + const lastProcessedDsnpId = await this.cacheManager.get(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY); + if (lastProcessedDsnpId && lastProcessedDsnpId === job.data.dsnpId) { + this.logger.debug(`Delaying processing of job ${job.id} for ${blockDelay}ms`); + // eslint-disable-next-line no-await-in-loop + await new Promise((r) => { + setTimeout(r, blockDelay); + }); + } const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.dsnpId); const providerId: ProviderId = this.blockchainService.api.registry.createType('ProviderId', job.data.providerId); this.graphStateManager.removeUserGraph(dsnpUserId.toString()); @@ -70,6 +86,9 @@ export class RequestProcessorService extends BaseConsumer { const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); if (reImported) { + // Use lua script to update last processed dsnpId + // @ts-ignore + await this.cacheManager.updateLastProcessed(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY, dsnpUserId.toString(), blockDelay); this.logger.debug(`Re-imported bundles for ${dsnpUserId.toString()}`); // eslint-disable-next-line no-await-in-loop const userGraphExists = this.graphStateManager.graphContainsUser(dsnpUserId.toString()); diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index af0557c3..9c6273f1 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -47,7 +47,7 @@ services: container_name: frequency-manual-node volumes: - chainstorage:/data - graph-service-api: + api: build: context: . dockerfile: dev.Dockerfile @@ -68,7 +68,7 @@ services: profiles: ['instant'] restart: on-failure - graph-service-worker: + worker: build: context: . dockerfile: dev.Dockerfile diff --git a/docker-compose.yaml b/docker-compose.yaml index a536cdb9..ad3cde46 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -49,7 +49,7 @@ services: - chainstorage:/data api: - image: amplicalabs/graph-service-service:api-0.0.2-rc2 + image: amplicalabs/graph-service-service:api-0.0.2-rc3 platform: linux/amd64 ports: - 3000:3000 @@ -68,7 +68,7 @@ services: profiles: ['instant'] worker: - image: amplicalabs/graph-service-service:api-0.0.2-rc2 + image: amplicalabs/graph-service-service:api-0.0.2-rc3 platform: linux/amd64 env_file: - .env.dev diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index 946600f6..0bb58f31 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -28,4 +28,10 @@ export namespace QueueConstants { * Debouncer cache key */ export const DEBOUNCER_CACHE_KEY = 'graph-service-debouncer'; + + /** + * Last processed dsnpId key for Redis + * @type {string} + */ + export const LAST_PROCESSED_DSNP_ID_KEY: string = 'lastProcessedDsnpId'; } diff --git a/lua/updateLastProcessed.lua b/lua/updateLastProcessed.lua new file mode 100644 index 00000000..8f325ed7 --- /dev/null +++ b/lua/updateLastProcessed.lua @@ -0,0 +1,16 @@ +--[[ +Input: +KEYS[1] lastProcessedDsnpId key +ARGV[1] new lastProcessedDsnpId +ARGV[2] key expire time in seconds +Output: +1 if the lastProcessedDsnpId was updated +0 if the lastProcessedDsnpId was not updated +]] +local lastProcessedDsnpId = redis.call('GET', KEYS[1]) +if lastProcessedDsnpId ~= ARGV[1] then + redis.call('SETEX', KEYS[1], tonumber(ARGV[2]), ARGV[1]) + return 1 +else + return 0 +end From 040344bb3c62d70566a144ab29370166447c9614 Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Mon, 15 Apr 2024 16:41:15 -0400 Subject: [PATCH 32/53] feat: sync env vars and docs for Gateway services (#54) - add ENVIRONMENT.md to document environment variables; update README.md - update env.template with comments describing env vars - change PAGE_SIZE to CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE to match reconnection service --- ENVIRONMENT.md | 30 +++++++++ env.template | 61 ++++++++++++++++--- libs/common/src/config/config.service.spec.ts | 4 +- libs/common/src/config/config.service.ts | 4 +- libs/common/src/config/env.config.ts | 4 +- package-lock.json | 8 +-- package.json | 2 +- 7 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 ENVIRONMENT.md diff --git a/ENVIRONMENT.md b/ENVIRONMENT.md new file mode 100644 index 00000000..62f96675 --- /dev/null +++ b/ENVIRONMENT.md @@ -0,0 +1,30 @@ +# Environment Variables + +This application recognizes the following environment variables: + +| Name | Description | Range/Type | Required? | Default | +| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------: | :----------: | :-----: | +| `API_PORT` | HTTP port that the application listens on | 1025 - 65535 | | 3000 | +| `CAPACITY_LIMIT` | Maximum amount of provider capacity this app is allowed to use (per epoch) type: 'percentage' 'amount' value: number (may be percentage, ie '80', or absolute amount of capacity) | JSON [(example)](./env.template) | Y | | +|`DEBOUNCE_SECONDS`|Number of seconds to retain pending graph updates in the Redis cache to avoid redundant fetches from the chain|>= 0||| | > 0 | | 100 | +| `FREQUENCY_URL` | Blockchain node address | http(s): or ws(s): URL | Y | | +| `GRAPH_ENVIRONMENT_DEV_CONFIG` | [NOTE]: Only used for Dev environments. Add the graph environment config in JSON format only used for Dev environments. Be careful to escape any inner quotes as this is in a .env file and will be parsed by the shell. | JSON [(example)](./env.template) | Y (if 'Dev') | | +| `GRAPH_ENVIRONMENT_TYPE` | Graph environment type. | Mainnet\|TestnetPaseo\|Rococo\|Dev | Y | | +| `PROVIDER_ACCOUNT_SEED_PHRASE` | Seed phrase for provider MSA control key | string | Y | | +| `PROVIDER_ID` | Provider MSA ID | integer | Y | | +| `QUEUE_HIGH_WATER` | Max number of jobs allowed on the 'graphUpdateQueue' before blockchain scan will be paused to allow queue to drain | >= 100 | | 1000 | +| `REDIS_URL` | Connection URL for Redis | URL | Y | +|`RECONNECTION_SERVICE_REQUIRED`|Whether to instantiate/activate reconnection-service features|true/false|| + +### The following environment variables are only relevant if `RECONNECTION_SERVICE_REQUESTED` is 'true': +| Name | Description | Range/Type | Required? | Default | +| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------: | :----------: | :-----: | +| `PROVIDER_ACCESS_TOKEN` | An optional bearer token authentication to the provider webhook | string | | | +| `BLOCKCHAIN_SCAN_INTERVAL_MINUTES` | How many minutes to delay between successive scans of the chain for new accounts (after end of chain is reached) | > 0 | | 180 | +| `CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE` | Number of connection/page to request when requesting provider connections from webhook +| `HEALTH_CHECK_MAX_RETRIES` | Number of `/health` endpoint failures allowed before marking the provider webhook service down | >= 0 | | 20 | +| `HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS` | Number of seconds to retry provider webhook `/health` endpoint when failing | > 0 | | 64 | +| `HEALTH_CHECK_SUCCESS_THRESHOLD` | Minimum number of consecutive successful calls to the provider webhook `/health` endpoint before it is marked up again | > 0 | | 10 | +| `PROVIDER_BASE_URL` | Base URL for provider webhook endpoints | URL | Y | | +| `WEBHOOK_FAILURE_THRESHOLD` | Number of failures allowing in the provider webhook before the service is marked down | > 0 | | 3 | +| `WEBHOOK_RETRY_INTERVAL_SECONDS` | Number of seconds between provider webhook retry attempts when failing | > 0 | | 10 | diff --git a/env.template b/env.template index 27381055..18fbd839 100644 --- a/env.template +++ b/env.template @@ -1,14 +1,33 @@ -# Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development +# Copy this file to ".env.dev" and ".env", and then tweak values for local development + +# Port that the application REST endpoints listen on +API_PORT=3000 + +# Blockchain node address FREQUENCY_URL=ws://0.0.0.0:9944 + +# Specifies the provider ID +PROVIDER_ID=1 + +# Seed phrase for provider MSA control key +PROVIDER_ACCOUNT_SEED_PHRASE='//Alice' + +# Redis URL REDIS_URL=redis://0.0.0.0:6379 + +# Max number of jobs allowed on the 'graphUpdateQueue' before +# blockchain scan will be paused to allow queue to drain QUEUE_HIGH_WATER=1000 -API_PORT=3000 + +# Number of seconds to retain pending graph updates in the Redis cache to avoid redundant fetches from the chain DEBOUNCE_SECONDS=10 -# Configure the amount of capacity Graph Service can use. +# Maximum amount of provider capacity this app is allowed to use (per epoch) +# type: 'percentage' | 'amount' +# value: number (may be percentage, ie '80', or absolute amount of capacity) CAPACITY_LIMIT='{"type":"percentage", "value":80}' -# Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. +# Graph environment type. This can be 'Dev' or 'Rococo', 'TestnetPaseo', or 'Mainnet'. GRAPH_ENVIRONMENT_TYPE=Dev # [NOTE]: The following config is only used for Dev environments. @@ -43,16 +62,38 @@ GRAPH_ENVIRONMENT_DEV_CONFIG='{ } ' PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" -PROVIDER_ID=1 -# following are optional if reconnection service is is required -PROVIDER_BASE_URL="http://localhost:3000" # this is optional if reconnection service is not required -PROVIDER_ACCESS_TOKEN="api-key" # this is optional if reconnection service if PROVIDER_BASE_URL requires an access token -PAGE_SIZE=100 +# Whether to instantiate/activate reconnection-service features RECONNECTION_SERVICE_REQUIRED=true -BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 + +### The following are only applicable if RECONNECTION_SERVICE_REQUIRED is 'true' + +# Base URL for provider webhook endpoints +PROVIDER_BASE_URL=https://some-provider/api/v1.0.0 + +# An optional bearer token authentication to the provider webhook +PROVIDER_ACCESS_TOKEN=some-token + +# Number of connection/page to request when requesting provider connections from webhook +CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE=100 + + +# How many minutes to delay between successive scans of the chain +# for new accounts (after end of chain is reached) +BLOCKCHAIN_SCAN_INTERVAL_MINUTES=1 + +# Number of failures allowing in the provider webhook before the service is marked down WEBHOOK_FAILURE_THRESHOLD=3 + +# Minimum number of consecutive successful calls to the provider webhook +# `/health` endpoint before it is marked up again HEALTH_CHECK_SUCCESS_THRESHOLD=10 + +# Number of seconds between provider webhook retry attempts when failing WEBHOOK_RETRY_INTERVAL_SECONDS=10 + +# Number of seconds to retry provider webhook `/health` endpoint when failing HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 + +# Number of `/health` endpoint failures allowed before marking the provider webhook service down HEALTH_CHECK_MAX_RETRIES=4 diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index 0f895365..b12461de 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -54,7 +54,7 @@ describe('GraphSericeConfig', () => { WEBHOOK_RETRY_INTERVAL_SECONDS: undefined, HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: undefined, HEALTH_CHECK_MAX_RETRIES: undefined, - PAGE_SIZE: undefined, + CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE: undefined, CAPACITY_LIMIT: undefined, }; @@ -193,7 +193,7 @@ describe('GraphSericeConfig', () => { }); it('should get page size', () => { - expect(graphServiceConfig.getPageSize()).toStrictEqual(parseInt(ALL_ENV.PAGE_SIZE as string, 10)); + expect(graphServiceConfig.getPageSize()).toStrictEqual(parseInt(ALL_ENV.CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE as string, 10)); }); it('should get debounce seconds', () => { diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index f9b04eda..19d1c888 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -26,7 +26,7 @@ export interface ConfigEnvironmentVariables { WEBHOOK_RETRY_INTERVAL_SECONDS: number; HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: number; HEALTH_CHECK_MAX_RETRIES: number; - PAGE_SIZE: number; + CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE: number; CAPACITY_LIMIT: number; } @@ -123,7 +123,7 @@ export class ConfigService { } public getPageSize(): number { - return this.nestConfigService.get('PAGE_SIZE')!; + return this.nestConfigService.get('CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE')!; } public getDebounceSeconds(): number { diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index 11c948bf..1abee137 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -13,7 +13,7 @@ export const configModuleOptions: ConfigModuleOptions = { BLOCKCHAIN_SCAN_INTERVAL_MINUTES: Joi.number() .min(1) .default(3 * 60), - GRAPH_ENVIRONMENT_TYPE: Joi.string().required().valid('Mainnet', 'Rococo', 'Dev'), + GRAPH_ENVIRONMENT_TYPE: Joi.string().required().valid('Mainnet', 'TestnetPaseo', 'Rococo', 'Dev'), // GRAPH_ENVIRONMENT_DEV_CONFIG is optional, but if it is set, it must be a valid JSON string GRAPH_ENVIRONMENT_DEV_CONFIG: Joi.string().when('GRAPH_ENVIRONMENT_TYPE', { is: 'Dev', @@ -50,7 +50,7 @@ export const configModuleOptions: ConfigModuleOptions = { HEALTH_CHECK_SUCCESS_THRESHOLD: Joi.number().min(1).default(10), HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: Joi.number().min(1).default(64), HEALTH_CHECK_MAX_RETRIES: Joi.number().min(0).default(20), - PAGE_SIZE: Joi.number().min(1).default(100), + CONNECTIONS_PER_PROVIDER_RESPONSE_PAGE: Joi.number().min(1).default(100), CAPACITY_LIMIT: Joi.string() .custom((value: string, helpers) => { try { diff --git a/package-lock.json b/package-lock.json index 14626457..4e36a37f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@bull-board/nestjs": "^5.8.3", "@bull-board/ui": "^5.8.3", "@dsnp/frequency-schemas": "^1.0.2", - "@dsnp/graph-sdk": "1.0.1", + "@dsnp/graph-sdk": "^1.1.1", "@frequency-chain/api-augment": "1.7.0", "@jest/globals": "^29.5.0", "@liaoliaots/nestjs-redis": "^9.0.5", @@ -966,9 +966,9 @@ } }, "node_modules/@dsnp/graph-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.0.1.tgz", - "integrity": "sha512-kzrk0OpCLRzcIpqrKiC4Ij+qyxYEp9wDmHgp70eIBRd+gQup2nZHNesHppi4Ua7HdENd20a6k+KCaRIqvcVAOw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.1.1.tgz", + "integrity": "sha512-9HCa5OkPvyOy7rESp/iMaH7XHiKsFUmEzCVQ6TAXB9upEiDJZOjLv8cd0UP8YyBIXYquqvtSr0MNBqpFoXk4jQ==", "engines": { "node": "^14.0.0 || ^16.0.0 || >=17.0.0" } diff --git a/package.json b/package.json index 552c59dc..5ebc3929 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@bull-board/nestjs": "^5.8.3", "@bull-board/ui": "^5.8.3", "@dsnp/frequency-schemas": "^1.0.2", - "@dsnp/graph-sdk": "1.0.1", + "@dsnp/graph-sdk": "^1.1.1", "@frequency-chain/api-augment": "1.7.0", "@jest/globals": "^29.5.0", "@liaoliaots/nestjs-redis": "^9.0.5", From 761beb5bbc4e7fd072828b16cf1ab9884aacec6b Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Fri, 19 Apr 2024 09:06:38 -0400 Subject: [PATCH 33/53] fix: standardize Docker containers and containerized start-up (#55) --- .env.dev | 4 +- .env.docker.dev | 33 ++++++++++++ .github/workflows/release.yml | 3 +- Dockerfile | 28 ++++++---- README.md | 32 ++++++++---- dev.Dockerfile | 13 +++-- docker-compose.dev.yaml | 98 ----------------------------------- docker-compose.yaml | 83 ++++++++++++----------------- package-lock.json | 4 +- package.json | 8 +-- scripts/docker-entrypoint.sh | 7 +++ 11 files changed, 132 insertions(+), 181 deletions(-) create mode 100644 .env.docker.dev delete mode 100644 docker-compose.dev.yaml create mode 100755 scripts/docker-entrypoint.sh diff --git a/.env.dev b/.env.dev index 7a763aaa..ff7a0421 100644 --- a/.env.dev +++ b/.env.dev @@ -1,6 +1,6 @@ # Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development -FREQUENCY_URL=ws://frequency:9944 -REDIS_URL=redis://redis:6379 +FREQUENCY_URL=ws://localhost:9944 +REDIS_URL=redis://localhost:6379 QUEUE_HIGH_WATER=1000 API_PORT=3000 DEBOUNCE_SECONDS=10 diff --git a/.env.docker.dev b/.env.docker.dev new file mode 100644 index 00000000..7e42ebb4 --- /dev/null +++ b/.env.docker.dev @@ -0,0 +1,33 @@ +# Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development +FREQUENCY_URL=ws://frequency:9944 +REDIS_URL=redis://redis:6379 +QUEUE_HIGH_WATER=1000 +API_PORT=3000 +DEBOUNCE_SECONDS=10 + +# Configure the amount of capacity Graph Service can use. +CAPACITY_LIMIT={"type":"percentage", "value":80} + +# Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. +GRAPH_ENVIRONMENT_TYPE=Dev + +# [NOTE]: The following config is only used for Dev environments. +# Add the graph environment config in JSON format only used for Dev environments. +# Be careful to escape any inner quotes as this is in a .env file. +GRAPH_ENVIRONMENT_DEV_CONFIG={"sdkMaxStaleFriendshipDays": 100,"maxPageId": 100,"dsnpVersions": ["1.0"],"maxGraphPageSizeBytes": 100,"maxKeyPageSizeBytes": 100,"schemaMap": {"1": {"dsnpVersion": "1.0","connectionType": "follow","privacyType": "public"},"2": {"dsnpVersion": "1.0","connectionType": "follow","privacyType": "private"},"3": {"dsnpVersion": "1.0","connectionType": "friendship","privacyType": "private"}},"graphPublicKeySchemaId": 4} +PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" +PROVIDER_ID=1 + +# ------- following are optional if reconnection service is is required --- +PROVIDER_BASE_URL=http://localhost:3000 + +# this is optional if reconnection service if PROVIDER_BASE_URL requires an access token +PROVIDER_ACCESS_TOKEN="api-key" +PAGE_SIZE=100 +RECONNECTION_SERVICE_REQUIRED=false +BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 +WEBHOOK_FAILURE_THRESHOLD=3 +HEALTH_CHECK_SUCCESS_THRESHOLD=10 +WEBHOOK_RETRY_INTERVAL_SECONDS=10 +HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 +HEALTH_CHECK_MAX_RETRIES=4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 73427977..a369c40e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ env: NEW_RELEASE_TAG_FROM_UI: ${{github.event.inputs.release-version}} TEST_RUN: ${{startsWith(github.event.inputs.release-version || github.ref_name, 'v0.0.1')}} DOCKER_HUB_PROFILE: amplicalabs - IMAGE_NAME: graph-service-service + IMAGE_NAME: graph-service jobs: build-and-publish-container-image: @@ -51,7 +51,6 @@ jobs: with: flavor: | latest=auto - prefix=api-,onlatest=true images: | ${{env.DOCKER_HUB_PROFILE}}/${{env.IMAGE_NAME}} tags: | diff --git a/Dockerfile b/Dockerfile index 9c3373e3..5c152b81 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ # Use a multi-stage build for efficiency -FROM node:18 AS builder +FROM node:20 AS builder -WORKDIR /usr/src/app +WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm ci COPY . . @@ -13,17 +13,25 @@ COPY . . RUN npm run build # Production stage -FROM node:18 +FROM node:20 -WORKDIR /usr/src/app +WORKDIR /app -COPY --from=builder /usr/src/app/dist ./dist +COPY --from=builder /app/dist ./dist COPY package*.json ./ - COPY ./lua ./lua -RUN npm install --only=production +COPY ./scripts/docker-entrypoint.sh ./ +RUN chmod +x ./docker-entrypoint.sh + +RUN apt-get update && \ + apt-get install -y jq curl tini && \ + apt-get clean && \ + rm -rf /usr/share/doc /usr/share/man /usr/share/zsh + +RUN npm ci --omit=dev + EXPOSE 3000 -ENV START_PROCESS="api" +ENV START_PROCESS="api" -CMD ["sh", "-c", "if [ \"$START_PROCESS\" = \"api\" ]; then npm run start:api:prod; else npm run start:worker:prod; fi"] +ENTRYPOINT ["/usr/bin/tini", "--", "./docker-entrypoint.sh", "prod"] diff --git a/README.md b/README.md index ca84e149..682ac9da 100644 --- a/README.md +++ b/README.md @@ -9,38 +9,48 @@ A service enabling easy interaction with DSNP private and public graphs on Frequ - [Prerequisites](#prerequisites) - [Getting Started](#getting-started) - [Running E2E tests](#running-e2e-tests) - + ## Prerequisites - [Docker](https://docs.docker.com/get-docker/) ## Getting Started -1. Clone the repository +Follow these steps to set up and run Content Watcher: +### 1. Clone the Repository +Clone the Graph Service repository to your local machine: ```bash git clone https://github.com/amplicalabls/graph-service.git ``` -2. Start docker compose +### 2. Configure the app +The application receives its configuration from the environment. Each method of launching the app has its own source for the environment. If you run a container image using Kubernetes, it is likely your environment injection will be configured in a Helm chart. For local Docker-based development, you may specifiy the environment or point to an environment file (the included [docker-compose.yaml](./docker-compose.yaml) relies on the included [.env.docker.dev](./.env.docker.dev) file). If running natively using the script included in `package.json`, the app will use a local `.env` file. + +Environment files are documented [here](./ENVIRONMENT.md), and a sample environment file is provided [here](./env.template). +### 3. Start the service: +Run the following command to start the service: ```bash - docker-compose -f docker-compose.dev.yaml --profile instant up + docker compose up [-d] ``` - This will start Frequency, Redis and Graph Service api/worker containers. +This will start Frequency, Redis and Graph Service api/worker containers. + +### 4. Swagger UI +Check out the Swagger UI hosted on the app instance at [\/api/docs/swagger](http://localhost:3000/api/docs/swagger) to view the API documentation and submit requests to the service. -3. Go to [BullUI](http://0.0.0.0:3000/queues/) and check the graph service queue. -4. Check the [Swagger](http://0.0.0.0:3000/api/docs/swagger) for API documentation. +### 5. Queue Management +You may also view and manage the application's queue at [\/queues](http://localhost:3000/queues). ## Running E2E tests -Note: using [docker compose file](docker-compose.yaml) with `instant` profile to start the services. This will start the services in development mode. +Note: using [docker compose file](docker-compose.yaml) to start the services. This will start the services in development mode. -1. Start redis and frequency with instant profile. +1. Start redis and frequency ```bash - docker-compose --profile instant up -d redis frequency + docker compose up -d redis frequency ``` This will start Frequency and Redis @@ -54,7 +64,7 @@ Note: using [docker compose file](docker-compose.yaml) with `instant` profile to 3. Run the following command to start the graph service api and worker containers. ```bash - docker-compose --profile instant up -d api worker + docker compose up -d api worker ``` This will start the graph service api and worker in development mode. diff --git a/dev.Dockerfile b/dev.Dockerfile index 99fcb102..58fbf213 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,10 +1,15 @@ -FROM node:18 +FROM node:20 + +RUN apt-get update && \ + apt-get install -y tini && \ + apt-get clean && \ + rm -rf /usr/share/doc /usr/share/man /usr/share/zsh + WORKDIR /app -COPY . . -RUN npm install EXPOSE 3000 + ENV START_PROCESS="api" -CMD ["sh", "-c", "if [ \"$START_PROCESS\" = \"api\" ]; then npm run start:api; else npm run start:worker; fi"] +VOLUME "/app" diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml deleted file mode 100644 index 9c6273f1..00000000 --- a/docker-compose.dev.yaml +++ /dev/null @@ -1,98 +0,0 @@ -version: '3' - -services: - redis: - image: redis:latest - ports: - - 6379:6379 - volumes: - - redis_data:/data/redis - networks: - - graph-service-service - - frequency: - image: frequencychain/instant-seal-node:latest - platform: linux/amd64 - ports: - - 9944:9944 - profiles: ['', 'instant'] - networks: - - graph-service-service - container_name: frequency - volumes: - - chainstorage:/data - - frequency-interval: - image: frequencychain/instant-seal-node:latest - command: --sealing=interval --sealing-interval 3 --sealing-create-empty-blocks - ports: - - 9944:9944 - profiles: - - 'interval' - networks: - - graph-service-service - container_name: frequency-interval-node - volumes: - - chainstorage:/data - - frequency-manual: - image: frequencychain/instant-seal-node:latest - command: --sealing=manual - ports: - - 9944:9944 - profiles: - - 'manual' - networks: - - graph-service-service - container_name: frequency-manual-node - volumes: - - chainstorage:/data - api: - build: - context: . - dockerfile: dev.Dockerfile - platform: linux/amd64 - ports: - - 3000:3000 - env_file: - - .env.dev - environment: - - START_PROCESS=api - volumes: - - ./:/app - depends_on: - - redis - - frequency - networks: - - graph-service-service - profiles: ['instant'] - restart: on-failure - - worker: - build: - context: . - dockerfile: dev.Dockerfile - platform: linux/amd64 - env_file: - - .env.dev - environment: - - START_PROCESS=worker - volumes: - - ./:/app - depends_on: - - redis - - frequency - networks: - - graph-service-service - profiles: ['instant'] - restart: on-failure - -volumes: - redis_data: - chainstorage: - external: false - -networks: - graph-service-service: - - diff --git a/docker-compose.yaml b/docker-compose.yaml index ad3cde46..f1eb6080 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,5 +1,3 @@ -version: '3' - services: redis: image: redis:latest @@ -8,81 +6,70 @@ services: volumes: - redis_data:/data/redis networks: - - graph-service-service + - graph-service frequency: - image: frequencychain/instant-seal-node:latest + image: dsnp/instant-seal-node-with-deployed-schemas:latest + # We need to specify the platform because it's the only image + # built by Frequency at the moment, and auto-pull won't work otherwise platform: linux/amd64 + # Uncomment SEALING_MODE and SEALING_INTERVAL if you want to use interval sealing. + # Other options you may want to add depending on your test scenario. + # environment: + # - SEALING_MODE=interval + # - SEALING_INTERVAL=3 + # - CREATE_EMPTY_BLOCKS=true + # Uncomment below if you want to let the chain run and keep all of the historical blocks + # command: --state-pruning=archive ports: - 9944:9944 - profiles: ['', 'instant'] - networks: - - graph-service-service - container_name: frequency - volumes: - - chainstorage:/data - - frequency-interval: - image: frequencychain/instant-seal-node:latest - command: --sealing=interval --sealing-interval 3 --sealing-create-empty-blocks - ports: - - 9944:9944 - profiles: - - 'interval' networks: - - graph-service-service - container_name: frequency-interval-node + - graph-service volumes: - chainstorage:/data - frequency-manual: - image: frequencychain/instant-seal-node:latest - command: --sealing=manual - ports: - - 9944:9944 - profiles: - - 'manual' - networks: - - graph-service-service - container_name: frequency-manual-node - volumes: - - chainstorage:/data + graph-service-base: + pull_policy: never + image: graph-service:latest + build: + context: . + dockerfile: dev.Dockerfile + tags: + - graph-service:latest api: - image: amplicalabs/graph-service-service:api-0.0.2-rc3 - platform: linux/amd64 + pull_policy: never + image: graph-service:latest + command: ["npm", "run", "start:api:watch"] ports: - 3000:3000 env_file: - - .env.dev - environment: - - START_PROCESS=api + - .env.docker.dev volumes: - ./:/app depends_on: - redis - frequency + - graph-service-base networks: - - graph-service-service + - graph-service restart: on-failure - profiles: ['instant'] worker: - image: amplicalabs/graph-service-service:api-0.0.2-rc3 - platform: linux/amd64 + image: graph-service:latest + pull_policy: never + command: ["npm", "run", "start:worker:watch"] env_file: - - .env.dev - environment: - - START_PROCESS=worker + - .env.docker.dev volumes: - ./:/app depends_on: - redis - frequency + - graph-service-base networks: - - graph-service-service + - graph-service restart: on-failure - profiles: ['instant'] volumes: redis_data: @@ -90,6 +77,4 @@ volumes: external: false networks: - graph-service-service: - - + graph-service: diff --git a/package-lock.json b/package-lock.json index 4e36a37f..f955ad21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "graph-service", - "version": "0.1.0", + "version": "0.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "graph-service", - "version": "0.1.0", + "version": "0.9.0", "license": "Apache-2.0", "dependencies": { "@bull-board/api": "^5.8.3", diff --git a/package.json b/package.json index 5ebc3929..9a8b4f3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graph-service", - "version": "0.1.0", + "version": "0.9.0", "description": "Graph Service enabling handling of users graph data on the Frequency Network", "main": "dist/apps/api/main.js", "scripts": { @@ -9,16 +9,18 @@ "generate-swagger-ui": "redoc-cli bundle swagger.yaml --output=./docs/index.html", "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start:api": "nest start api", + "start:api:watch": "nest start api --watch", "start:api:prod": "node dist/apps/api/main.js", "start:api:dev": "set -a ; . .env ; nest start api", "start:api:debug": "set -a ; . .env ; nest start api --debug --watch", "start:worker": "nest start worker", + "start:worker:watch": "nest start worker --watch", "start:worker:prod": "node dist/apps/worker/main.js", "start:worker:dev": "set -a ; . .env ; nest start worker", "start:worker:debug": "set -a ; . .env ;nest start worker --debug=9230 --watch", - "docker-build": "docker build -t graph-service-service .", + "docker-build": "docker build -t graph-service .", "docker-build:dev": "docker-compose -f docker-compose.dev.yaml build", - "docker-run": " build -t graph-service-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-service-deploy", + "docker-run": " build -t graph-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-deploy", "docker-run:dev": "docker-compose -f docker-compose.dev.yaml up -d ; docker-compose -f docker-compose.dev.yaml logs", "docker-stop:dev": "docker-compose -f docker-compose.dev.yaml stop", "clean": "rm -Rf dist", diff --git a/scripts/docker-entrypoint.sh b/scripts/docker-entrypoint.sh new file mode 100755 index 00000000..9757f082 --- /dev/null +++ b/scripts/docker-entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +launch_type=${1} +shift + +# Wrapper script to launch the containerized app because we need to parse the environment +exec npm run start:${START_PROCESS}:${launch_type} -- $@ From d79be3ade3b1558b2e443eebaa8b965aa19b5b90 Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Fri, 19 Apr 2024 09:55:57 -0400 Subject: [PATCH 34/53] fix: bump GH action versions for Node.js 20.x (#56) --- .github/workflows/build.yml | 26 +++++++++++++------------- .github/workflows/release.yml | 12 ++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb59d7c8..e4776556 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,11 +14,11 @@ jobs: build_Nest_js: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'npm' registry-url: 'https://registry.npmjs.org' cache-dependency-path: package-lock.json @@ -29,11 +29,11 @@ jobs: test_jest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'npm' registry-url: 'https://registry.npmjs.org' cache-dependency-path: package-lock.json @@ -44,11 +44,11 @@ jobs: check_licenses: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'npm' registry-url: 'https://registry.npmjs.org' cache-dependency-path: package-lock.json @@ -62,11 +62,11 @@ jobs: runs-on: ubuntu-latest needs: [build_Nest_js, test_jest, check_licenses] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'npm' registry-url: 'https://registry.npmjs.org' cache-dependency-path: package-lock.json @@ -77,7 +77,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish generated swagger.html to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a369c40e..83a1e860 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,12 +42,12 @@ jobs: fi echo "valid-version=true" >> $GITHUB_OUTPUT - name: Check Out Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{env.NEW_RELEASE_TAG_FROM_UI}} - name: Set up tags for cp image id: cp-tags - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: flavor: | latest=auto @@ -56,19 +56,19 @@ jobs: tags: | type=semver,pattern={{version}} - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 with: platforms: | linux/amd64 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{secrets.DOCKERHUB_USERNAME_FC}} password: ${{secrets.DOCKERHUB_TOKEN_FC}} - name: Build and Push graph-service-service Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64 From e3699e4af4fc73b99616bd7bb196d632bdec0546 Mon Sep 17 00:00:00 2001 From: Wil Wade Date: Tue, 23 Apr 2024 15:19:56 -0400 Subject: [PATCH 35/53] Update publishing pages (#59) - Adds Dependabot - Updates actions - Enables github pages publishing See Test deploy: https://amplicalabs.github.io/graph-service/ Closes #58 --- .github/dependabot.yml | 11 + .github/workflows/build.yml | 31 +- .github/workflows/deploy-gh-pages.yml | 51 + .github/workflows/release.yml | 2 +- .gitignore | 3 + docs/index.html | 2193 ---------------- package-lock.json | 3456 ------------------------- package.json | 3 +- 8 files changed, 72 insertions(+), 5678 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/deploy-gh-pages.yml delete mode 100644 docs/index.html diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..d91a92ad --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: 'npm' # See documentation for possible values + directory: '/' # Location of package manifests + schedule: + interval: 'weekly' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e4776556..8400b729 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,8 @@ on: - main jobs: - build_Nest_js: + build: + name: 'Build' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -24,9 +25,10 @@ jobs: cache-dependency-path: package-lock.json - name: Install dependencies run: npm ci - - name: Build Nest.js + - name: Build NestJS run: npm run build test_jest: + name: 'Test' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -42,6 +44,7 @@ jobs: - name: Run Jest run: npm run test check_licenses: + name: 'Dependency License Check' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -57,27 +60,3 @@ jobs: - name: License Check # List all the licenses and error out if it is not one of the supported licenses run: npx license-report --fields=name --fields=licenseType | jq 'map(select(.licenseType | IN("MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "(Apache-2.0 AND MIT)") | not)) | if length == 0 then halt else halt_error(1) end' - - publish: - runs-on: ubuntu-latest - needs: [build_Nest_js, test_jest, check_licenses] - steps: - - uses: actions/checkout@v4 - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'npm' - registry-url: 'https://registry.npmjs.org' - cache-dependency-path: package-lock.json - - name: Install dependencies - run: npm ci - - name: Generate Swagger UI - run: npm run generate-swagger-ui - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Publish generated swagger.html to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml new file mode 100644 index 00000000..660b20dd --- /dev/null +++ b/.github/workflows/deploy-gh-pages.yml @@ -0,0 +1,51 @@ +name: Build and Publish OpenAPI UI to Pages +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true +on: + workflow_dispatch: + push: + branches: + - main + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + name: 'Build Pages Artifact' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Generate Swagger UI + run: npm run generate-swagger-ui + + - name: Setup Pages + id: pages + uses: actions/configure-pages@v4 + + - name: Publish generated swagger.html to GitHub Pages + uses: actions/upload-pages-artifact@v3 + with: + path: ./docs + + # Deployment job + deploy: + name: 'Deploy to Pages' + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 83a1e860..ec22d761 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ env: jobs: build-and-publish-container-image: name: Build and publish container image - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest container: ghcr.io/libertydsnp/frequency/ci-base-image steps: - name: Validate Version Tag diff --git a/.gitignore b/.gitignore index e5988edc..d53aa5f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Ignore generated docs +docs/*.html + # Logs logs *.log diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index d76cbabe..00000000 --- a/docs/index.html +++ /dev/null @@ -1,2193 +0,0 @@ - - - - - - Graph Service - - - - - - - - - -

Graph Service (1.0)

Download OpenAPI specification:Download

Graph Service API

-

graph-service

Check the health status of the service

Responses

Fetch graphs for specified dsnpIds and blockNumber

query Parameters
dsnpIds
required
Array of strings
blockNumber
string

Responses

Response samples

Content type
application/json
{
  • "dsnpId": "string",
  • "dsnpGraphEdge": [
    ]
}

Request an update to given users graph

Request Body schema: application/json
dsnpId
required
string
required
object
Array of objects (GraphKeyPairDto)

Responses

Request samples

Content type
application/json
{
  • "dsnpId": "string",
  • "connections": {
    },
  • "graphKeyPairs": [
    ]
}

Response samples

Content type
application/json
{ }

Watch graphs for specified dsnpIds and receive updates

Request Body schema: application/json
dsnpIds
required
Array of strings
webhookEndpoint
required
string

Responses

Request samples

Content type
application/json
{
  • "dsnpIds": [
    ],
  • "webhookEndpoint": "string"
}
- - - - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f955ad21..8564cd75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,7 +75,6 @@ "license-report": "^6.4.0", "nock": "^13.3.8", "prettier": "^3.0.2", - "redoc-cli": "^0.13.21", "source-map-support": "^0.5.21", "supertest": "^6.3.3", "trace-unhandled": "^2.0.1", @@ -10500,3461 +10499,6 @@ "node": ">=4" } }, - "node_modules/redoc-cli": { - "version": "0.13.21", - "resolved": "https://registry.npmjs.org/redoc-cli/-/redoc-cli-0.13.21.tgz", - "integrity": "sha512-pjuPf0HkKqo9qtoHxMK4x5dhC/lJ08O0hO0rJISbSRCf19bPBjQ5lb2mHRu9j6vypTMltyaLtFIfVNveuyF5fQ==", - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "boxen": "5.1.2", - "chokidar": "^3.5.1", - "handlebars": "^4.7.7", - "mkdirp": "^1.0.4", - "mobx": "^6.3.2", - "node-libs-browser": "^2.2.1", - "react": "^17.0.1", - "react-dom": "^17.0.1", - "redoc": "2.0.0", - "styled-components": "^5.3.0", - "yargs": "^17.3.1" - }, - "bin": { - "redoc-cli": "index.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/redoc-cli/node_modules/@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/redoc-cli/node_modules/@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "node_modules/redoc-cli/node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/redoc-cli/node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/redoc-cli/node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/redoc-cli/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/redoc-cli/node_modules/@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "node_modules/redoc-cli/node_modules/@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "dev": true, - "dependencies": { - "@emotion/memoize": "0.7.4" - } - }, - "node_modules/redoc-cli/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@exodus/schemasafe": { - "version": "1.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", - "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/redoc-cli/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/redoc-cli/node_modules/@redocly/ajv": { - "version": "8.6.4", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.4.tgz", - "integrity": "sha512-y9qNj0//tZtWB2jfXNK3BX18BSBp9zNR7KE7lMysVHwbZtY392OJCjm6Rb/h4UHH2r1AqjNEHFD6bRn+DqU9Mw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/redoc-cli/node_modules/@redocly/openapi-core": { - "version": "1.0.0-beta.105", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.105.tgz", - "integrity": "sha512-8uYDMcqBOPhFgjRlg5uetW/E2uTVVRpk+YsJhaH78ZNuzBkQP5Waw5s8P8ym6myvHs5me8l5AdniY/ePLMT5xg==", - "dev": true, - "dependencies": { - "@redocly/ajv": "^8.6.4", - "@types/node": "^14.11.8", - "colorette": "^1.2.0", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "lodash.isequal": "^4.5.0", - "minimatch": "^5.0.1", - "node-fetch": "^2.6.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/redoc-cli/node_modules/@redocly/openapi-core/node_modules/@types/node": { - "version": "14.18.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz", - "integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/redoc-cli/node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/redoc-cli/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/@types/mkdirp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", - "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", - "extraneous": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/redoc-cli/node_modules/@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/redoc-cli/node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/redoc-cli/node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/redoc-cli/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/redoc-cli/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/redoc-cli/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/redoc-cli/node_modules/ajv/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/redoc-cli/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/redoc-cli/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/redoc-cli/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/redoc-cli/node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/redoc-cli/node_modules/babel-plugin-styled-components": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz", - "integrity": "sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-module-imports": "^7.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/redoc-cli/node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/redoc-cli/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/redoc-cli/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/redoc-cli/node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/redoc-cli/node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/redoc-cli/node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/redoc-cli/node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/redoc-cli/node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redoc-cli/node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/redoc-cli/node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/redoc-cli/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/redoc-cli/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redoc-cli/node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/caniuse-lite": { - "version": "1.0.30001390", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001390.tgz", - "integrity": "sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "peer": true - }, - "node_modules/redoc-cli/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/redoc-cli/node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/redoc-cli/node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/redoc-cli/node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/redoc-cli/node_modules/clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/redoc-cli/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/redoc-cli/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/core-js": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", - "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", - "dev": true, - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/redoc-cli/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/redoc-cli/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/redoc-cli/node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/redoc-cli/node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/redoc-cli/node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "dev": true, - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/redoc-cli/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/redoc-cli/node_modules/decko": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", - "integrity": "sha1-/UPHNelnuAEzBohKVvvmZZlraBc=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/redoc-cli/node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/redoc-cli/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/redoc-cli/node_modules/dompurify": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.5.tgz", - "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/electron-to-chromium": { - "version": "1.4.242", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.242.tgz", - "integrity": "sha512-nPdgMWtjjWGCtreW/2adkrB2jyHjClo9PtVhR6rW+oxa4E4Wom642Tn+5LslHP3XPL5MCpkn5/UEY60EXylNeQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/redoc-cli/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/redoc-cli/node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/redoc-cli/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/redoc-cli/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/redoc-cli/node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/redoc-cli/node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/redoc-cli/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/redoc-cli/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/redoc-cli/node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/redoc-cli/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/redoc-cli/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/redoc-cli/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redoc-cli/node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/redoc-cli/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redoc-cli/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/redoc-cli/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/redoc-cli/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/redoc-cli/node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/http2-client": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/redoc-cli/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/redoc-cli/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redoc-cli/node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/redoc-cli/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dev": true, - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/redoc-cli/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/redoc-cli/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/redoc-cli/node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha1-GA8fnr74sOY45BZq1S24eb6y/8U=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/marked": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.15.tgz", - "integrity": "sha512-esX5lPdTfG4p8LDkv+obbRCyOKzB+820ZZyMOXJZygZBHrH9b3xXR64X4kT3sPe9Nx8qQXbmcz6kFSMt4Nfk6Q==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/redoc-cli/node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/redoc-cli/node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/redoc-cli/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/redoc-cli/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/redoc-cli/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/redoc-cli/node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/redoc-cli/node_modules/mobx": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.3.2.tgz", - "integrity": "sha512-xGPM9dIE1qkK9Nrhevp0gzpsmELKU4MFUJRORW/jqxVFIHHWIoQrjDjL8vkwoJYY3C2CeVJqgvl38hgKTalTWg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } - }, - "node_modules/redoc-cli/node_modules/mobx-react": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.2.1.tgz", - "integrity": "sha512-LZS99KFLn75VWDXPdRJhILzVQ7qLcRjQbzkK+wVs0Qg4kWw5hOI2USp7tmu+9zP9KYsVBmKyx2k/8cTTBfsymw==", - "dev": true, - "dependencies": { - "mobx-react-lite": "^3.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/redoc-cli/node_modules/mobx-react-lite": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.3.tgz", - "integrity": "sha512-7exWp1FV0M9dP08H9PIeHlJqDw4IdkQVRMfLYaZFMmlbzSS6ZU6p/kx392KN+rVf81hH3IQYewvRGQ70oiwmbw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/redoc-cli/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/redoc-cli/node_modules/node-fetch-h2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", - "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", - "dev": true, - "dependencies": { - "http2-client": "^1.2.5" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/redoc-cli/node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/redoc-cli/node_modules/node-readfiles": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=", - "dev": true, - "dependencies": { - "es6-promise": "^3.2.1" - } - }, - "node_modules/redoc-cli/node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/oas-kit-common": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", - "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "node_modules/redoc-cli/node_modules/oas-linter": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", - "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", - "dev": true, - "dependencies": { - "@exodus/schemasafe": "^1.0.0-rc.2", - "should": "^13.2.1", - "yaml": "^1.10.0" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/oas-resolver": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", - "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", - "dev": true, - "dependencies": { - "node-fetch-h2": "^2.3.0", - "oas-kit-common": "^1.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "resolve": "resolve.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/oas-schema-walker": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", - "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", - "dev": true, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/oas-validator": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", - "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "oas-kit-common": "^1.0.8", - "oas-linter": "^3.2.2", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "reftools": "^1.1.9", - "should": "^13.2.1", - "yaml": "^1.10.0" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/openapi-sampler": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.0.tgz", - "integrity": "sha512-2QfjK1oM9Sv0q82Ae1RrUe3yfFmAyjF548+6eAeb+h/cL1Uj51TW4UezraBEvwEdzoBgfo4AaTLVFGTKj+yYDw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "json-pointer": "0.6.2" - } - }, - "node_modules/redoc-cli/node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/redoc-cli/node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/redoc-cli/node_modules/perfect-scrollbar": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", - "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/redoc-cli/node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/polished": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.4.tgz", - "integrity": "sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/redoc-cli/node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/redoc-cli/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/redoc-cli/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/redoc-cli/node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/redoc-cli/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/redoc-cli/node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/redoc-cli/node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/redoc-cli/node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/redoc-cli/node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/redoc-cli/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true - }, - "node_modules/redoc-cli/node_modules/react-tabs": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", - "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", - "dev": true, - "dependencies": { - "clsx": "^1.1.0", - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0-0" - } - }, - "node_modules/redoc-cli/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redoc-cli/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/redoc-cli/node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redoc-cli/node_modules/redoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz", - "integrity": "sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag==", - "dev": true, - "dependencies": { - "@redocly/openapi-core": "^1.0.0-beta.104", - "classnames": "^2.3.1", - "decko": "^1.2.0", - "dompurify": "^2.2.8", - "eventemitter3": "^4.0.7", - "json-pointer": "^0.6.2", - "lunr": "^2.3.9", - "mark.js": "^8.11.1", - "marked": "^4.0.15", - "mobx-react": "^7.2.0", - "openapi-sampler": "^1.3.0", - "path-browserify": "^1.0.1", - "perfect-scrollbar": "^1.5.5", - "polished": "^4.1.3", - "prismjs": "^1.27.0", - "prop-types": "^15.7.2", - "react-tabs": "^3.2.2", - "slugify": "~1.4.7", - "stickyfill": "^1.1.1", - "style-loader": "^3.3.1", - "swagger2openapi": "^7.0.6", - "url-template": "^2.0.8" - }, - "engines": { - "node": ">=6.9", - "npm": ">=3.0.0" - }, - "peerDependencies": { - "core-js": "^3.1.4", - "mobx": "^6.0.4", - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0", - "styled-components": "^4.1.1 || ^5.1.1" - } - }, - "node_modules/redoc-cli/node_modules/redoc/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/reftools": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", - "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", - "dev": true, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/redoc-cli/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/redoc-cli/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/redoc-cli/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/redoc-cli/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/redoc-cli/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/redoc-cli/node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "node_modules/redoc-cli/node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "dependencies": { - "should-type": "^1.4.0" - } - }, - "node_modules/redoc-cli/node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "node_modules/redoc-cli/node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "node_modules/redoc-cli/node_modules/should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/slugify": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", - "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/redoc-cli/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redoc-cli/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/redoc-cli/node_modules/stickyfill": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", - "integrity": "sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/redoc-cli/node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/redoc-cli/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/redoc-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/redoc-cli/node_modules/styled-components": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.0.tgz", - "integrity": "sha512-bPJKwZCHjJPf/hwTJl6TbkSZg/3evha+XPEizrZUGb535jLImwDUdjTNxXqjjaASt2M4qO4AVfoHJNe3XB/tpQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^0.8.8", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/redoc-cli/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/swagger2openapi": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", - "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "node-fetch": "^2.6.1", - "node-fetch-h2": "^2.3.0", - "node-readfiles": "^0.2.0", - "oas-kit-common": "^1.0.8", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "oas-validator": "^5.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "boast": "boast.js", - "oas-validate": "oas-validate.js", - "swagger2openapi": "swagger2openapi.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/redoc-cli/node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/redoc-cli/node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/redoc-cli/node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/redoc-cli/node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/redoc-cli/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/redoc-cli/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redoc-cli/node_modules/uglify-js": { - "version": "3.13.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz", - "integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/redoc-cli/node_modules/update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/redoc-cli/node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/redoc-cli/node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/redoc-cli/node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/redoc-cli/node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/redoc-cli/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/redoc-cli/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/redoc-cli/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/redoc-cli/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/redoc-cli/node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc-cli/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/redoc-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/redoc-cli/node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/redoc-cli/node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/redoc-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/redoc-cli/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redoc-cli/node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true - }, - "node_modules/redoc-cli/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/redoc-cli/node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/reflect-metadata": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", diff --git a/package.json b/package.json index 9a8b4f3c..0f26ff00 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "nest build api && nest build worker", "build:swagger": "npx ts-node apps/api/src/generate-metadata.ts", - "generate-swagger-ui": "redoc-cli bundle swagger.yaml --output=./docs/index.html", + "generate-swagger-ui": "npx --yes @redocly/cli build-docs swagger.yaml --output=./docs/index.html", "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start:api": "nest start api", "start:api:watch": "nest start api --watch", @@ -107,7 +107,6 @@ "license-report": "^6.4.0", "nock": "^13.3.8", "prettier": "^3.0.2", - "redoc-cli": "^0.13.21", "source-map-support": "^0.5.21", "supertest": "^6.3.3", "trace-unhandled": "^2.0.1", From ff014b91ee0bfa885cd0cd1d71507a31e158a291 Mon Sep 17 00:00:00 2001 From: Puneet Saraswat <61435908+saraswatpuneet@users.noreply.github.com> Date: Tue, 14 May 2024 08:28:44 -0500 Subject: [PATCH 36/53] update, lint, fix (#68) ## Details - Update depdencies - Remove unused ones - Update lint and fix lint related issues --- apps/api/src/api.module.ts | 5 +- apps/api/src/api.service.ts | 4 +- apps/api/src/metadata.ts | 106 +- apps/api/test/app.e2e-spec.ts | 1 - apps/worker/src/BaseConsumer.ts | 2 +- .../graph.monitor.processor.module.ts | 5 +- .../graph.monitor.processor.service.ts | 7 +- .../graph.publisher.processor.module.ts | 5 +- .../graph.publisher.processor.service.ts | 5 +- .../graph.reconnection.processor.module.ts | 4 +- .../graph.reconnection.processor.service.ts | 7 +- .../request.processor.module.ts | 5 +- .../request.processor.service.ts | 16 +- apps/worker/src/worker.module.ts | 5 +- eslint.config.mjs | 27 + .../src/blockchain/blockchain-constants.ts | 68 +- .../src/blockchain/blockchain.service.ts | 9 +- libs/common/src/blockchain/create-keys.ts | 1 - libs/common/src/blockchain/event-error.ts | 4 +- libs/common/src/blockchain/extrinsic.ts | 2 +- libs/common/src/config/config.service.spec.ts | 8 +- libs/common/src/constants.ts | 6 +- libs/common/src/services/async_debouncer.ts | 2 +- .../services/blockchain-scanner.service.ts | 4 +- .../src/services/graph-state-manager.ts | 2 +- libs/common/src/services/nonce.service.ts | 6 +- libs/common/src/utils/base-consumer.ts | 2 +- libs/common/src/utils/processing.ts | 12 +- libs/common/src/utils/queues.ts | 60 +- libs/common/src/utils/redis.ts | 46 +- package-lock.json | 8716 +++++++++-------- package.json | 113 +- 32 files changed, 4746 insertions(+), 4519 deletions(-) create mode 100644 eslint.config.mjs diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index 73ab32ce..bfe9e980 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { BullModule } from '@nestjs/bullmq'; import { ScheduleModule } from '@nestjs/schedule'; -import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { RedisModule } from '@songkeys/nestjs-redis'; import { BullBoardModule } from '@bull-board/nestjs'; import { BullMQAdapter } from '@bull-board/api/bullMQAdapter'; import { ExpressAdapter } from '@bull-board/express'; @@ -11,7 +11,8 @@ import { ApiService } from './api.service'; import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; -import { GraphStateManager, QueueConstants } from '../../../libs/common/src'; +import { GraphStateManager } from '../../../libs/common/src'; +import * as QueueConstants from '../../../libs/common/src/utils/queues'; @Module({ imports: [ diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index d959ee15..f9fbc0a9 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -1,5 +1,5 @@ import { Injectable, Logger, OnApplicationShutdown } from '@nestjs/common'; -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; @@ -12,10 +12,10 @@ import { GraphsQueryParamsDto, ProviderGraphDto, ProviderGraphUpdateJob, - QueueConstants, UserGraphDto, WatchGraphsDto, } from '../../../libs/common/src'; +import * as QueueConstants from '../../../libs/common/src/utils/queues'; import { ConfigService } from '../../../libs/common/src/config/config.service'; import { BlockchainService } from '../../../libs/common/src/blockchain/blockchain.service'; diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index c6f442c2..31bb91c0 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,15 +1,95 @@ /* eslint-disable */ export default async () => { - const t = { - ["../../../libs/common/src/dtos/dsnp.graph.edge.dto"]: await import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), - ["../../../libs/common/src/dtos/key.type.dto"]: await import("../../../libs/common/src/dtos/key.type.dto"), - ["../../../libs/common/src/dtos/privacy.type.dto"]: await import("../../../libs/common/src/dtos/privacy.type.dto"), - ["../../../libs/common/src/dtos/graph.key.pair.dto"]: await import("../../../libs/common/src/dtos/graph.key.pair.dto"), - ["../../../libs/common/src/dtos/direction.dto"]: await import("../../../libs/common/src/dtos/direction.dto"), - ["../../../libs/common/src/dtos/connection.type.dto"]: await import("../../../libs/common/src/dtos/connection.type.dto"), - ["../../../libs/common/src/dtos/connections.dto"]: await import("../../../libs/common/src/dtos/connections.dto"), - ["../../../libs/common/src/dtos/user.graph.dto"]: await import("../../../libs/common/src/dtos/user.graph.dto"), - ["../../../libs/common/src/dtos/graph.change.request.reference"]: await import("../../../libs/common/src/dtos/graph.change.request.reference") - }; - return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp.graph.edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/user.graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdges: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp.graph.edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph.key.pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key.type.dto"].KeyType } } }], [import("../../../libs/common/src/dtos/graph.query.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, graphKeyPairs: { required: true, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/connections.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy.type.dto"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.dto"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection.type.dto"].ConnectionType } } }], [import("../../../libs/common/src/dtos/provider.graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connections.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph.key.pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }], [import("../../../libs/common/src/dtos/graph.change.notification.dto"), { "GraphChangeNotificationDto": { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }]], "controllers": [[import("./api.controller"), { "ApiController": { "health": {}, "getGraphs": { type: [t["../../../libs/common/src/dtos/user.graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph.change.request.reference"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; -}; \ No newline at end of file + const t = { + ['../../../libs/common/src/dtos/dsnp.graph.edge.dto']: await import('../../../libs/common/src/dtos/dsnp.graph.edge.dto'), + ['../../../libs/common/src/dtos/key.type.dto']: await import('../../../libs/common/src/dtos/key.type.dto'), + ['../../../libs/common/src/dtos/privacy.type.dto']: await import('../../../libs/common/src/dtos/privacy.type.dto'), + ['../../../libs/common/src/dtos/graph.key.pair.dto']: await import('../../../libs/common/src/dtos/graph.key.pair.dto'), + ['../../../libs/common/src/dtos/direction.dto']: await import('../../../libs/common/src/dtos/direction.dto'), + ['../../../libs/common/src/dtos/connection.type.dto']: await import('../../../libs/common/src/dtos/connection.type.dto'), + ['../../../libs/common/src/dtos/connections.dto']: await import('../../../libs/common/src/dtos/connections.dto'), + ['../../../libs/common/src/dtos/user.graph.dto']: await import('../../../libs/common/src/dtos/user.graph.dto'), + ['../../../libs/common/src/dtos/graph.change.request.reference']: await import('../../../libs/common/src/dtos/graph.change.request.reference'), + }; + return { + '@nestjs/swagger': { + models: [ + [ + import('../../../libs/common/src/dtos/dsnp.graph.edge.dto'), + { DsnpGraphEdge: { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }, + ], + [ + import('../../../libs/common/src/dtos/user.graph.dto'), + { + UserGraphDto: { + dsnpId: { required: true, type: () => String }, + dsnpGraphEdges: { required: false, type: () => [t['../../../libs/common/src/dtos/dsnp.graph.edge.dto'].DsnpGraphEdge] }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/graph.key.pair.dto'), + { + GraphKeyPairDto: { + publicKey: { required: true, type: () => String }, + privateKey: { required: true, type: () => String }, + keyType: { required: true, type: () => String, enum: t['../../../libs/common/src/dtos/key.type.dto'].KeyType }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/graph.query.dto'), + { + GraphsQueryParamsDto: { + dsnpIds: { required: true, type: () => [String] }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy.type.dto'].PrivacyType }, + graphKeyPairs: { required: true, type: () => [t['../../../libs/common/src/dtos/graph.key.pair.dto'].GraphKeyPairDto] }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/connections.dto'), + { + ConnectionDto: { + dsnpId: { required: true, type: () => String }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy.type.dto'].PrivacyType }, + direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.dto'].Direction }, + connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection.type.dto'].ConnectionType }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/provider.graph.dto'), + { + ProviderGraphDto: { + dsnpId: { required: true, type: () => String }, + connections: { required: true, type: () => ({ data: { required: true, type: () => [t['../../../libs/common/src/dtos/connections.dto'].ConnectionDto] } }) }, + graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph.key.pair.dto'].GraphKeyPairDto] }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/watch-graphs.dto'), + { WatchGraphsDto: { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }, + ], + [ + import('../../../libs/common/src/dtos/graph.change.notification.dto'), + { GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }, + ], + ], + controllers: [ + [ + import('./api.controller'), + { + ApiController: { + health: {}, + getGraphs: { type: [t['../../../libs/common/src/dtos/user.graph.dto'].UserGraphDto] }, + updateGraph: { type: t['../../../libs/common/src/dtos/graph.change.request.reference'].GraphChangeRepsonseDto }, + watchGraphs: {}, + }, + }, + ], + ], + }, + }; +}; diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index d258c883..78237483 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable no-undef */ import { INestApplication, ValidationPipe } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; diff --git a/apps/worker/src/BaseConsumer.ts b/apps/worker/src/BaseConsumer.ts index 52315b16..43bd402b 100644 --- a/apps/worker/src/BaseConsumer.ts +++ b/apps/worker/src/BaseConsumer.ts @@ -1,7 +1,7 @@ import { OnWorkerEvent, WorkerHost } from '@nestjs/bullmq'; import { Logger, OnModuleDestroy } from '@nestjs/common'; import { Job, Worker } from 'bullmq'; -import { ProcessingUtils } from '../../../libs/common/src/utils/processing'; +import * as ProcessingUtils from '../../../libs/common/src/utils/processing'; export abstract class BaseConsumer extends WorkerHost implements OnModuleDestroy { protected logger: Logger; diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index 1e2cc048..c7a3c53e 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -4,13 +4,14 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; -import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { RedisModule } from '@songkeys/nestjs-redis'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { GraphStateManager, QueueConstants } from '../../../../libs/common/src'; +import { GraphStateManager } from '../../../../libs/common/src'; import { GraphNotifierService } from './graph.monitor.processor.service'; import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; @Module({ imports: [ diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 6c4c200f..24dacb74 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -1,4 +1,4 @@ -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; @@ -8,11 +8,12 @@ import { RegistryError } from '@polkadot/types/types'; import axios from 'axios'; import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { AsyncDebouncerService, GraphChangeNotificationDto, GraphStateManager, ProviderGraphUpdateJob, QueueConstants, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; +import { AsyncDebouncerService, GraphChangeNotificationDto, GraphStateManager, ProviderGraphUpdateJob, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; -import { BlockchainConstants } from '../../../../libs/common/src/blockchain/blockchain-constants'; +import * as BlockchainConstants from '../../../../libs/common/src/blockchain/blockchain-constants'; import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts index 67921f49..21ba6652 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts @@ -4,12 +4,13 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; -import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { RedisModule } from '@songkeys/nestjs-redis'; import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { NonceService, QueueConstants } from '../../../../libs/common/src'; +import { NonceService } from '../../../../libs/common/src'; import { GraphUpdatePublisherService } from './graph.publisher.processor.service'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; @Module({ imports: [ diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index 64073b04..e7ffd556 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -1,4 +1,4 @@ -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable, OnApplicationShutdown } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; @@ -10,12 +10,13 @@ import { ISubmittableResult } from '@polkadot/types/types'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { SchedulerRegistry } from '@nestjs/schedule'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants, NonceService } from '../../../../libs/common/src'; +import { NonceService } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; import { GraphUpdateJob } from '../../../../libs/common/src/dtos/graph.update.job'; import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; import { createKeys } from '../../../../libs/common/src/blockchain/create-keys'; import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; export const SECONDS_PER_BLOCK = 12; const CAPACITY_EPOCH_TIMEOUT_NAME = 'capacity_check'; diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts index b0af20dd..c35600b3 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts @@ -4,11 +4,11 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; -import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { RedisModule } from '@songkeys/nestjs-redis'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants } from '../../../../libs/common/src'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; import { GraphReconnectionService } from './graph.reconnection.processor.service'; @Module({ diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index 0028856a..d6b4c628 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -1,4 +1,4 @@ -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; @@ -7,8 +7,9 @@ import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; import { MessageSourceId, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { AxiosError, AxiosResponse } from 'axios'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphUpdateJob, ProviderWebhookService, QueueConstants } from '../../../../libs/common/src'; +import { ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphUpdateJob, ProviderWebhookService } from '../../../../libs/common/src'; import { BaseConsumer } from '../BaseConsumer'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; @Injectable() @Processor(QueueConstants.RECONNECT_REQUEST_QUEUE) @@ -67,7 +68,7 @@ export class GraphReconnectionService extends BaseConsumer { const keyPairs: GraphKeyPairDto[] = []; let hasNextPage = true; - let webhookFailures: number = 0; + let webhookFailures = 0; while (hasNextPage) { this.logger.debug(`Fetching connections page ${params.pageNumber} for user ${dsnpUserId.toString()} from provider ${providerId.toString()}`); diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts index 63ea6d9d..3fecc535 100644 --- a/apps/worker/src/request_processor/request.processor.module.ts +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -4,10 +4,11 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; -import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { RedisModule } from '@songkeys/nestjs-redis'; import { ConfigModule } from '../../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { QueueConstants, GraphStateManager } from '../../../../libs/common/src'; +import { GraphStateManager } from '../../../../libs/common/src'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; import { RequestProcessorService } from './request.processor.service'; import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 186bf53e..dd4f2a5b 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -1,4 +1,4 @@ -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable, Logger } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; @@ -9,16 +9,8 @@ import { Option, Vec } from '@polkadot/types'; import { AnyNumber } from '@polkadot/types/types'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { BaseConsumer } from '../BaseConsumer'; -import { - ConnectionDto, - GraphStateManager, - GraphUpdateJob, - PrivacyType, - ProviderGraphUpdateJob, - QueueConstants, - SkipTransitiveGraphs, - createReconnectionJob, -} from '../../../../libs/common/src'; +import { ConnectionDto, GraphStateManager, GraphUpdateJob, PrivacyType, ProviderGraphUpdateJob, SkipTransitiveGraphs, createReconnectionJob } from '../../../../libs/common/src'; +import * as QueueConstants from '../../../../libs/common/src/utils/queues'; import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; import { Direction } from '../../../../libs/common/src/dtos/direction.dto'; import { SECONDS_PER_BLOCK } from '../graph_publisher/graph.publisher.processor.service'; @@ -87,7 +79,7 @@ export class RequestProcessorService extends BaseConsumer { const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); if (reImported) { // Use lua script to update last processed dsnpId - // @ts-ignore + // @ts-expect-error updateLastProcessed is defined in the constructor await this.cacheManager.updateLastProcessed(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY, dsnpUserId.toString(), blockDelay); this.logger.debug(`Re-imported bundles for ${dsnpUserId.toString()}`); // eslint-disable-next-line no-await-in-loop diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 128ff0ea..0cc02de0 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { BullModule } from '@nestjs/bullmq'; import { ScheduleModule } from '@nestjs/schedule'; import { EventEmitterModule } from '@nestjs/event-emitter'; -import { RedisModule } from '@liaoliaots/nestjs-redis'; +import { RedisModule } from '@songkeys/nestjs-redis'; import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; import { RequestProcessorModule } from './request_processor/request.processor.module'; import { RequestProcessorService } from './request_processor/request.processor.service'; @@ -12,8 +12,9 @@ import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.pr import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; -import { ProviderWebhookService, NonceService, QueueConstants, GraphStateManager } from '../../../libs/common/src'; +import { ProviderWebhookService, NonceService, GraphStateManager } from '../../../libs/common/src'; import { BlockchainScannerService } from '../../../libs/common/src/services/blockchain-scanner.service'; +import * as QueueConstants from '../../../libs/common/src/utils/queues'; @Module({ imports: [ diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..4d24646e --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,27 @@ +// @ts-check + +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import jestlint from 'eslint-plugin-jest'; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.strict, + ...tseslint.configs.stylistic, + { + files: ['**/*.spec.ts'], + ...jestlint.configs['flat/recommended'], + }, + { + rules: { + indent: 'off', + 'no-unused-vars': 'off', + '@typescript-eslint/no-non-null-assertion': 'warn', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-extraneous-class': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + }, + }, +); \ No newline at end of file diff --git a/libs/common/src/blockchain/blockchain-constants.ts b/libs/common/src/blockchain/blockchain-constants.ts index 7172599b..f998d01b 100644 --- a/libs/common/src/blockchain/blockchain-constants.ts +++ b/libs/common/src/blockchain/blockchain-constants.ts @@ -1,41 +1,39 @@ -export namespace BlockchainConstants { - interface IExtrinsicCall { - pallet: string; - extrinsic: string; - } +interface IExtrinsicCall { + pallet: string; + extrinsic: string; +} - interface IChainEvent { - eventPallet: string; - event: string; - } +interface IChainEvent { + eventPallet: string; + event: string; +} - interface IChainQuery { - queryPallet: string; - query: string; - } +interface IChainQuery { + queryPallet: string; + query: string; +} - interface IChainRpc { - rpcPallet: string; - rpc: string; - } - const PALLET_FREQ_TX_PYMT = 'frequencyTxPayment'; - const PALLET_STATEFUL_STORAGE = 'statefulStorage'; +interface IChainRpc { + rpcPallet: string; + rpc: string; +} +const PALLET_FREQ_TX_PYMT = 'frequencyTxPayment'; +const PALLET_STATEFUL_STORAGE = 'statefulStorage'; - const EX_PAY_CAPACITY_BATCH = 'payWithCapacityBatchAll'; - const EX_UPSERT_PAGE = 'upsertPage'; +const EX_PAY_CAPACITY_BATCH = 'payWithCapacityBatchAll'; +const EX_UPSERT_PAGE = 'upsertPage'; - const PAY_WITH_CAPACITY_BATCH: IExtrinsicCall = { pallet: PALLET_FREQ_TX_PYMT, extrinsic: EX_PAY_CAPACITY_BATCH }; +const PAY_WITH_CAPACITY_BATCH: IExtrinsicCall = { pallet: PALLET_FREQ_TX_PYMT, extrinsic: EX_PAY_CAPACITY_BATCH }; - /** - * The number of blocks to crawl for a given job - * @type {number} - * @memberof BlockchainConstants - * @static - * @readonly - * @public - * @constant - * @description - * The number of blocks to crawl for a given job - */ - export const NUMBER_BLOCKS_TO_CRAWL = 32n; // TODO: take from tx, keeping it constant to default tx mortality -} +/** + * The number of blocks to crawl for a given job + * @type {number} + * @memberof BlockchainConstants + * @static + * @readonly + * @public + * @constant + * @description + * The number of blocks to crawl for a given job + */ +export const NUMBER_BLOCKS_TO_CRAWL = 32n; // TODO: take from tx, keeping it constant to default tx mortality diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts index fa2c1e04..4a4c6de7 100644 --- a/libs/common/src/blockchain/blockchain.service.ts +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -8,7 +8,7 @@ import { BlockHash, BlockNumber, DispatchError, DispatchInfo, Hash, SignedBlock import { SubmittableExtrinsic } from '@polkadot/api/types'; import { AnyNumber, ISubmittableResult, RegistryError } from '@polkadot/types/types'; import { u32, Option, u128, u16 } from '@polkadot/types'; -import { PalletCapacityCapacityDetails, PalletCapacityEpochInfo, PalletSchemasSchema } from '@polkadot/types/lookup'; +import { PalletCapacityCapacityDetails, PalletCapacityEpochInfo } from '@polkadot/types/lookup'; import { ConfigService } from '../config/config.service'; import { Extrinsic } from './extrinsic'; @@ -122,11 +122,6 @@ export class BlockchainService implements OnApplicationBootstrap, OnApplicationS return this.rpc('system', 'accountNextIndex', account); } - public async getSchema(schemaId: number): Promise { - const schema: PalletSchemasSchema = await this.query('schemas', 'schemas', schemaId); - return schema; - } - public async capacityInfo(providerId: string): Promise<{ providerId: string; currentBlockNumber: number; @@ -187,7 +182,7 @@ export class BlockchainService implements OnApplicationBootstrap, OnApplicationS const eventsPromise = firstValueFrom(at.query.system.events()); let isTxSuccess = false; - let totalBlockCapacity: bigint = 0n; + let totalBlockCapacity = 0n; let txError: RegistryError | undefined; try { diff --git a/libs/common/src/blockchain/create-keys.ts b/libs/common/src/blockchain/create-keys.ts index b6fca978..7d1bb0b8 100644 --- a/libs/common/src/blockchain/create-keys.ts +++ b/libs/common/src/blockchain/create-keys.ts @@ -1,7 +1,6 @@ import { Keyring } from '@polkadot/api'; import { KeyringPair } from '@polkadot/keyring/types'; -// eslint-disable-next-line import/no-mutable-exports export let keyring: Keyring; export function createKeys(uri: string): KeyringPair { diff --git a/libs/common/src/blockchain/event-error.ts b/libs/common/src/blockchain/event-error.ts index fdaedcd2..831cc210 100644 --- a/libs/common/src/blockchain/event-error.ts +++ b/libs/common/src/blockchain/event-error.ts @@ -2,9 +2,9 @@ import { DispatchError } from '@polkadot/types/interfaces'; import { SpRuntimeDispatchError } from '@polkadot/types/lookup'; export class EventError extends Error { - name: string = ''; + name = ''; - message: string = ''; + message = ''; stack?: string = ''; diff --git a/libs/common/src/blockchain/extrinsic.ts b/libs/common/src/blockchain/extrinsic.ts index c07f0c59..5965edd9 100644 --- a/libs/common/src/blockchain/extrinsic.ts +++ b/libs/common/src/blockchain/extrinsic.ts @@ -33,7 +33,7 @@ import { filter, firstValueFrom, map, pipe, tap } from 'rxjs'; import { KeyringPair } from '@polkadot/keyring/types'; import { EventError } from './event-error'; -export type EventMap = { [key: string]: Event }; +export type EventMap = Record; function eventKey(event: Event): string { return `${event.section}.${event.method}`; diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index b12461de..f7536986 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -1,8 +1,3 @@ -/* eslint-disable import/no-extraneous-dependencies */ -/* -https://docs.nestjs.com/fundamentals/testing#unit-testing -*/ - import { Test } from '@nestjs/testing'; import { describe, it, expect, beforeAll, jest } from '@jest/globals'; import { ConfigModule } from '@nestjs/config'; @@ -12,6 +7,7 @@ import { configModuleOptions } from './env.config'; const setupConfigService = async (envObj: any): Promise => { jest.resetModules(); Object.keys(process.env).forEach((key) => { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete process.env[key]; }); process.env = { @@ -35,7 +31,7 @@ const setupConfigService = async (envObj: any): Promise => { }; describe('GraphSericeConfig', () => { - const ALL_ENV: { [key: string]: string | undefined } = { + const ALL_ENV: Record = { REDIS_URL: undefined, FREQUENCY_URL: undefined, QUEUE_HIGH_WATER: undefined, diff --git a/libs/common/src/constants.ts b/libs/common/src/constants.ts index c9856cdd..62889b65 100644 --- a/libs/common/src/constants.ts +++ b/libs/common/src/constants.ts @@ -11,16 +11,16 @@ export const CAPACITY_EPOCH_TIMEOUT_NAME = 'capacity-epoch-timeout'; * Last seen block number key for Redis * @type {string} */ -export const LAST_SEEN_BLOCK_NUMBER_SCANNER_KEY: string = 'lastSeenBlockNumberScanner'; +export const LAST_SEEN_BLOCK_NUMBER_SCANNER_KEY = 'lastSeenBlockNumberScanner'; /** * Filters and Events to watch key for Redis * @type {string} */ -export const EVENTS_TO_WATCH_KEY: string = 'eventsToWatch'; +export const EVENTS_TO_WATCH_KEY = 'eventsToWatch'; /** * Registered Webhook key for Redis * @type {string} */ -export const REGISTERED_WEBHOOK_KEY: string = 'registeredWebhook'; +export const REGISTERED_WEBHOOK_KEY = 'registeredWebhook'; diff --git a/libs/common/src/services/async_debouncer.ts b/libs/common/src/services/async_debouncer.ts index ef97ba62..44b6c738 100644 --- a/libs/common/src/services/async_debouncer.ts +++ b/libs/common/src/services/async_debouncer.ts @@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common'; import Redis from 'ioredis'; import { PrivacyType } from '@dsnp/graph-sdk'; import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; -import { QueueConstants } from '../utils/queues'; +import * as QueueConstants from '../utils/queues'; import { DsnpGraphEdge } from '../dtos/dsnp.graph.edge.dto'; import { ConfigService } from '../config/config.service'; import { GraphStateManager } from './graph-state-manager'; diff --git a/libs/common/src/services/blockchain-scanner.service.ts b/libs/common/src/services/blockchain-scanner.service.ts index 56ca94a3..9ac1fb9f 100644 --- a/libs/common/src/services/blockchain-scanner.service.ts +++ b/libs/common/src/services/blockchain-scanner.service.ts @@ -4,11 +4,11 @@ import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { SchedulerRegistry } from '@nestjs/schedule'; import { MILLISECONDS_PER_SECOND, SECONDS_PER_MINUTE } from 'time-constants'; -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import Redis from 'ioredis'; import { ConfigService } from '../config/config.service'; import { BlockchainService } from '../blockchain/blockchain.service'; -import { QueueConstants } from '../utils/queues'; +import * as QueueConstants from '../utils/queues'; import { UpdateTransitiveGraphs, createReconnectionJob } from '../interfaces/graph-update-job.interface'; export const LAST_SEEN_BLOCK_NUMBER_KEY = 'lastSeenBlockNumber'; diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts index ea68f8c4..ec61a400 100644 --- a/libs/common/src/services/graph-state-manager.ts +++ b/libs/common/src/services/graph-state-manager.ts @@ -32,7 +32,7 @@ export class GraphStateManager implements OnApplicationBootstrap { private environment: EnvironmentInterface; // Environment details - private schemaIds: { [key: string]: { [key: string]: number } }; + private schemaIds: Record>; private graphKeySchemaId: number; diff --git a/libs/common/src/services/nonce.service.ts b/libs/common/src/services/nonce.service.ts index 22e50d5b..9c66a226 100644 --- a/libs/common/src/services/nonce.service.ts +++ b/libs/common/src/services/nonce.service.ts @@ -1,9 +1,9 @@ -import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { InjectRedis } from '@songkeys/nestjs-redis'; import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common'; import Redis from 'ioredis'; import fs from 'fs'; import { createKeys } from '../blockchain/create-keys'; -import { RedisUtils } from '../utils/redis'; +import * as RedisUtils from '../utils/redis'; import { BlockchainService } from '../blockchain/blockchain.service'; import { ConfigService } from '../config/config.service'; @@ -34,7 +34,7 @@ export class NonceService implements OnApplicationBootstrap { async getNextNonce(): Promise { const nonce = await this.blockchainService.getNonce(this.accountId); const keys = this.getNextPossibleKeys(nonce); - // @ts-ignore + // @ts-expect-error incrementNonce is defined in the constructor const nextNonceIndex = await this.redis.incrementNonce(...keys, keys.length, RedisUtils.NONCE_KEY_EXPIRE_SECONDS); if (nextNonceIndex === -1) { this.logger.warn(`nextNonce was full even with ${RedisUtils.NUMBER_OF_NONCE_KEYS_TO_CHECK} ${nonce}`); diff --git a/libs/common/src/utils/base-consumer.ts b/libs/common/src/utils/base-consumer.ts index cc752f09..0f7173d5 100644 --- a/libs/common/src/utils/base-consumer.ts +++ b/libs/common/src/utils/base-consumer.ts @@ -1,7 +1,7 @@ import { OnWorkerEvent, WorkerHost } from '@nestjs/bullmq'; import { Logger, OnModuleDestroy } from '@nestjs/common'; import { Job, Worker } from 'bullmq'; -import { ProcessingUtils } from './processing'; +import * as ProcessingUtils from './processing'; export abstract class BaseConsumer extends WorkerHost implements OnModuleDestroy { protected logger: Logger; diff --git a/libs/common/src/utils/processing.ts b/libs/common/src/utils/processing.ts index 060fa6b6..b29ad2d1 100644 --- a/libs/common/src/utils/processing.ts +++ b/libs/common/src/utils/processing.ts @@ -1,8 +1,6 @@ -export namespace ProcessingUtils { - export const MAX_WAIT_FOR_GRACE_FULL_SHUTDOWN_MS = 6 * 1000; - export const DELAY_TO_CHECK_FOR_SHUTDOWN_MS = 300; - export async function delay(ms): Promise { - // eslint-disable-next-line no-promise-executor-return - return new Promise((resolve) => setTimeout(resolve, ms)); - } +export const MAX_WAIT_FOR_GRACE_FULL_SHUTDOWN_MS = 6 * 1000; +export const DELAY_TO_CHECK_FOR_SHUTDOWN_MS = 300; +export async function delay(ms): Promise { + // eslint-disable-next-line no-promise-executor-return + return new Promise((resolve) => setTimeout(resolve, ms)); } diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index 0bb58f31..72386cec 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -1,37 +1,35 @@ -export namespace QueueConstants { - /** - * Name of the queue that has all reconnecting requests - */ - export const RECONNECT_REQUEST_QUEUE = 'reconnectRequest'; +/** + * Name of the queue that has all reconnecting requests + */ +export const RECONNECT_REQUEST_QUEUE = 'reconnectRequest'; - /** - * Name of the queue that has all incoming requests - */ - export const GRAPH_CHANGE_REQUEST_QUEUE = 'graphChangeRequest'; +/** + * Name of the queue that has all incoming requests + */ +export const GRAPH_CHANGE_REQUEST_QUEUE = 'graphChangeRequest'; - /** - * Name of the queue that publishes graph changes to Frequency blockchain - */ - export const GRAPH_CHANGE_PUBLISH_QUEUE = 'graphChangePublish'; +/** + * Name of the queue that publishes graph changes to Frequency blockchain + */ +export const GRAPH_CHANGE_PUBLISH_QUEUE = 'graphChangePublish'; - /** - * Name of the queue that processes graph change notifications - */ - export const GRAPH_CHANGE_NOTIFY_QUEUE = 'graphChangeNotify'; +/** + * Name of the queue that processes graph change notifications + */ +export const GRAPH_CHANGE_NOTIFY_QUEUE = 'graphChangeNotify'; - /** - * Prefix for Redis keys that store webhook endpoints - */ - export const REDIS_WATCHER_PREFIX = 'graph-service-watcher'; +/** + * Prefix for Redis keys that store webhook endpoints + */ +export const REDIS_WATCHER_PREFIX = 'graph-service-watcher'; - /** - * Debouncer cache key - */ - export const DEBOUNCER_CACHE_KEY = 'graph-service-debouncer'; +/** + * Debouncer cache key + */ +export const DEBOUNCER_CACHE_KEY = 'graph-service-debouncer'; - /** - * Last processed dsnpId key for Redis - * @type {string} - */ - export const LAST_PROCESSED_DSNP_ID_KEY: string = 'lastProcessedDsnpId'; -} +/** + * Last processed dsnpId key for Redis + * @type {string} + */ +export const LAST_PROCESSED_DSNP_ID_KEY = 'lastProcessedDsnpId'; diff --git a/libs/common/src/utils/redis.ts b/libs/common/src/utils/redis.ts index 80c9c7e9..0a35e4b7 100644 --- a/libs/common/src/utils/redis.ts +++ b/libs/common/src/utils/redis.ts @@ -1,26 +1,24 @@ -export namespace RedisUtils { - /** - * 45 days upper limit to avoid keeping abandoned data forever - */ - export const STORAGE_EXPIRE_UPPER_LIMIT_SECONDS = 45 * 24 * 60 * 60; - /** - * batch Lock expire time which applies during closing operation - */ - export const BATCH_LOCK_EXPIRE_SECONDS = 6; - /** - * To be able to provide mostly unique nonces to submit transactions on chain we would need to check a number of - * temporarily locked keys on redis side and get the first available one. This number defines the number of keys - * we should look into before giving up - */ - export const NUMBER_OF_NONCE_KEYS_TO_CHECK = 50; - /** - * Nonce keys have to get expired shortly so that if any of nonce numbers get skipped we would still have a way to - * submit them after expiration - */ - export const NONCE_KEY_EXPIRE_SECONDS = 2; - const CHAIN_NONCE_KEY = 'chain:nonce'; +/** + * 45 days upper limit to avoid keeping abandoned data forever + */ +export const STORAGE_EXPIRE_UPPER_LIMIT_SECONDS = 45 * 24 * 60 * 60; +/** + * batch Lock expire time which applies during closing operation + */ +export const BATCH_LOCK_EXPIRE_SECONDS = 6; +/** + * To be able to provide mostly unique nonces to submit transactions on chain we would need to check a number of + * temporarily locked keys on redis side and get the first available one. This number defines the number of keys + * we should look into before giving up + */ +export const NUMBER_OF_NONCE_KEYS_TO_CHECK = 50; +/** + * Nonce keys have to get expired shortly so that if any of nonce numbers get skipped we would still have a way to + * submit them after expiration + */ +export const NONCE_KEY_EXPIRE_SECONDS = 2; +const CHAIN_NONCE_KEY = 'chain:nonce'; - export function getNonceKey(suffix: string) { - return `${CHAIN_NONCE_KEY}:${suffix}`; - } +export function getNonceKey(suffix: string) { + return `${CHAIN_NONCE_KEY}:${suffix}`; } diff --git a/package-lock.json b/package-lock.json index 8564cd75..d2ceb1da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,108 +9,85 @@ "version": "0.9.0", "license": "Apache-2.0", "dependencies": { - "@bull-board/api": "^5.8.3", - "@bull-board/express": "^5.8.3", - "@bull-board/nestjs": "^5.8.3", - "@bull-board/ui": "^5.8.3", - "@dsnp/frequency-schemas": "^1.0.2", - "@dsnp/graph-sdk": "^1.1.1", - "@frequency-chain/api-augment": "1.7.0", - "@jest/globals": "^29.5.0", - "@liaoliaots/nestjs-redis": "^9.0.5", + "@bull-board/api": "^5.17.1", + "@bull-board/express": "^5.17.1", + "@bull-board/nestjs": "^5.17.1", + "@bull-board/ui": "^5.17.1", + "@dsnp/frequency-schemas": "^1.1.0", + "@dsnp/graph-sdk": "^1.1.2", + "@dsnp/parquetjs": "^1.6.2", + "@frequency-chain/api-augment": "1.11.1", "@multiformats/blake2": "^1.0.13", - "@nestjs/axios": "^2.0.0", - "@nestjs/bullmq": "^10.0.0", - "@nestjs/cli": "^10.1.14", - "@nestjs/common": "^9.4.0", - "@nestjs/config": "^2.3.1", - "@nestjs/core": "^9.4.0", - "@nestjs/event-emitter": "^1.4.1", - "@nestjs/platform-express": "^9.4.0", - "@nestjs/schedule": "^3.0.3", - "@nestjs/swagger": "^7.1.8", - "@nestjs/testing": "^9.4.0", - "@nestjs/typeorm": "^9.0.1", - "@polkadot/api": "^10.9.1", - "@polkadot/api-base": "^10.9.1", - "@polkadot/keyring": "^12.3.2", - "@polkadot/types": "^10.9.1", - "@polkadot/util": "^12.3.2", - "@polkadot/util-crypto": "^12.3.2", + "@nestjs/bullmq": "^10.1.1", + "@nestjs/cli": "^10.3.2", + "@nestjs/common": "^10.3.8", + "@nestjs/config": "^3.2.2", + "@nestjs/core": "^10.3.8", + "@nestjs/event-emitter": "^2.0.4", + "@nestjs/platform-express": "^10.3.8", + "@nestjs/schedule": "^4.0.2", + "@nestjs/swagger": "^7.3.1", + "@polkadot/api": "^10.12.4", + "@polkadot/api-base": "^10.12.4", + "@polkadot/types": "^10.12.4", + "@polkadot/util": "^12.6.2", + "@songkeys/nestjs-redis": "^10.0.0", "@types/multer": "^1.4.7", - "@types/uuid": "^9.0.2", - "axios": "^1.3.6", - "bullmq": "^3.0.0", + "axios": "^1.6.8", + "bullmq": "^5.7.8", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "ioredis": "^5.3.2", - "joi": "^17.9.1", + "class-validator": "^0.14.1", + "form-data": "^4.0.0", + "ioredis": "^5.4.1", + "ipfs-only-hash": "^4.0.0", + "joi": "^17.13.1", "mime-types": "^2.1.35", "multiformats": "9.9.0", "rxjs": "^7.8.1", "time-constants": "^1.0.3" }, "devDependencies": { - "@polkadot/typegen": "10.9.1", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", - "@types/node": "^20.3.1", - "@types/supertest": "^2.0.12", - "@types/time-constants": "^1.0.0", - "@typescript-eslint/parser": "^6.18.1", - "@typescript-eslint/typescript-estree": "5.59.8", - "dotenv": "^16.3.1", - "eslint": "^8.42.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^8.8.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-nestjs": "^1.2.3", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "ioredis-mock": "^8.8.3", - "jest": "^29.5.0", - "license-report": "^6.4.0", - "nock": "^13.3.8", - "prettier": "^3.0.2", - "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "trace-unhandled": "^2.0.1", - "ts-jest": "^29.1.0", - "ts-loader": "^9.4.3", - "ts-node": "^10.9.1", + "@jest/globals": "^29.7.0", + "@nestjs/testing": "^10.3.8", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/node": "^20.12.10", + "@types/supertest": "^6.0.2", + "@types/time-constants": "^1.0.2", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "eslint-plugin-jest": "^28.5.0", + "ioredis-mock": "^8.9.0", + "jest": "^29.7.0", + "license-report": "^6.5.0", + "prettier": "^3.2.5", + "supertest": "^7.0.0", + "ts-jest": "^29.1.2", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "typescript": "^5.4.5", + "typescript-eslint": "^7.8.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@angular-devkit/core": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.9.tgz", - "integrity": "sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.2.tgz", + "integrity": "sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -134,11 +111,11 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.9.tgz", - "integrity": "sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.2.tgz", + "integrity": "sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==", "dependencies": { - "@angular-devkit/core": "17.0.9", + "@angular-devkit/core": "17.1.2", "jsonc-parser": "3.2.0", "magic-string": "0.30.5", "ora": "5.4.1", @@ -151,14 +128,14 @@ } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.0.9.tgz", - "integrity": "sha512-tznzzB26sy8jVUlV9HhXcbFYZcIIFMAiDMOuyLko2LZFjfoqW+OPvwa1mwAQwvVVSQZVAKvdndFhzwyl/axwFQ==", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.1.2.tgz", + "integrity": "sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==", "dependencies": { - "@angular-devkit/core": "17.0.9", - "@angular-devkit/schematics": "17.0.9", + "@angular-devkit/core": "17.1.2", + "@angular-devkit/schematics": "17.1.2", "ansi-colors": "4.1.3", - "inquirer": "9.2.11", + "inquirer": "9.2.12", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, @@ -217,11 +194,11 @@ } }, "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", - "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", + "version": "9.2.12", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", + "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", "dependencies": { - "@ljharb/through": "^2.3.9", + "@ljharb/through": "^2.3.11", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", @@ -268,591 +245,1418 @@ "node": ">=0.12.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "node_modules/@assemblyscript/loader": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "tslib": "^1.11.1" } }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", "dependencies": { - "color-name": "1.1.3" + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@babel/code-frame/node_modules/has-flag": { + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "tslib": "^1.11.1" } }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "engines": { - "node": ">=6.9.0" - } + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@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/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.575.0.tgz", + "integrity": "sha512-4h0YIvLNcKNqwPbxWqwHCH3KWMpRdKhfQPq7kZcZXzFRi3yVAVaAsZcH8eXZsKPlitxkfWNgvfcTXOjStL1uHA==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sso-oidc": "3.575.0", + "@aws-sdk/client-sts": "3.575.0", + "@aws-sdk/core": "3.575.0", + "@aws-sdk/credential-provider-node": "3.575.0", + "@aws-sdk/middleware-bucket-endpoint": "3.575.0", + "@aws-sdk/middleware-expect-continue": "3.575.0", + "@aws-sdk/middleware-flexible-checksums": "3.575.0", + "@aws-sdk/middleware-host-header": "3.575.0", + "@aws-sdk/middleware-location-constraint": "3.575.0", + "@aws-sdk/middleware-logger": "3.575.0", + "@aws-sdk/middleware-recursion-detection": "3.575.0", + "@aws-sdk/middleware-sdk-s3": "3.575.0", + "@aws-sdk/middleware-signing": "3.575.0", + "@aws-sdk/middleware-ssec": "3.575.0", + "@aws-sdk/middleware-user-agent": "3.575.0", + "@aws-sdk/region-config-resolver": "3.575.0", + "@aws-sdk/signature-v4-multi-region": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-endpoints": "3.575.0", + "@aws-sdk/util-user-agent-browser": "3.575.0", + "@aws-sdk/util-user-agent-node": "3.575.0", + "@aws-sdk/xml-builder": "3.575.0", + "@smithy/config-resolver": "^3.0.0", + "@smithy/core": "^2.0.0", + "@smithy/eventstream-serde-browser": "^3.0.0", + "@smithy/eventstream-serde-config-resolver": "^3.0.0", + "@smithy/eventstream-serde-node": "^3.0.0", + "@smithy/fetch-http-handler": "^3.0.0", + "@smithy/hash-blob-browser": "^3.0.0", + "@smithy/hash-node": "^3.0.0", + "@smithy/hash-stream-node": "^3.0.0", + "@smithy/invalid-dependency": "^3.0.0", + "@smithy/md5-js": "^3.0.0", + "@smithy/middleware-content-length": "^3.0.0", + "@smithy/middleware-endpoint": "^3.0.0", + "@smithy/middleware-retry": "^3.0.0", + "@smithy/middleware-serde": "^3.0.0", + "@smithy/middleware-stack": "^3.0.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/node-http-handler": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/url-parser": "^3.0.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.0", + "@smithy/util-defaults-mode-node": "^3.0.0", + "@smithy/util-endpoints": "^2.0.0", + "@smithy/util-retry": "^3.0.0", + "@smithy/util-stream": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.575.0.tgz", + "integrity": "sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.575.0", + "@aws-sdk/middleware-host-header": "3.575.0", + "@aws-sdk/middleware-logger": "3.575.0", + "@aws-sdk/middleware-recursion-detection": "3.575.0", + "@aws-sdk/middleware-user-agent": "3.575.0", + "@aws-sdk/region-config-resolver": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-endpoints": "3.575.0", + "@aws-sdk/util-user-agent-browser": "3.575.0", + "@aws-sdk/util-user-agent-node": "3.575.0", + "@smithy/config-resolver": "^3.0.0", + "@smithy/core": "^2.0.0", + "@smithy/fetch-http-handler": "^3.0.0", + "@smithy/hash-node": "^3.0.0", + "@smithy/invalid-dependency": "^3.0.0", + "@smithy/middleware-content-length": "^3.0.0", + "@smithy/middleware-endpoint": "^3.0.0", + "@smithy/middleware-retry": "^3.0.0", + "@smithy/middleware-serde": "^3.0.0", + "@smithy/middleware-stack": "^3.0.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/node-http-handler": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/url-parser": "^3.0.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.0", + "@smithy/util-defaults-mode-node": "^3.0.0", + "@smithy/util-endpoints": "^2.0.0", + "@smithy/util-middleware": "^3.0.0", + "@smithy/util-retry": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.575.0.tgz", + "integrity": "sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.575.0", + "@aws-sdk/core": "3.575.0", + "@aws-sdk/credential-provider-node": "3.575.0", + "@aws-sdk/middleware-host-header": "3.575.0", + "@aws-sdk/middleware-logger": "3.575.0", + "@aws-sdk/middleware-recursion-detection": "3.575.0", + "@aws-sdk/middleware-user-agent": "3.575.0", + "@aws-sdk/region-config-resolver": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-endpoints": "3.575.0", + "@aws-sdk/util-user-agent-browser": "3.575.0", + "@aws-sdk/util-user-agent-node": "3.575.0", + "@smithy/config-resolver": "^3.0.0", + "@smithy/core": "^2.0.0", + "@smithy/fetch-http-handler": "^3.0.0", + "@smithy/hash-node": "^3.0.0", + "@smithy/invalid-dependency": "^3.0.0", + "@smithy/middleware-content-length": "^3.0.0", + "@smithy/middleware-endpoint": "^3.0.0", + "@smithy/middleware-retry": "^3.0.0", + "@smithy/middleware-serde": "^3.0.0", + "@smithy/middleware-stack": "^3.0.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/node-http-handler": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/url-parser": "^3.0.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.0", + "@smithy/util-defaults-mode-node": "^3.0.0", + "@smithy/util-endpoints": "^2.0.0", + "@smithy/util-middleware": "^3.0.0", + "@smithy/util-retry": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.575.0.tgz", + "integrity": "sha512-8MrT4J2dRiskf0JFMGL5VNBqPvc6igNa218LGBJzHXmLsm1WfGCGnce84R7U2USr8oPOenu0XzSCLvMQyZbGWQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sso-oidc": "3.575.0", + "@aws-sdk/core": "3.575.0", + "@aws-sdk/credential-provider-node": "3.575.0", + "@aws-sdk/middleware-host-header": "3.575.0", + "@aws-sdk/middleware-logger": "3.575.0", + "@aws-sdk/middleware-recursion-detection": "3.575.0", + "@aws-sdk/middleware-user-agent": "3.575.0", + "@aws-sdk/region-config-resolver": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-endpoints": "3.575.0", + "@aws-sdk/util-user-agent-browser": "3.575.0", + "@aws-sdk/util-user-agent-node": "3.575.0", + "@smithy/config-resolver": "^3.0.0", + "@smithy/core": "^2.0.0", + "@smithy/fetch-http-handler": "^3.0.0", + "@smithy/hash-node": "^3.0.0", + "@smithy/invalid-dependency": "^3.0.0", + "@smithy/middleware-content-length": "^3.0.0", + "@smithy/middleware-endpoint": "^3.0.0", + "@smithy/middleware-retry": "^3.0.0", + "@smithy/middleware-serde": "^3.0.0", + "@smithy/middleware-stack": "^3.0.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/node-http-handler": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/url-parser": "^3.0.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.0", + "@smithy/util-defaults-mode-node": "^3.0.0", + "@smithy/util-endpoints": "^2.0.0", + "@smithy/util-middleware": "^3.0.0", + "@smithy/util-retry": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "node_modules/@aws-sdk/core": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.575.0.tgz", + "integrity": "sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@smithy/core": "^2.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/signature-v4": "^3.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.575.0.tgz", + "integrity": "sha512-YTgpq3rvYBXzW6OTDB00cE79evQtss/lz2GlJXgqqVXD0m7i77hGA8zb44VevP/WxtDaiSW7SSjuu8VCBGsg4g==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@aws-sdk/types": "3.575.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.575.0.tgz", + "integrity": "sha512-xQfVmYI+9KqRvhWY8fyElnpcVUBBUgi/Hoji3oU6WLrUjrX98k93He7gKDQSyHf7ykMLUAJYWwsV4AjQ2j6njA==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@smithy/fetch-http-handler": "^3.0.0", + "@smithy/node-http-handler": "^3.0.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-stream": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.575.0.tgz", + "integrity": "sha512-BdM6a/5VUuNge3c6yRuxvO+4srLoSfqHfkQGfUDfhTdTJpljlpfnc9h3z2Ni1+aueOHPZMNFWIktHDcX5wUGBg==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@aws-sdk/credential-provider-env": "3.575.0", + "@aws-sdk/credential-provider-process": "3.575.0", + "@aws-sdk/credential-provider-sso": "3.575.0", + "@aws-sdk/credential-provider-web-identity": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@smithy/credential-provider-imds": "^3.0.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "3.575.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.575.0.tgz", + "integrity": "sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.575.0", + "@aws-sdk/credential-provider-http": "3.575.0", + "@aws-sdk/credential-provider-ini": "3.575.0", + "@aws-sdk/credential-provider-process": "3.575.0", + "@aws-sdk/credential-provider-sso": "3.575.0", + "@aws-sdk/credential-provider-web-identity": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@smithy/credential-provider-imds": "^3.0.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.575.0.tgz", + "integrity": "sha512-2/5NJV7MZysKglqJSQ/O8OELNcwLcH3xknabL9NagtzB7RNB2p1AUXR0UlTey9sSDLL4oCmNa/+unYuglW/Ahg==", "dependencies": { - "@babel/types": "^7.22.5" + "@aws-sdk/types": "3.575.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.575.0.tgz", + "integrity": "sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==", "dependencies": { - "@babel/types": "^7.22.15" + "@aws-sdk/client-sso": "3.575.0", + "@aws-sdk/token-providers": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.575.0.tgz", + "integrity": "sha512-QcvVH7wpvpFRXGAGgCBfQeiF/ptD0NJ+Hrc8dDYfPGhFeZ0EoVQBYNphLi25xe7JZ+XbaqCKrURHZtr4fAEOJw==", "dependencies": { - "@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" + "@aws-sdk/types": "3.575.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@aws-sdk/client-sts": "3.575.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.575.0.tgz", + "integrity": "sha512-ytsp7xcmbpkVk4TLoi91YyXQh/vwSIGdJ2Awo/pi6ac5Fqe6OntPijh5GHSVj5ZrxW4haPWb6HdBmKMo4liGEw==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-config-provider": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.575.0.tgz", + "integrity": "sha512-8Nq4UtEi63MJPoYBACW5YoMKQdbrkLNGIdTyrolNRNwVS+6nQqDMvBplakCzQ1nL1rHOEEsKKc8e2BlG9SkR5A==", "dependencies": { - "@babel/types": "^7.22.5" + "@aws-sdk/types": "3.575.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.575.0.tgz", + "integrity": "sha512-UbyqN39v6s+olyuVKwX778w6J2ZuYpxb1j+KdhFtZwpMSLd/UIQ0+A71U2vB6TrC52OEW0jIXEEBv6PcMBz9nw==", "dependencies": { - "@babel/types": "^7.22.5" + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.575.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.575.0.tgz", + "integrity": "sha512-V2WoLBiXNCc4rIWZt6FUcP4TN0Vk02A9PPCBWkTfyOooiqfq+WZmZjRRBpwl1+5UsvARslrKWF0VzheMRXPJLQ==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.575.0.tgz", + "integrity": "sha512-MtQsLsEjSSSfm0OlQqg9PEzS1nxJDdApGoeCYLTbCzIp6hChdLZCCsDXwGg9S++24rjQsUglMhXh4WGXQ9FDnw==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.575.0.tgz", + "integrity": "sha512-7DEKx9Z11Maaye7FfhYtC8rjbM/PcFcMO2N4QEAfypcgWCj+w4gseE2OGdfAH9OFDoFc6YvLp53v16vbPjzQSg==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.575.0.tgz", + "integrity": "sha512-ri89ldRFos6KZDGaknWPS2XPO9qr+gZ7+mPaoU8YkSM1W4uKqtnUSONyc+O3CFGJrqReuGHhRq0l2Sld0bjwOw==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@aws-sdk/types": "3.575.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.575.0.tgz", + "integrity": "sha512-8cBG8/tap4F6+UigTpKu8D2bvsLgqRTmn1K86qo3LqRX0Wc5X8TVjdKA2PmG0onOOr7rqTLcP9Q02LCh3usU6Q==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/signature-v4": "^3.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-config-provider": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.575.0.tgz", + "integrity": "sha512-frpGG7i3YngWwrYIeDq8/nbat3Gfl803qasaS112rmlPU0ezmYS1SPxpXjpIKxUUYofbzaFtRBAOHU1u7GnWew==", "dependencies": { - "color-convert": "^1.9.0" + "@aws-sdk/types": "3.575.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/signature-v4": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.575.0.tgz", + "integrity": "sha512-rEFt2w3DdlmPsHRvVXOW6rNDIPE7UaEZ5a4LAkn78XilQYuQdhm5wtw5Ao0pJpDSVYNCZDVZaAvdHKQ1dnfwCA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@aws-sdk/types": "3.575.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.575.0.tgz", + "integrity": "sha512-fWlr4RfrUNS2R3PgP+WsoMYORAgv/47Lp0J0fb3dXO1YvdczNWddRbFSUX2MQxM/y9XFfQPLpLgzluhoL3Cjeg==", "dependencies": { - "color-name": "1.1.3" + "@aws-sdk/types": "3.575.0", + "@aws-sdk/util-endpoints": "3.575.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.575.0.tgz", + "integrity": "sha512-sBJKwTWKCWu9y8FzXIijYGwkKr3tDkPXM7BylToe6W+tGkp4OirV4iXrWA9zReNwTTepoxHufofqjGK9BtcI8g==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.575.0.tgz", + "integrity": "sha512-QMwuLuNwnEQ51RCZX8H/lXnOJgBcJJOCgClB9usW/XujNJVq8GnpZ5E7TsQLN88G6fifmcjQWonLKummuh/zVA==", "dependencies": { - "has-flag": "^3.0.0" + "@aws-sdk/middleware-sdk-s3": "3.575.0", + "@aws-sdk/types": "3.575.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/signature-v4": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@aws-sdk/token-providers": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.575.0.tgz", + "integrity": "sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==", + "dependencies": { + "@aws-sdk/types": "3.575.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "3.575.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@aws-sdk/types": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.575.0.tgz", + "integrity": "sha512-XrnolQGs0wXxdgNudirR14OgNOarH7WUif38+2Pd4onZH+L7XoILem0EgA1tRpgFpw2pFHlZCNaAHDNSBEal7g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", + "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.575.0.tgz", + "integrity": "sha512-wC5x+V6w3kRlR6X6XVINsAPDYG+Tzs3Wthlw+YLtjuPODUNZIQAqsABHahxnekFyAvse+1929Hwo+CaL+BHZGA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@aws-sdk/types": "3.575.0", + "@smithy/types": "^3.0.0", + "@smithy/util-endpoints": "^2.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.575.0.tgz", + "integrity": "sha512-iADonXyaXgwvC4T0qRuDWCdKInz82GX2cyezq/oqVlL8bPY7HD8jwZZruuJdq5tkaJi1EhbO4+f1ksZqOiZKvQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@aws-sdk/types": "3.575.0", + "@smithy/types": "^3.0.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.575.0.tgz", + "integrity": "sha512-kwzvBfA0LoILDOFS6BV8uOkksBHrYulP6kNXegB5eZnDSNia5DbBsXqxQ/HknNF5a429SWQw2aaQJEgQvZB1VA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@aws-sdk/types": "3.575.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.3.1" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.575.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.575.0.tgz", + "integrity": "sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/core": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "ms": "2.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@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.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@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.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -865,49 +1669,49 @@ "dev": true }, "node_modules/@bull-board/api": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-5.13.0.tgz", - "integrity": "sha512-v5wvnGim1pmSK9PR1RYSx1dsCW6sOQYJnpvRgU6HZbVbW/5Z0luUBGpYYxM2Ry98uYKeU999mbS7xjunOkAQDw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-5.17.1.tgz", + "integrity": "sha512-KQaH3z2YJxN2h+Kh4ZJ341NNEFwrsNeZAu9FtQX8h4G0nkSw3FSlgWDO6UrN0b448+co/gWTT6qZz0st2fFmPg==", "dependencies": { "redis-info": "^3.0.8" }, "peerDependencies": { - "@bull-board/ui": "5.13.0" + "@bull-board/ui": "5.17.1" } }, "node_modules/@bull-board/express": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-5.13.0.tgz", - "integrity": "sha512-KWI+nGLkZ1rLsOnjHvR7DdeP371l9Fr7narG0ygn78pybR5vAdcHXWde0Uusmm80JyM0nN1JOiqrhMp3mJH7NA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-5.17.1.tgz", + "integrity": "sha512-3aWDP7UPdnUj2SYdxKnu/Rtb/1a0KnfKu7a/iPUBVPQQJN8CQzcdcYG3BNhFnrbY8f3+efI1o0eUkgdkJYB1aA==", "dependencies": { - "@bull-board/api": "5.13.0", - "@bull-board/ui": "5.13.0", + "@bull-board/api": "5.17.1", + "@bull-board/ui": "5.17.1", "ejs": "^3.1.7", "express": "^4.17.3" } }, "node_modules/@bull-board/nestjs": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-5.13.0.tgz", - "integrity": "sha512-W5mAquKRIvL3voIrfZ5J/zKzPHOo9BmbN+zrBlJTQTB+SOZegK3/7CEQZR0x6FdmXW4Blq8bW/xC8u9e3yy2qA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-5.17.1.tgz", + "integrity": "sha512-kZDwOP7EQqNfJAnJgWIJ9EtuAXuoyZH3FTT+KZFhO/qsSAWP4tvspFznW7FoKJy7tZkyzJzRjl82mcsUYNpDNQ==", "dependencies": { "@nestjs/bull-shared": "^10.0.0" }, "peerDependencies": { - "@bull-board/api": "^5.13.0", - "@bull-board/express": "^5.13.0", + "@bull-board/api": "^5.17.1", + "@bull-board/express": "^5.17.1", "@nestjs/common": "^9.0.0 || ^10.0.0", "@nestjs/core": "^9.0.0 || ^10.0.0", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.8.1" } }, "node_modules/@bull-board/ui": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-5.13.0.tgz", - "integrity": "sha512-UZ88j0c/G/UI5+F3zh6If9LqgF4kMmvRmTgnNckm8HJbclUdqvrcHBpo/e0HfdCaWGGhI2Gc12hq+AECc6c4Sw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-5.17.1.tgz", + "integrity": "sha512-/BO4C454w7ar5ZaHfcThEY2A2SYD9YkQkBizq8o9sjglVctpnnnh37YY2iOVRZCZFXMKIe7t05Kd9/9p3IPvSw==", "dependencies": { - "@bull-board/api": "5.13.0" + "@bull-board/api": "5.17.1" } }, "node_modules/@colors/colors": { @@ -954,33 +1758,24 @@ "@dsnp/parquetjs": "^1.3.0" } }, - "node_modules/@dsnp/frequency-schemas/node_modules/@frequency-chain/api-augment": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.10.0.tgz", - "integrity": "sha512-AnjE4N78YQo1VRHoR0uqwfS0/RS1HBm6HSsoEUt40bZcie1BRP44EQ5/bm/xSg4+F7EQZyn8RRH1yM4SNfdQ3g==", - "dependencies": { - "@polkadot/api": "^10.9.1", - "@polkadot/rpc-provider": "^10.9.1", - "@polkadot/types": "^10.9.1" - } - }, "node_modules/@dsnp/graph-sdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.1.1.tgz", - "integrity": "sha512-9HCa5OkPvyOy7rESp/iMaH7XHiKsFUmEzCVQ6TAXB9upEiDJZOjLv8cd0UP8YyBIXYquqvtSr0MNBqpFoXk4jQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.1.2.tgz", + "integrity": "sha512-B8gOuq4CojsuRhZHsk8oROZ8KBaJ17gd2E3NOHnLr9Ak0wPQs4b1dSHtO9slG8CN/GB6qGhxkb2OgKvdNKx7lw==", "engines": { "node": "^14.0.0 || ^16.0.0 || >=17.0.0" } }, "node_modules/@dsnp/parquetjs": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dsnp/parquetjs/-/parquetjs-1.4.0.tgz", - "integrity": "sha512-zVRCkXRV/Qg6LZbNcBQrd8Shu+e7zP6iPpwn1M/Wq73SAcBi3Vq9u7pdy6SUw82WJw6N7Q1IenH4wJzLumQ0JA==", - "optional": true, + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@dsnp/parquetjs/-/parquetjs-1.6.2.tgz", + "integrity": "sha512-xlhCWVC5yl5zm7epSSm43OLh8ZKi/sk9zv01Kv8CYCkKFJgPQPFwNFobZ0XAEiD+xtexf8MOc7p7TAzm0pHweQ==", "dependencies": { + "@aws-sdk/client-s3": "^3.489.0", "@types/long": "^4.0.2", "@types/node-int64": "^0.4.29", "@types/thrift": "^0.10.11", + "brotli-wasm": "^2.0.1", "browserify-zlib": "^0.2.0", "bson": "4.6.3", "cross-fetch": "^3.1.4", @@ -989,7 +1784,6 @@ "snappyjs": "^0.6.1", "thrift": "0.16.0", "varint": "^6.0.0", - "wasm-brotli": "^2.0.2", "xxhash-wasm": "^1.0.2" }, "engines": { @@ -1059,29 +1853,52 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@frequency-chain/api-augment": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.7.0.tgz", - "integrity": "sha512-o1G4vepM2a6eTqdBf+5A92/UsCrawc6L9lrPgwYQN4Ev3Pq4xWt2VPy1/OuKkH/E2ZYhI+IAlIOfHtu5O6Dkcw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.11.1.tgz", + "integrity": "sha512-CzVjeGrWl8tbTavygZLUICrncjCC54hM5ioJU1Og2OPoX2P4GYf8xoks8MIyj1yOrYX++mzM6Uf0+nCh77QyFw==", "dependencies": { - "@polkadot/api": "^10.7.3", - "@polkadot/rpc-provider": "^10.7.3", - "@polkadot/types": "^10.7.3" + "@polkadot/api": "^10.9.1", + "@polkadot/rpc-provider": "^10.9.1", + "@polkadot/types": "^10.9.1" } }, "node_modules/@hapi/hoek": { @@ -1111,6 +1928,29 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1125,9 +1965,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@ioredis/as-callback": { @@ -1234,6 +2074,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1249,6 +2090,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1257,6 +2099,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1269,6 +2112,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1281,6 +2125,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -1292,6 +2137,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -1306,6 +2152,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -1317,6 +2164,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } @@ -1324,12 +2172,14 @@ "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "engines": { "node": ">=8" } @@ -1402,6 +2252,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -1416,6 +2267,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1428,6 +2280,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1439,6 +2292,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1455,6 +2309,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1532,6 +2387,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1587,6 +2443,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1612,6 +2469,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1625,41 +2483,41 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1668,9 +2526,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", - "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1682,28 +2540,12 @@ "integrity": "sha512-e4psVV9Fe2eBfS9xK2rzQ9lE5xS4tARm7EJzDb6sVZy3F+EMyHJ67i0NdBVR9BRyQx7YhogMCbB6R1QwXuBxMg==", "dev": true }, - "node_modules/@liaoliaots/nestjs-redis": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@liaoliaots/nestjs-redis/-/nestjs-redis-9.0.5.tgz", - "integrity": "sha512-nPcGLj0zW4mEsYtQYfWx3o7PmrMjuzFk6+t/g2IRopAeWWUZZ/5nIJ4KTKiz/3DJEUkbX8PZqB+dOhklGF0SVA==", - "dependencies": { - "tslib": "2.4.1" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0", - "ioredis": "^5.0.0" - } - }, "node_modules/@ljharb/through": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", - "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -1717,6 +2559,11 @@ "node": ">=8" } }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==" + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", @@ -1789,6 +2636,11 @@ "win32" ] }, + "node_modules/@multiformats/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" + }, "node_modules/@multiformats/blake2": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@multiformats/blake2/-/blake2-1.0.13.tgz", @@ -1798,64 +2650,43 @@ "multiformats": "^9.5.4" } }, - "node_modules/@nestjs/axios": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-2.0.0.tgz", - "integrity": "sha512-F6oceoQLEn031uun8NiommeMkRIojQqVryxQy/mK7fx0CI0KbgkJL3SloCQcsOD+agoEnqKJKXZpEvL6FNswJg==", - "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", - "axios": "^1.3.1", - "reflect-metadata": "^0.1.12", - "rxjs": "^6.0.0 || ^7.0.0" - } - }, "node_modules/@nestjs/bull-shared": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-10.0.1.tgz", - "integrity": "sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-10.1.1.tgz", + "integrity": "sha512-su7eThDrSz1oQagEi8l+1CyZ7N6nMgmyAX0DuZoXqT1KEVEDqGX7x80RlPVF60m/8SYOskckGMjJROSfNQcErw==", "dependencies": { - "tslib": "2.6.0" + "tslib": "2.6.2" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/@nestjs/bull-shared/node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" - }, "node_modules/@nestjs/bullmq": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/bullmq/-/bullmq-10.0.1.tgz", - "integrity": "sha512-YJtfJXfnQinN7OvGx/Qd6jlQFu56zVnI1SppftSS7gkthB2CbJQAjkrfCEPDjp11wbPptBhUnatIL2N+nH/3kA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/bullmq/-/bullmq-10.1.1.tgz", + "integrity": "sha512-afYx1wYCKtXEu1p0S1+qw2o7QaZWr/EQgF7Wkt3YL8RBIECy5S4C450gv/cRGd8EZjlt6bw8hGCLqR2Q5VjHpQ==", "dependencies": { - "@nestjs/bull-shared": "^10.0.1", - "tslib": "2.6.0" + "@nestjs/bull-shared": "^10.1.1", + "tslib": "2.6.2" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", - "bullmq": "^3.0.0 || ^4.0.0" + "bullmq": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@nestjs/bullmq/node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" - }, "node_modules/@nestjs/cli": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.3.0.tgz", - "integrity": "sha512-37h+wSDItY0NE/x3a/M9yb2cXzfsD4qoE26rHgFn592XXLelDN12wdnfn7dTIaiRZT7WOCdQ+BYP9mQikR4AsA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.3.2.tgz", + "integrity": "sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==", "dependencies": { - "@angular-devkit/core": "17.0.9", - "@angular-devkit/schematics": "17.0.9", - "@angular-devkit/schematics-cli": "17.0.9", + "@angular-devkit/core": "17.1.2", + "@angular-devkit/schematics": "17.1.2", + "@angular-devkit/schematics-cli": "17.1.2", "@nestjs/schematics": "^10.0.1", "chalk": "4.1.2", - "chokidar": "3.5.3", + "chokidar": "3.6.0", "cli-table3": "0.6.3", "commander": "4.1.1", "fork-ts-checker-webpack-plugin": "9.0.2", @@ -1870,7 +2701,7 @@ "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", "typescript": "5.3.3", - "webpack": "5.89.0", + "webpack": "5.90.1", "webpack-node-externals": "3.0.0" }, "bin": { @@ -1880,7 +2711,7 @@ "node": ">= 16.14" }, "peerDependencies": { - "@swc/cli": "^0.1.62", + "@swc/cli": "^0.1.62 || ^0.3.0", "@swc/core": "^1.3.62" }, "peerDependenciesMeta": { @@ -1892,13 +2723,91 @@ } } }, + "node_modules/@nestjs/cli/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nestjs/cli/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nestjs/cli/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@nestjs/cli/node_modules/webpack": { + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, "node_modules/@nestjs/common": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.4.3.tgz", - "integrity": "sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==", + "version": "10.3.8", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.8.tgz", + "integrity": "sha512-P+vPEIvqx2e+fonsYVlFXKvoChyJ8Tq+lfpqdVFqblovHbFr3kZ/nYX0cPs+XuW6bnRT8tz0SSR9XBGU43kJhw==", "dependencies": { "iterare": "1.2.1", - "tslib": "2.5.3", + "tslib": "2.6.2", "uid": "2.0.2" }, "funding": { @@ -1906,16 +2815,12 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "cache-manager": "<=5", "class-transformer": "*", "class-validator": "*", - "reflect-metadata": "^0.1.12", + "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, - "peerDependenciesMeta": { - "cache-manager": { - "optional": true - }, + "peerDependenciesMeta": { "class-transformer": { "optional": true }, @@ -1924,49 +2829,32 @@ } } }, - "node_modules/@nestjs/common/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, "node_modules/@nestjs/config": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.4.tgz", - "integrity": "sha512-IGdSF+0F9MJO6dCRTEahdxPz4iVijjtolcFBxnY+2QYM3bXYQvAgzskGZi+WkAFJN/VzR3TEp60gN5sI74GxPA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.2.2.tgz", + "integrity": "sha512-vGICPOui5vE6kPz1iwQ7oCnp3qWgqxldPmBQ9onkVoKlBtyc83KJCr7CjuVtf4OdovMAVcux1d8Q6jglU2ZphA==", "dependencies": { - "dotenv": "16.1.4", + "dotenv": "16.4.5", "dotenv-expand": "10.0.0", "lodash": "4.17.21", - "uuid": "9.0.0" + "uuid": "9.0.1" }, "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^6.0.0 || ^7.2.0" - } - }, - "node_modules/@nestjs/config/node_modules/dotenv": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", - "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "rxjs": "^7.1.0" } }, "node_modules/@nestjs/core": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.4.3.tgz", - "integrity": "sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==", + "version": "10.3.8", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.8.tgz", + "integrity": "sha512-AxF4tpYLDNn5Wfb3C4bNaaHJ4pREH5FJrSisR2A5zkYpQFORFs0Tc36lOFPMwBTy8Iv2wUwWLUVc5ftBnxEv4w==", "hasInstallScript": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", "path-to-regexp": "3.2.0", - "tslib": "2.5.3", + "tslib": "2.6.2", "uid": "2.0.2" }, "funding": { @@ -1974,11 +2862,11 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/microservices": "^9.0.0", - "@nestjs/platform-express": "^9.0.0", - "@nestjs/websockets": "^9.0.0", - "reflect-metadata": "^0.1.12", + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, "peerDependenciesMeta": { @@ -1993,33 +2881,27 @@ } } }, - "node_modules/@nestjs/core/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, "node_modules/@nestjs/event-emitter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-1.4.2.tgz", - "integrity": "sha512-5mskPMS4KVH6LghC+NynfdmGiMCOOv9CdgVpuWGipLrJECv5KWc7vaW5o/9BYrcqPkN7Ted6CJ+O4AfsTiRlgw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-2.0.4.tgz", + "integrity": "sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==", "dependencies": { "eventemitter2": "6.4.9" }, "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", - "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0", - "reflect-metadata": "^0.1.12" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.4.tgz", - "integrity": "sha512-xl+gUSp0B+ln1VSNoUftlglk8dfpUes3DHGxKZ5knuBxS5g2H/8p9/DSBOYWUfO5f4u9s6ffBPZ71WO+tbe5SA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", + "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "class-transformer": "^0.4.0 || ^0.5.0", "class-validator": "^0.13.0 || ^0.14.0", - "reflect-metadata": "^0.1.12" + "reflect-metadata": "^0.1.12 || ^0.2.0" }, "peerDependenciesMeta": { "class-transformer": { @@ -2031,89 +2913,77 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.4.3.tgz", - "integrity": "sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==", + "version": "10.3.8", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.8.tgz", + "integrity": "sha512-sifLoxgEJvAgbim1UuW6wyScMfkS9SVQRH+lN33N/9ZvZSjO6NSDLOe+wxqsnZkia+QrjFC0qy0ITRAsggfqbg==", "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", - "express": "4.18.2", + "express": "4.19.2", "multer": "1.4.4-lts.1", - "tslib": "2.5.3" + "tslib": "2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0" + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0" } }, - "node_modules/@nestjs/platform-express/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, "node_modules/@nestjs/schedule": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-3.0.4.tgz", - "integrity": "sha512-uFJpuZsXfpvgx2y7/KrIZW9e1L68TLiwRodZ6+Gc8xqQiHSUzAVn+9F4YMxWFlHITZvvkjWziUFgRNCitDcTZQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.0.2.tgz", + "integrity": "sha512-po9oauE7fO0CjhDKvVC2tzEgjOUwhxYoIsXIVkgfu+xaDMmzzpmXY2s1LT4oP90Z+PaTtPoAHmhslnYmo4mSZg==", "dependencies": { - "cron": "2.4.3", + "cron": "3.1.7", "uuid": "9.0.1" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", - "reflect-metadata": "^0.1.12" - } - }, - "node_modules/@nestjs/schedule/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@nestjs/schematics": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.0.tgz", - "integrity": "sha512-HQWvD3F7O0Sv3qHS2jineWxPLmBTLlyjT6VdSw2EAIXulitmV+ErxB3TCVQQORlNkl5p5cwRYWyBaOblDbNFIQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.1.tgz", + "integrity": "sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==", "dependencies": { - "@angular-devkit/core": "17.0.9", - "@angular-devkit/schematics": "17.0.9", + "@angular-devkit/core": "17.1.2", + "@angular-devkit/schematics": "17.1.2", "comment-json": "4.2.3", - "jsonc-parser": "3.2.0", + "jsonc-parser": "3.2.1", "pluralize": "8.0.0" }, "peerDependencies": { "typescript": ">=4.8.2" } }, + "node_modules/@nestjs/schematics/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, "node_modules/@nestjs/swagger": { - "version": "7.1.17", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.17.tgz", - "integrity": "sha512-ASCxBrvMEN2o/8vEEmrIPMNzrr/hVi7QIR4y1oNYvoBNXHuwoF1VSI3+4Rq/3xmwVnVveJxHlBIs2u5xY9VgGQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.3.1.tgz", + "integrity": "sha512-LUC4mr+5oAleEC/a2j8pNRh1S5xhKXJ1Gal5ZdRjt9XebQgbngXCdW7JTA9WOEcwGtFZN9EnKYdquzH971LZfw==", "dependencies": { - "@nestjs/mapped-types": "2.0.4", + "@microsoft/tsdoc": "^0.14.2", + "@nestjs/mapped-types": "2.0.5", "js-yaml": "4.1.0", "lodash": "4.17.21", "path-to-regexp": "3.2.0", - "swagger-ui-dist": "5.10.3" + "swagger-ui-dist": "5.11.2" }, "peerDependencies": { - "@fastify/static": "^6.0.0", + "@fastify/static": "^6.0.0 || ^7.0.0", "@nestjs/common": "^9.0.0 || ^10.0.0", "@nestjs/core": "^9.0.0 || ^10.0.0", "class-transformer": "*", "class-validator": "*", - "reflect-metadata": "^0.1.12" + "reflect-metadata": "^0.1.12 || ^0.2.0" }, "peerDependenciesMeta": { "@fastify/static": { @@ -2128,21 +2998,22 @@ } }, "node_modules/@nestjs/testing": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.4.3.tgz", - "integrity": "sha512-LDT8Ai2eKnTzvnPaJwWOK03qTaFap5uHHsJCv6dL0uKWk6hyF9jms8DjyVaGsaujCaXDG8izl1mDEER0OmxaZA==", + "version": "10.3.8", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.8.tgz", + "integrity": "sha512-hpX9das2TdFTKQ4/2ojhjI6YgXtCfXRKui3A4Qaj54VVzc5+mtK502Jj18Vzji98o9MVS6skmYu+S/UvW3U6Fw==", + "dev": true, "dependencies": { - "tslib": "2.5.3" + "tslib": "2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^9.0.0", - "@nestjs/core": "^9.0.0", - "@nestjs/microservices": "^9.0.0", - "@nestjs/platform-express": "^9.0.0" + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0" }, "peerDependenciesMeta": { "@nestjs/microservices": { @@ -2153,235 +3024,598 @@ } } }, - "node_modules/@nestjs/testing/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, - "node_modules/@nestjs/typeorm": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", - "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", + "node_modules/@noble/curves": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polkadot-api/client": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/client/-/client-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-0fqK6pUKcGHSG2pBvY+gfSS+1mMdjd/qRygAcKI5d05tKsnZLRnmhb9laDguKmGEIB0Bz9vQqNK3gIN/cfvVwg==", + "optional": true, + "dependencies": { + "@polkadot-api/metadata-builders": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/substrate-bindings": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/substrate-client": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/utils": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" + }, + "peerDependencies": { + "rxjs": ">=7.8.0" + } + }, + "node_modules/@polkadot-api/json-rpc-provider": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-EaUS9Fc3wsiUr6ZS43PQqaRScW7kM6DYbuM/ou0aYjm8N9MBqgDbGm2oL6RE1vAVmOfEuHcXZuZkhzWtyvQUtA==", + "optional": true + }, + "node_modules/@polkadot-api/json-rpc-provider-proxy": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-0hZ8vtjcsyCX8AyqP2sqUHa1TFFfxGWmlXJkit0Nqp9b32MwZqn5eaUAiV2rNuEpoglKOdKnkGtUF8t5MoodKw==", + "optional": true + }, + "node_modules/@polkadot-api/metadata-builders": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/metadata-builders/-/metadata-builders-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-BD7rruxChL1VXt0icC2gD45OtT9ofJlql0qIllHSRYgama1CR2Owt+ApInQxB+lWqM+xNOznZRpj8CXNDvKIMg==", + "optional": true, + "dependencies": { + "@polkadot-api/substrate-bindings": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/utils": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" + } + }, + "node_modules/@polkadot-api/substrate-bindings": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-bindings/-/substrate-bindings-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-N4vdrZopbsw8k57uG58ofO7nLXM4Ai7835XqakN27MkjXMp5H830A1KJE0L9sGQR7ukOCDEIHHcwXVrzmJ/PBg==", + "optional": true, + "dependencies": { + "@noble/hashes": "^1.3.1", + "@polkadot-api/utils": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@scure/base": "^1.1.1", + "scale-ts": "^1.6.0" + } + }, + "node_modules/@polkadot-api/substrate-client": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-client/-/substrate-client-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-lcdvd2ssUmB1CPzF8s2dnNOqbrDa+nxaaGbuts+Vo8yjgSKwds2Lo7Oq+imZN4VKW7t9+uaVcKFLMF7PdH0RWw==", + "optional": true + }, + "node_modules/@polkadot-api/utils": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/utils/-/utils-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-0CYaCjfLQJTCRCiYvZ81OncHXEKPzAexCMoVloR+v2nl/O2JRya/361MtPkeNLC6XBoaEgLAG9pWQpH3WePzsw==", + "optional": true + }, + "node_modules/@polkadot/api": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.13.1.tgz", + "integrity": "sha512-YrKWR4TQR5CDyGkF0mloEUo7OsUA+bdtENpJGOtNavzOQUDEbxFE0PVzokzZfVfHhHX2CojPVmtzmmLxztyJkg==", + "dependencies": { + "@polkadot/api-augment": "10.13.1", + "@polkadot/api-base": "10.13.1", + "@polkadot/api-derive": "10.13.1", + "@polkadot/keyring": "^12.6.2", + "@polkadot/rpc-augment": "10.13.1", + "@polkadot/rpc-core": "10.13.1", + "@polkadot/rpc-provider": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-augment": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/types-create": "10.13.1", + "@polkadot/types-known": "10.13.1", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "eventemitter3": "^5.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-augment": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.13.1.tgz", + "integrity": "sha512-IAKaCp19QxgOG4HKk9RAgUgC/VNVqymZ2GXfMNOZWImZhxRIbrK+raH5vN2MbWwtVHpjxyXvGsd1RRhnohI33A==", + "dependencies": { + "@polkadot/api-base": "10.13.1", + "@polkadot/rpc-augment": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-augment": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-base": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.13.1.tgz", + "integrity": "sha512-Okrw5hjtEjqSMOG08J6qqEwlUQujTVClvY1/eZkzKwNzPelWrtV6vqfyJklB7zVhenlxfxqhZKKcY7zWSW/q5Q==", + "dependencies": { + "@polkadot/rpc-core": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/util": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-derive": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.13.1.tgz", + "integrity": "sha512-ef0H0GeCZ4q5Om+c61eLLLL29UxFC2/u/k8V1K2JOIU+2wD5LF7sjAoV09CBMKKHfkLenRckVk2ukm4rBqFRpg==", + "dependencies": { + "@polkadot/api": "10.13.1", + "@polkadot/api-augment": "10.13.1", + "@polkadot/api-base": "10.13.1", + "@polkadot/rpc-core": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/keyring": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.6.2.tgz", + "integrity": "sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw==", + "dependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2" + } + }, + "node_modules/@polkadot/networks": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.6.2.tgz", + "integrity": "sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==", + "dependencies": { + "@polkadot/util": "12.6.2", + "@substrate/ss58-registry": "^1.44.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-augment": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.13.1.tgz", + "integrity": "sha512-iLsWUW4Jcx3DOdVrSHtN0biwxlHuTs4QN2hjJV0gd0jo7W08SXhWabZIf9mDmvUJIbR7Vk+9amzvegjRyIf5+A==", + "dependencies": { + "@polkadot/rpc-core": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-core": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.13.1.tgz", + "integrity": "sha512-eoejSHa+/tzHm0vwic62/aptTGbph8vaBpbvLIK7gd00+rT813ROz5ckB1CqQBFB23nHRLuzzX/toY8ID3xrKw==", + "dependencies": { + "@polkadot/rpc-augment": "10.13.1", + "@polkadot/rpc-provider": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/util": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-provider": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.13.1.tgz", + "integrity": "sha512-oJ7tatVXYJ0L7NpNiGd69D558HG5y5ZDmH2Bp9Dd4kFTQIiV8A39SlWwWUPCjSsen9lqSvvprNLnG/VHTpenbw==", + "dependencies": { + "@polkadot/keyring": "^12.6.2", + "@polkadot/types": "10.13.1", + "@polkadot/types-support": "10.13.1", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "@polkadot/x-fetch": "^12.6.2", + "@polkadot/x-global": "^12.6.2", + "@polkadot/x-ws": "^12.6.2", + "eventemitter3": "^5.0.1", + "mock-socket": "^9.3.1", + "nock": "^13.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@substrate/connect": "0.8.8" + } + }, + "node_modules/@polkadot/types": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.13.1.tgz", + "integrity": "sha512-Hfvg1ZgJlYyzGSAVrDIpp3vullgxrjOlh/CSThd/PI4TTN1qHoPSFm2hs77k3mKkOzg+LrWsLE0P/LP2XddYcw==", + "dependencies": { + "@polkadot/keyring": "^12.6.2", + "@polkadot/types-augment": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/types-create": "10.13.1", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-augment": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.13.1.tgz", + "integrity": "sha512-TcrLhf95FNFin61qmVgOgayzQB/RqVsSg9thAso1Fh6pX4HSbvI35aGPBAn3SkA6R+9/TmtECirpSNLtIGFn0g==", "dependencies": { - "uuid": "8.3.2" + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.2.0", - "typeorm": "^0.3.0" + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/typeorm/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@polkadot/types-codec": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.13.1.tgz", + "integrity": "sha512-AiQ2Vv2lbZVxEdRCN8XSERiWlOWa2cTDLnpAId78EnCtx4HLKYQSd+Jk9Y4BgO35R79mchK4iG+w6gZ+ukG2bg==", + "dependencies": { + "@polkadot/util": "^12.6.2", + "@polkadot/x-bigint": "^12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "node_modules/@polkadot/types-create": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.13.1.tgz", + "integrity": "sha512-Usn1jqrz35SXgCDAqSXy7mnD6j4RvB4wyzTAZipFA6DGmhwyxxIgOzlWQWDb+1PtPKo9vtMzen5IJ+7w5chIeA==", "dependencies": { - "@noble/hashes": "1.3.3" + "@polkadot/types-codec": "10.13.1", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=18" } }, - "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" + "node_modules/@polkadot/types-known": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.13.1.tgz", + "integrity": "sha512-uHjDW05EavOT5JeU8RbiFWTgPilZ+odsCcuEYIJGmK+es3lk/Qsdns9Zb7U7NJl7eJ6OWmRtyrWsLs+bU+jjIQ==", + "dependencies": { + "@polkadot/networks": "^12.6.2", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/types-create": "10.13.1", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=18" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@polkadot/types-support": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.13.1.tgz", + "integrity": "sha512-4gEPfz36XRQIY7inKq0HXNVVhR6HvXtm7yrEmuBuhM86LE0lQQBkISUSgR358bdn2OFSLMxMoRNoh3kcDvdGDQ==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@polkadot/util": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.6.2.tgz", + "integrity": "sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==", + "dependencies": { + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-global": "12.6.2", + "@polkadot/x-textdecoder": "12.6.2", + "@polkadot/x-textencoder": "12.6.2", + "@types/bn.js": "^5.1.5", + "bn.js": "^5.2.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@polkadot/util-crypto": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz", + "integrity": "sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@noble/curves": "^1.3.0", + "@noble/hashes": "^1.3.3", + "@polkadot/networks": "12.6.2", + "@polkadot/util": "12.6.2", + "@polkadot/wasm-crypto": "^7.3.2", + "@polkadot/wasm-util": "^7.3.2", + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-randomvalues": "12.6.2", + "@scure/base": "^1.1.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@polkadot/wasm-bridge": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz", + "integrity": "sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, + "node_modules/@polkadot/wasm-crypto": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz", + "integrity": "sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==", + "dependencies": { + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-init": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, - "node_modules/@pkgr/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", - "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", - "dev": true, + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz", + "integrity": "sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "@polkadot/util": "*" } }, - "node_modules/@polkadot/api": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.11.2.tgz", - "integrity": "sha512-AorCZxCWCoTtdbl4DPUZh+ACe/pbLIS1BkdQY0AFJuZllm0x/yWzjgampcPd5jQAA/O3iKShRBkZqj6Mk9yG/A==", + "node_modules/@polkadot/wasm-crypto-init": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz", + "integrity": "sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==", "dependencies": { - "@polkadot/api-augment": "10.11.2", - "@polkadot/api-base": "10.11.2", - "@polkadot/api-derive": "10.11.2", - "@polkadot/keyring": "^12.6.2", - "@polkadot/rpc-augment": "10.11.2", - "@polkadot/rpc-core": "10.11.2", - "@polkadot/rpc-provider": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-augment": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/types-create": "10.11.2", - "@polkadot/types-known": "10.11.2", - "@polkadot/util": "^12.6.2", - "@polkadot/util-crypto": "^12.6.2", - "eventemitter3": "^5.0.1", - "rxjs": "^7.8.1", + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, - "node_modules/@polkadot/api-augment": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.11.2.tgz", - "integrity": "sha512-PTpnqpezc75qBqUtgrc0GYB8h9UHjfbHSRZamAbecIVAJ2/zc6CqtnldeaBlIu1IKTgBzi3FFtTyYu+ZGbNT2Q==", - "dependencies": { - "@polkadot/api-base": "10.11.2", - "@polkadot/rpc-augment": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-augment": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/util": "^12.6.2", + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz", + "integrity": "sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==", + "dependencies": { + "@polkadot/wasm-util": "7.3.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" } }, - "node_modules/@polkadot/api-augment/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/api-base": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.11.2.tgz", - "integrity": "sha512-4LIjaUfO9nOzilxo7XqzYKCNMtmUypdk8oHPdrRnSjKEsnK7vDsNi+979z2KXNXd2KFSCFHENmI523fYnMnReg==", + "node_modules/@polkadot/wasm-util": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz", + "integrity": "sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==", "dependencies": { - "@polkadot/rpc-core": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/util": "^12.6.2", - "rxjs": "^7.8.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" } }, - "node_modules/@polkadot/api-base/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@polkadot/x-bigint": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz", + "integrity": "sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/@polkadot/api-derive": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.11.2.tgz", - "integrity": "sha512-m3BQbPionkd1iSlknddxnL2hDtolPIsT+aRyrtn4zgMRPoLjHFmTmovvg8RaUyYofJtZeYrnjMw0mdxiSXx7eA==", - "dependencies": { - "@polkadot/api": "10.11.2", - "@polkadot/api-augment": "10.11.2", - "@polkadot/api-base": "10.11.2", - "@polkadot/rpc-core": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/util": "^12.6.2", - "@polkadot/util-crypto": "^12.6.2", - "rxjs": "^7.8.1", + "node_modules/@polkadot/x-fetch": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz", + "integrity": "sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw==", + "dependencies": { + "@polkadot/x-global": "12.6.2", + "node-fetch": "^3.3.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18" } }, - "node_modules/@polkadot/api-derive/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@polkadot/x-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } }, - "node_modules/@polkadot/api/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@polkadot/x-global": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.6.2.tgz", + "integrity": "sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/@polkadot/keyring": { + "node_modules/@polkadot/x-randomvalues": { "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.6.2.tgz", - "integrity": "sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw==", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz", + "integrity": "sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==", "dependencies": { - "@polkadot/util": "12.6.2", - "@polkadot/util-crypto": "12.6.2", + "@polkadot/x-global": "12.6.2", "tslib": "^2.6.2" }, "engines": { @@ -2389,934 +3623,866 @@ }, "peerDependencies": { "@polkadot/util": "12.6.2", - "@polkadot/util-crypto": "12.6.2" + "@polkadot/wasm-util": "*" } }, - "node_modules/@polkadot/keyring/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/networks": { + "node_modules/@polkadot/x-textdecoder": { "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.6.2.tgz", - "integrity": "sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz", + "integrity": "sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==", "dependencies": { - "@polkadot/util": "12.6.2", - "@substrate/ss58-registry": "^1.44.0", + "@polkadot/x-global": "12.6.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18" } }, - "node_modules/@polkadot/networks/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/rpc-augment": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.11.2.tgz", - "integrity": "sha512-9AhT0WW81/8jYbRcAC6PRmuxXqNhJje8OYiulBQHbG1DTCcjAfz+6VQBke9BwTStzPq7d526+yyBKD17O3zlAA==", + "node_modules/@polkadot/x-textencoder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz", + "integrity": "sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==", "dependencies": { - "@polkadot/rpc-core": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/util": "^12.6.2", + "@polkadot/x-global": "12.6.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18" } }, - "node_modules/@polkadot/rpc-augment/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/rpc-core": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.11.2.tgz", - "integrity": "sha512-Ot0CFLWx8sZhLZog20WDuniPA01Bk2StNDsdAQgcFKPwZw6ShPaZQCHuKLQK6I6DodOrem9FXX7c1hvoKJP5Ww==", + "node_modules/@polkadot/x-ws": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.6.2.tgz", + "integrity": "sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw==", "dependencies": { - "@polkadot/rpc-augment": "10.11.2", - "@polkadot/rpc-provider": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/util": "^12.6.2", - "rxjs": "^7.8.1", - "tslib": "^2.6.2" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2", + "ws": "^8.15.1" }, "engines": { "node": ">=18" } }, - "node_modules/@polkadot/rpc-core/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, - "node_modules/@polkadot/rpc-provider": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.11.2.tgz", - "integrity": "sha512-he5jWMpDJp7e+vUzTZDzpkB7ps3H8psRally+/ZvZZScPvFEjfczT7I1WWY9h58s8+ImeVP/lkXjL9h/gUOt3Q==", + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { - "@polkadot/keyring": "^12.6.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-support": "10.11.2", - "@polkadot/util": "^12.6.2", - "@polkadot/util-crypto": "^12.6.2", - "@polkadot/x-fetch": "^12.6.2", - "@polkadot/x-global": "^12.6.2", - "@polkadot/x-ws": "^12.6.2", - "eventemitter3": "^5.0.1", - "mock-socket": "^9.3.1", - "nock": "^13.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@substrate/connect": "0.7.35" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@polkadot/rpc-provider/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, - "node_modules/@polkadot/typegen": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/typegen/-/typegen-10.9.1.tgz", - "integrity": "sha512-SbG9U8/POyY8QwQUp70qzTnYsRxc6Rrjt4wzIWsBKmzVRy0i19O23EXSUo+81ukOBiLZj551GAJwRa3YBpdR+A==", - "dev": true, - "dependencies": { - "@polkadot/api": "10.9.1", - "@polkadot/api-augment": "10.9.1", - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/rpc-provider": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-augment": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/types-create": "10.9.1", - "@polkadot/types-support": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", - "@polkadot/x-ws": "^12.3.1", - "handlebars": "^4.7.7", - "tslib": "^2.5.3", - "yargs": "^17.7.2" - }, - "bin": { - "polkadot-types-chain-info": "scripts/polkadot-types-chain-info.mjs", - "polkadot-types-from-chain": "scripts/polkadot-types-from-chain.mjs", - "polkadot-types-from-defs": "scripts/polkadot-types-from-defs.mjs", - "polkadot-types-internal-interfaces": "scripts/polkadot-types-internal-interfaces.mjs", - "polkadot-types-internal-metadata": "scripts/polkadot-types-internal-metadata.mjs" - }, - "engines": { - "node": ">=16" + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/api": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.9.1.tgz", - "integrity": "sha512-ND/2UqZBWvtt4PfV03OStTKg0mxmPk4UpMAgJKutdgsz/wP9CYJ1KbjwFgPNekL9JnzbKQsWyQNPVrcw7kQk8A==", - "dev": true, - "dependencies": { - "@polkadot/api-augment": "10.9.1", - "@polkadot/api-base": "10.9.1", - "@polkadot/api-derive": "10.9.1", - "@polkadot/keyring": "^12.3.1", - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/rpc-core": "10.9.1", - "@polkadot/rpc-provider": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-augment": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/types-create": "10.9.1", - "@polkadot/types-known": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", - "eventemitter3": "^5.0.1", - "rxjs": "^7.8.1", - "tslib": "^2.5.3" - }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, "engines": { - "node": ">=16" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/api-augment": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.9.1.tgz", - "integrity": "sha512-kRZZvCFVcN4hAH4dJ+Qzfdy27/4EEq3oLDf3ihj0LTVrAezSWcKPGE3EVFy+Mn6Lo4SUc7RVyoKvIUhSk2l4Dg==", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { - "@polkadot/api-base": "10.9.1", - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-augment": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" - }, - "engines": { - "node": ">=16" + "type-detect": "4.0.8" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/api-base": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.9.1.tgz", - "integrity": "sha512-Q3m2KzlceMK2kX8bhnUZWk3RT6emmijeeFZZQgCePpEcrSeNjnqG4qjuTPgkveaOkUT8MAoDc5Avuzcc2jlW9g==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@polkadot/rpc-core": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/util": "^12.3.1", - "rxjs": "^7.8.1", - "tslib": "^2.5.3" - }, - "engines": { - "node": ">=16" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/api-derive": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.9.1.tgz", - "integrity": "sha512-mRud1UZCFIc4Z63qAoGSIHh/foyUYADfy1RQYCmPpeFKfIdCIrHpd7xFdJXTOMYOS0BwlM6u4qli/ZT4XigezQ==", - "dev": true, - "dependencies": { - "@polkadot/api": "10.9.1", - "@polkadot/api-augment": "10.9.1", - "@polkadot/api-base": "10.9.1", - "@polkadot/rpc-core": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", - "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "node_modules/@smithy/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==", + "dependencies": { + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/rpc-augment": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.9.1.tgz", - "integrity": "sha512-MaLHkNlyqN20ZRYr6uNd1BZr1OsrnX9qLAmsl0mcrri1vPGRH6VHjfFH1RBLkikpWD82v17g0l2hLwdV1ZHMcw==", - "dev": true, + "node_modules/@smithy/chunked-blob-reader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz", + "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==", "dependencies": { - "@polkadot/rpc-core": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" - }, - "engines": { - "node": ">=16" + "tslib": "^2.6.2" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/rpc-core": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.9.1.tgz", - "integrity": "sha512-ZtA8B8SfXSAwVkBlCcKRHw0eSM7ec/sbiNOM5GasXPeRujUgT7lOwSH2GbUZSqe9RfRDMp6DvO9c2JoGc3LLWw==", - "dev": true, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz", + "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==", "dependencies": { - "@polkadot/rpc-augment": "10.9.1", - "@polkadot/rpc-provider": "10.9.1", - "@polkadot/types": "10.9.1", - "@polkadot/util": "^12.3.1", - "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.0.tgz", + "integrity": "sha512-2GzOfADwYLQugYkKQhIyZyQlM05K+tMKvRnc6eFfZcpJGRfKoMUMYdPlBKmqHwQFXQKBrGV6cxL9oymWgDzvFw==", + "dependencies": { + "@smithy/node-config-provider": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/rpc-provider": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.9.1.tgz", - "integrity": "sha512-4QzT2QzD+320+eT6b79sGAA85Tt3Bb8fQvse4r5Mom2iiBd2SO81vOhxSAOaIe4GUsw25VzFJmsbe7+OObItdg==", - "dev": true, - "dependencies": { - "@polkadot/keyring": "^12.3.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-support": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", - "@polkadot/x-fetch": "^12.3.1", - "@polkadot/x-global": "^12.3.1", - "@polkadot/x-ws": "^12.3.1", - "eventemitter3": "^5.0.1", - "mock-socket": "^9.2.1", - "nock": "^13.3.1", - "tslib": "^2.5.3" + "node_modules/@smithy/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.0.0.tgz", + "integrity": "sha512-y1VuiOpU8nL0KlL0pvYpOddKGK+8xpD4Jvg9NN42Bl6gHWAr46LpAzWi4I78WxcFIMN1vw1+RUVOlcqR/vfs5g==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.0.0", + "@smithy/middleware-retry": "^3.0.0", + "@smithy/middleware-serde": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@substrate/connect": "0.7.26" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/types": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.9.1.tgz", - "integrity": "sha512-AG33i2ZGGfq7u+5rkAdGrXAQHHl844/Yv+junH5ZzX69xiCoWO1bH/yzDUNBdpki2GlACWvF9nLYh3F2tVF93w==", - "dev": true, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.0.0.tgz", + "integrity": "sha512-lfmBiFQcA3FsDAPxNfY0L7CawcWtbyWsBOHo34nF095728JLkBX4Y9q/VPPE2r7fqMVK+drmDigqE2/SSQeVRA==", "dependencies": { - "@polkadot/keyring": "^12.3.1", - "@polkadot/types-augment": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/types-create": "10.9.1", - "@polkadot/util": "^12.3.1", - "@polkadot/util-crypto": "^12.3.1", - "rxjs": "^7.8.1", - "tslib": "^2.5.3" + "@smithy/node-config-provider": "^3.0.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/url-parser": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/types-augment": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.9.1.tgz", - "integrity": "sha512-OY9/jTMFRFqYdkUnfcGwqMLC64A0Q25bjvCuVQCVjsPFKE3wl0Kt5rNT01eV2UmLXrR6fY0xWbR2w80bLA7CIQ==", - "dev": true, + "node_modules/@smithy/eventstream-codec": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.0.0.tgz", + "integrity": "sha512-PUtyEA0Oik50SaEFCZ0WPVtF9tz/teze2fDptW6WRXl+RrEenH8UbEjudOz8iakiMl3lE3lCVqYf2Y+znL8QFQ==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.0.tgz", + "integrity": "sha512-NB7AFiPN4NxP/YCAnrvYR18z2/ZsiHiF7VtG30gshO9GbFrIb1rC8ep4NGpJSWrz6P64uhPXeo4M0UsCLnZKqw==", "dependencies": { - "@polkadot/types": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" + "@smithy/eventstream-serde-universal": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/types-codec": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.9.1.tgz", - "integrity": "sha512-mJ5OegKGraY1FLvEa8FopRCr3pQrhDkcn5RNOjmgJQozENVeRaxhk0NwxYz7IojFvSDnKnc6lNQfKaaSe5pLHg==", - "dev": true, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.0.tgz", + "integrity": "sha512-RUQG3vQ3LX7peqqHAbmayhgrF5aTilPnazinaSGF1P0+tgM3vvIRWPHmlLIz2qFqB9LqFIxditxc8O2Z6psrRw==", "dependencies": { - "@polkadot/util": "^12.3.1", - "@polkadot/x-bigint": "^12.3.1", - "tslib": "^2.5.3" + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/types-create": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.9.1.tgz", - "integrity": "sha512-OVz50MGTTuiuVnRP/zAx4CTuLioc0hsiwNwqN2lNhmIJGtnQ4Vy/7mQRsIWehiYz6g0Vzzm5B3qWkTXO1NSN5w==", - "dev": true, + "node_modules/@smithy/eventstream-serde-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.0.tgz", + "integrity": "sha512-baRPdMBDMBExZXIUAoPGm/hntixjt/VFpU6+VmCyiYJYzRHRxoaI1MN+5XE+hIS8AJ2GCHLMFEIOLzq9xx1EgQ==", "dependencies": { - "@polkadot/types-codec": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" + "@smithy/eventstream-serde-universal": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/types-known": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.9.1.tgz", - "integrity": "sha512-zCMVWc4pJtkbMFPu72bD4IhvV/gkHXPX3C5uu92WdmCfnn0vEIEsMKWlVXVVvQQZKAqvs/awpqIfrUtEViOGEA==", - "dev": true, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.0.tgz", + "integrity": "sha512-HNFfShmotWGeAoW4ujP8meV9BZavcpmerDbPIjkJbxKbN8RsUcpRQ/2OyIxWNxXNH2GWCAxuSB7ynmIGJlQ3Dw==", "dependencies": { - "@polkadot/networks": "^12.3.1", - "@polkadot/types": "10.9.1", - "@polkadot/types-codec": "10.9.1", - "@polkadot/types-create": "10.9.1", - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" + "@smithy/eventstream-codec": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@polkadot/types-support": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.9.1.tgz", - "integrity": "sha512-XsieuLDsszvMZQlleacQBfx07i/JkwQV/UxH9q8Hz7Okmaz9pEVEW1h3ka2/cPuC7a4l32JhaORBUYshBZNdJg==", - "dev": true, + "node_modules/@smithy/fetch-http-handler": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.0.0.tgz", + "integrity": "sha512-gP1MlOpIB/onIbh4g9eSG3XdI/G31cAvd9Lo11192eL4mxks3xpkPaa+RIcZaX2Vmb8I8HzxBddPSXviY1iq0w==", + "dependencies": { + "@smithy/protocol-http": "^4.0.0", + "@smithy/querystring-builder": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.0.0.tgz", + "integrity": "sha512-/Wbpdg+bwJvW7lxR/zpWAc1/x/YkcqguuF2bAzkJrvXriZu1vm8r+PUdE4syiVwQg7PPR2dXpi3CLBb9qRDaVQ==", + "dependencies": { + "@smithy/chunked-blob-reader": "^3.0.0", + "@smithy/chunked-blob-reader-native": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.0.tgz", + "integrity": "sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==", "dependencies": { - "@polkadot/util": "^12.3.1", - "tslib": "^2.5.3" + "@smithy/types": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@substrate/connect": { - "version": "0.7.26", - "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.26.tgz", - "integrity": "sha512-uuGSiroGuKWj1+38n1kY5HReer5iL9bRwPCzuoLtqAOmI1fGI0hsSI2LlNQMAbfRgr7VRHXOk5MTuQf5ulsFRw==", - "dev": true, - "optional": true, + "node_modules/@smithy/hash-stream-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.0.0.tgz", + "integrity": "sha512-J0i7de+EgXDEGITD4fxzmMX8CyCNETTIRXlxjMiNUvvu76Xn3GJ31wQR85ynlPk2wI1lqoknAFJaD1fiNDlbIA==", "dependencies": { - "@substrate/connect-extension-protocol": "^1.0.1", - "eventemitter3": "^4.0.7", - "smoldot": "1.0.4" + "@smithy/types": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/@substrate/connect/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "optional": true - }, - "node_modules/@polkadot/typegen/node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "dev": true, - "optional": true + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.0.tgz", + "integrity": "sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==", + "dependencies": { + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + } }, - "node_modules/@polkadot/typegen/node_modules/smoldot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-1.0.4.tgz", - "integrity": "sha512-N3TazI1C4GGrseFH/piWyZCCCRJTRx2QhDfrUKRT4SzILlW5m8ayZ3QTKICcz1C/536T9cbHHJyP7afxI6Mi1A==", - "dev": true, - "optional": true, + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dependencies": { - "pako": "^2.0.4", - "ws": "^8.8.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@polkadot/typegen/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "node_modules/@smithy/md5-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.0.tgz", + "integrity": "sha512-Tm0vrrVzjlD+6RCQTx7D3Ls58S3FUH1ZCtU1MIh/qQmaOo1H9lMN2as6CikcEwgattnA9SURSdoJJ27xMcEfMA==", + "dependencies": { + "@smithy/types": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } }, - "node_modules/@polkadot/types": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.11.2.tgz", - "integrity": "sha512-d52j3xXni+C8GdYZVTSfu8ROAnzXFMlyRvXtor0PudUc8UQHOaC4+mYAkTBGA2gKdmL8MHSfRSbhcxHhsikY6Q==", + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.0.tgz", + "integrity": "sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==", "dependencies": { - "@polkadot/keyring": "^12.6.2", - "@polkadot/types-augment": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/types-create": "10.11.2", - "@polkadot/util": "^12.6.2", - "@polkadot/util-crypto": "^12.6.2", - "rxjs": "^7.8.1", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/types-augment": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.11.2.tgz", - "integrity": "sha512-8eB8ew04wZiE5GnmFvEFW1euJWmF62SGxb1O+8wL3zoUtB9Xgo1vB6w6xbTrd+HLV6jNSeXXnbbF1BEUvi9cNg==", - "dependencies": { - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/util": "^12.6.2", + "node_modules/@smithy/middleware-endpoint": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.0.tgz", + "integrity": "sha512-aXOAWztw/5qAfp0NcA2OWpv6ZI/E+Dh9mByif7i91D/0iyYNUcKvskmXiowKESFkuZ7PIMd3VOR4fTibZDs2OQ==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/url-parser": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/types-augment/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@smithy/middleware-retry": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.0.tgz", + "integrity": "sha512-kFaBiTa50y0iwhrOjX5UISo1SfiXPrE1EsMtZJAVF7Oci3AUpVzaMzRxzQJFGnxioSyCwSmzqiE9x4X3dW+7VQ==", + "dependencies": { + "@smithy/node-config-provider": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/service-error-classification": "^3.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", + "@smithy/util-retry": "^3.0.0", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@polkadot/types-codec": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.11.2.tgz", - "integrity": "sha512-3xjOQL+LOOMzYqlgP9ROL0FQnzU8lGflgYewzau7AsDlFziSEtb49a9BpYo6zil4koC+QB8zQ9OHGFumG08T8w==", + "node_modules/@smithy/middleware-serde": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.0.tgz", + "integrity": "sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==", "dependencies": { - "@polkadot/util": "^12.6.2", - "@polkadot/x-bigint": "^12.6.2", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/types-codec/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/types-create": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.11.2.tgz", - "integrity": "sha512-SJt23NxYvefRxVZZm6mT9ed1pR6FDoIGQ3xUpbjhTLfU2wuhpKjekMVorYQ6z/gK2JLMu2kV92Ardsz+6GX5XQ==", + "node_modules/@smithy/middleware-stack": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.0.tgz", + "integrity": "sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==", "dependencies": { - "@polkadot/types-codec": "10.11.2", - "@polkadot/util": "^12.6.2", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/types-create/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/types-known": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.11.2.tgz", - "integrity": "sha512-kbEIX7NUQFxpDB0FFGNyXX/odY7jbp56RGD+Z4A731fW2xh/DgAQrI994xTzuh0c0EqPE26oQm3kATSpseqo9w==", + "node_modules/@smithy/node-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.0.0.tgz", + "integrity": "sha512-buqfaSdDh0zo62EPLf8rGDvcpKwGpO5ho4bXS2cdFhlOta7tBkWJt+O5uiaAeICfIOfPclNOndshDNSanX2X9g==", "dependencies": { - "@polkadot/networks": "^12.6.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/types-create": "10.11.2", - "@polkadot/util": "^12.6.2", + "@smithy/property-provider": "^3.0.0", + "@smithy/shared-ini-file-loader": "^3.0.0", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/types-known/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/types-support": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.11.2.tgz", - "integrity": "sha512-X11hoykFYv/3efg4coZy2hUOUc97JhjQMJLzDhHniFwGLlYU8MeLnPdCVGkXx0xDDjTo4/ptS1XpZ5HYcg+gRw==", + "node_modules/@smithy/node-http-handler": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.0.0.tgz", + "integrity": "sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==", "dependencies": { - "@polkadot/util": "^12.6.2", + "@smithy/abort-controller": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/querystring-builder": "^3.0.0", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/types-support/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/types/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/util": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.6.2.tgz", - "integrity": "sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==", + "node_modules/@smithy/property-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.0.0.tgz", + "integrity": "sha512-LmbPgHBswdXCrkWWuUwBm9w72S2iLWyC/5jet9/Y9cGHtzqxi+GVjfCfahkvNV4KXEwgnH8EMpcrD9RUYe0eLQ==", "dependencies": { - "@polkadot/x-bigint": "12.6.2", - "@polkadot/x-global": "12.6.2", - "@polkadot/x-textdecoder": "12.6.2", - "@polkadot/x-textencoder": "12.6.2", - "@types/bn.js": "^5.1.5", - "bn.js": "^5.2.1", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/util-crypto": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz", - "integrity": "sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==", + "node_modules/@smithy/protocol-http": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.0.tgz", + "integrity": "sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==", "dependencies": { - "@noble/curves": "^1.3.0", - "@noble/hashes": "^1.3.3", - "@polkadot/networks": "12.6.2", - "@polkadot/util": "12.6.2", - "@polkadot/wasm-crypto": "^7.3.2", - "@polkadot/wasm-util": "^7.3.2", - "@polkadot/x-bigint": "12.6.2", - "@polkadot/x-randomvalues": "12.6.2", - "@scure/base": "^1.1.5", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "12.6.2" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/util-crypto/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/util/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/wasm-bridge": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz", - "integrity": "sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==", + "node_modules/@smithy/querystring-builder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.0.tgz", + "integrity": "sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==", "dependencies": { - "@polkadot/wasm-util": "7.3.2", + "@smithy/types": "^3.0.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "*", - "@polkadot/x-randomvalues": "*" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/wasm-bridge/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/wasm-crypto": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz", - "integrity": "sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==", + "node_modules/@smithy/querystring-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.0.tgz", + "integrity": "sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==", "dependencies": { - "@polkadot/wasm-bridge": "7.3.2", - "@polkadot/wasm-crypto-asmjs": "7.3.2", - "@polkadot/wasm-crypto-init": "7.3.2", - "@polkadot/wasm-crypto-wasm": "7.3.2", - "@polkadot/wasm-util": "7.3.2", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "*", - "@polkadot/x-randomvalues": "*" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/wasm-crypto-asmjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz", - "integrity": "sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==", + "node_modules/@smithy/service-error-classification": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.0.tgz", + "integrity": "sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==", "dependencies": { - "tslib": "^2.6.2" + "@smithy/types": "^3.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "*" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/wasm-crypto-asmjs/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/wasm-crypto-init": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz", - "integrity": "sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.0.0.tgz", + "integrity": "sha512-REVw6XauXk8xE4zo5aGL7Rz4ywA8qNMUn8RtWeTRQsgAlmlvbJ7CEPBcaXU2NDC3AYBgYAXrGyWD8XrN8UGDog==", "dependencies": { - "@polkadot/wasm-bridge": "7.3.2", - "@polkadot/wasm-crypto-asmjs": "7.3.2", - "@polkadot/wasm-crypto-wasm": "7.3.2", - "@polkadot/wasm-util": "7.3.2", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.0.0.tgz", + "integrity": "sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.0", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@polkadot/util": "*", - "@polkadot/x-randomvalues": "*" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@polkadot/wasm-crypto-init/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@smithy/smithy-client": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.0.0.tgz", + "integrity": "sha512-HTLlEOPOoPxyVCoqzwRGJuRh4hyAAo+eveRcEPi7UpIaq2PCAmdFZM76jabUuzlPPR9ge+OQlKzZre+LT1nXzA==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.0.0", + "@smithy/middleware-stack": "^3.0.0", + "@smithy/protocol-http": "^4.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-stream": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@polkadot/wasm-crypto-wasm": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz", - "integrity": "sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==", + "node_modules/@smithy/types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.0.0.tgz", + "integrity": "sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==", "dependencies": { - "@polkadot/wasm-util": "7.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "*" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/wasm-crypto-wasm/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/wasm-crypto/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@smithy/url-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.0.tgz", + "integrity": "sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + } }, - "node_modules/@polkadot/wasm-util": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz", - "integrity": "sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==", + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "*" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/wasm-util/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } }, - "node_modules/@polkadot/x-bigint": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz", - "integrity": "sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==", + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", "dependencies": { - "@polkadot/x-global": "12.6.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-bigint/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/x-fetch": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz", - "integrity": "sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw==", + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { - "@polkadot/x-global": "12.6.2", - "node-fetch": "^3.3.2", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-fetch/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "tslib": "^2.6.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-fetch/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/x-global": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.6.2.tgz", - "integrity": "sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.0.tgz", + "integrity": "sha512-/ChTQXFZVK/92dLR9RLW2fOG03ghgUYZnRfrs9d9T3L7UxtsGx9QitF7Ppu64A8xcUHqA30kV7TUayFRBd7YQw==", "dependencies": { + "@smithy/property-provider": "^3.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.0.tgz", + "integrity": "sha512-gfABCXswcMgDUcVO+16e4BgTFnouaXNCowp9mVxV8dgaOCpUT9eEWIC+PK3ZoEm26QwlwT7WgfuN1Y22HKX36g==", + "dependencies": { + "@smithy/config-resolver": "^3.0.0", + "@smithy/credential-provider-imds": "^3.0.0", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/property-provider": "^3.0.0", + "@smithy/smithy-client": "^3.0.0", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">= 10.0.0" } }, - "node_modules/@polkadot/x-global/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/x-randomvalues": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz", - "integrity": "sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==", + "node_modules/@smithy/util-endpoints": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.0.tgz", + "integrity": "sha512-+exaXzEY3DNt2qtA2OtRNSDlVrE4p32j1JSsQkzA5AdP0YtJNjkYbYhJxkFmPYcjI1abuwopOZCwUmv682QkiQ==", "dependencies": { - "@polkadot/x-global": "12.6.2", + "@smithy/node-config-provider": "^3.0.0", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@polkadot/util": "12.6.2", - "@polkadot/wasm-util": "*" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-randomvalues/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/x-textdecoder": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz", - "integrity": "sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==", + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { - "@polkadot/x-global": "12.6.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-textdecoder/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/x-textencoder": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz", - "integrity": "sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==", + "node_modules/@smithy/util-middleware": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.0.tgz", + "integrity": "sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==", "dependencies": { - "@polkadot/x-global": "12.6.2", + "@smithy/types": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-textencoder/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@polkadot/x-ws": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.6.2.tgz", - "integrity": "sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw==", + "node_modules/@smithy/util-retry": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.0.tgz", + "integrity": "sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==", "dependencies": { - "@polkadot/x-global": "12.6.2", - "tslib": "^2.6.2", - "ws": "^8.15.1" + "@smithy/service-error-classification": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@polkadot/x-ws/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@smithy/util-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.0.tgz", + "integrity": "sha512-AYQeeAxBi3yee9SXC0HgrbeIchQeo6EAkpiwwmmCK6Z7uq8GnMGe8AxRZT3O4wyMNRNK2qfjZSvx6+wKfuMajg==", + "dependencies": { + "@smithy/fetch-http-handler": "^3.0.0", + "@smithy/node-http-handler": "^3.0.0", + "@smithy/types": "^3.0.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sinonjs/commons": { + "node_modules/@smithy/util-waiter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.0.0.tgz", + "integrity": "sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==", "dependencies": { - "type-detect": "4.0.8" + "@smithy/abort-controller": "^3.0.0", + "@smithy/types": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@songkeys/nestjs-redis": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@songkeys/nestjs-redis/-/nestjs-redis-10.0.0.tgz", + "integrity": "sha512-s56+NECuJXzcaPLYzpvA2xjL0e/1Zy55UE0q6b1UqpbQSKI06TFPFCWCMUadJigiuB26O1hxi+lmDbzahKvcLg==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "tslib": "2.6.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "ioredis": "^5.0.0" } }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", - "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", - "peer": true + "node_modules/@songkeys/nestjs-redis/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/@substrate/connect": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.35.tgz", - "integrity": "sha512-Io8vkalbwaye+7yXfG1Nj52tOOoJln2bMlc7Q9Yy3vEWqZEVkgKmcPVzbwV0CWL3QD+KMPDA2Dnw/X7EdwgoLw==", - "hasInstallScript": true, + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.8.8.tgz", + "integrity": "sha512-zwaxuNEVI9bGt0rT8PEJiXOyebLIo6QN1SyiAHRPBOl6g3Sy0KKdSN8Jmyn++oXhVRD8aIe75/V8ZkS81T+BPQ==", "optional": true, "dependencies": { - "@substrate/connect-extension-protocol": "^1.0.1", - "smoldot": "2.0.7" + "@substrate/connect-extension-protocol": "^2.0.0", + "@substrate/connect-known-chains": "^1.1.1", + "@substrate/light-client-extension-helpers": "^0.0.4", + "smoldot": "2.0.22" } }, "node_modules/@substrate/connect-extension-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz", - "integrity": "sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.0.0.tgz", + "integrity": "sha512-nKu8pDrE3LNCEgJjZe1iGXzaD6OSIDD4Xzz/yo4KO9mQ6LBvf49BVrt4qxBFGL6++NneLiWUZGoh+VSd4PyVIg==", + "optional": true + }, + "node_modules/@substrate/connect-known-chains": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.1.4.tgz", + "integrity": "sha512-iT+BdKqvKl/uBLd8BAJysFM1BaMZXRkaXBP2B7V7ob/EyNs5h0EMhTVbO6MJxV/IEOg5OKsyl6FUqQK7pKnqyw==", "optional": true }, + "node_modules/@substrate/light-client-extension-helpers": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-0.0.4.tgz", + "integrity": "sha512-vfKcigzL0SpiK+u9sX6dq2lQSDtuFLOxIJx2CKPouPEHIs8C+fpsufn52r19GQn+qDhU8POMPHOVoqLktj8UEA==", + "optional": true, + "dependencies": { + "@polkadot-api/client": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/json-rpc-provider": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/json-rpc-provider-proxy": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/substrate-client": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@substrate/connect-extension-protocol": "^2.0.0", + "@substrate/connect-known-chains": "^1.1.1", + "rxjs": "^7.8.1" + }, + "peerDependencies": { + "smoldot": "2.x" + } + }, "node_modules/@substrate/ss58-registry": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.45.0.tgz", - "integrity": "sha512-NHmOkILimbLRPKvpnR+JGVckc1q4AJjxz9FnzZ3dKAVBL17AKknDy2FxXcwlJbmOXl9u7W3FS3bLDHgfKi4tQw==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.47.0.tgz", + "integrity": "sha512-6kuIJedRcisUJS2pgksEH2jZf3hfSIVzqtFzs/AyjTW3ETbMg5q1Bb7VWa0WYaT6dTrEXp/6UoXM5B9pSIUmcw==" }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", @@ -3331,9 +4497,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", @@ -3423,9 +4589,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3457,9 +4623,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3471,6 +4637,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3500,12 +4667,14 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -3514,14 +4683,15 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3533,22 +4703,15 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/luxon": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz", - "integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==" }, "node_modules/@types/methods": { "version": "1.1.4", @@ -3561,6 +4724,11 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, "node_modules/@types/multer": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", @@ -3570,9 +4738,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -3581,34 +4749,30 @@ "version": "0.4.32", "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.32.tgz", "integrity": "sha512-xf/JsSlnXQ+mzvc0IpXemcrO4BrCfpgNpMco+GLcXkFk01k/gW9lGJu+Vof0ZSvHK6DsHJDPSbjFPs36QkWXqw==", - "optional": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, "node_modules/@types/q": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", - "optional": true + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true, - "peer": true - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -3619,19 +4783,20 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true }, "node_modules/@types/strip-bom": { "version": "3.0.0", @@ -3646,9 +4811,9 @@ "dev": true }, "node_modules/@types/superagent": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.1.tgz", - "integrity": "sha512-YQyEXA4PgCl7EVOoSAS3o0fyPFU6erv5mMixztQYe1bqbWmmn8c+IrqoxjQeZe4MgwXikgcaZPiI/DsbmOVlzA==", + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.7.tgz", + "integrity": "sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==", "dev": true, "dependencies": { "@types/cookiejar": "^2.1.5", @@ -3657,19 +4822,19 @@ } }, "node_modules/@types/supertest": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.16.tgz", - "integrity": "sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", + "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", "dev": true, "dependencies": { - "@types/superagent": "*" + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" } }, "node_modules/@types/thrift": { "version": "0.10.17", "resolved": "https://registry.npmjs.org/@types/thrift/-/thrift-0.10.17.tgz", "integrity": "sha512-bDX6d5a5ZDWC81tgDv224n/3PKNYfIQJTPHzlbk4vBWJrYXF6Tg1ncaVmP/c3JbGN2AK9p7zmHorJC2D6oejGQ==", - "optional": true, "dependencies": { "@types/node": "*", "@types/node-int64": "*", @@ -3682,183 +4847,52 @@ "integrity": "sha512-ttK/moi86ZT9UE6yRnLGKZBBEvoHiSD2tK46nR+7/7Vt5Mp/22AaB7Eng0dRFFs6Ieur0Cj8oBwuX4OxC1Zr7g==", "dev": true }, - "node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" - }, "node_modules/@types/validator": { - "version": "13.11.8", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.8.tgz", - "integrity": "sha512-c/hzNDBh7eRF+KbCf+OoZxKbnkpaK/cKp9iLQWqB7muXtM+MtL9SUUH8vCFcLn6dH1Qm05jiexK0ofWY7TfOhQ==" + "version": "13.11.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", + "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", - "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/type-utils": "6.18.1", - "@typescript-eslint/utils": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz", - "integrity": "sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/typescript-estree": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", - "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", - "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", - "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", + "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.18.1", - "@typescript-eslint/utils": "6.18.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/type-utils": "7.9.0", + "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -3866,175 +4900,154 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", - "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", + "node_modules/@typescript-eslint/parser": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", + "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.56.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@typescript-eslint/types": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", - "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", + "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" + }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", + "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/utils": "7.9.0", "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.56.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" + "ms": "2.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", - "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/typescript-estree": "6.18.1", - "semver": "^7.5.4" - }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", - "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", + "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -4046,22 +5059,37 @@ } } }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4072,17 +5100,45 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", + "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", - "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.1", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -4096,9 +5152,9 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4115,9 +5171,9 @@ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", @@ -4135,14 +5191,14 @@ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -4167,26 +5223,26 @@ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -4194,22 +5250,22 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -4218,11 +5274,11 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -4370,12 +5426,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "peer": true - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -4399,15 +5449,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/app-root-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", - "peer": true, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -4423,43 +5464,11 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", @@ -4474,80 +5483,12 @@ "node": ">=8" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, "node_modules/asap": { @@ -4564,32 +5505,19 @@ "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "optional": true + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -4619,6 +5547,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -4634,6 +5563,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -4649,6 +5579,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -4672,6 +5603,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -4728,37 +5660,50 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/blakejs": { @@ -4794,18 +5739,10 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -4827,25 +5764,28 @@ "node": ">=8" } }, + "node_modules/brotli-wasm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-2.0.1.tgz", + "integrity": "sha512-+3USgYsC7bzb5yU0/p2HnnynZl0ak0E6uoIm4UW4Aby/8s8HFCq6NCfrrf1E9c3O8OCSzq3oYO1tUVqIi61Nww==" + }, "node_modules/browser-or-node": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz", - "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==", - "optional": true + "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==" }, "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "optional": true, "dependencies": { "pako": "~1.0.5" } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -4861,8 +5801,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -4889,6 +5829,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, "dependencies": { "node-int64": "^0.4.0" } @@ -4897,7 +5838,6 @@ "version": "4.6.3", "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.3.tgz", "integrity": "sha512-rAqP5hcUVJhXP2MCSNVsf0oM2OGU1So6A9pVRDYayvJ5+hygXHQApf87wd5NlhPM1J9RJnbqxIG/f8QTzRoQ4A==", - "optional": true, "dependencies": { "buffer": "^5.6.0" }, @@ -4933,67 +5873,20 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/bullmq": { - "version": "3.15.8", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-3.15.8.tgz", - "integrity": "sha512-k3uimHGhl5svqD7SEak+iI6c5DxeLOaOXzCufI9Ic0ST3nJr69v71TGR4cXCTXdgCff3tLec5HgoBnfyWjgn5A==", + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.7.8.tgz", + "integrity": "sha512-F/Haeu6AVHkFrfeaU/kLOjhfrH6x3CaKAZlQQ+76fa8l3kfI9oaUHeFMW+1mYVz0NtYPF7PNTWFq4ylAHYcCgA==", "dependencies": { "cron-parser": "^4.6.0", - "glob": "^8.0.3", - "ioredis": "^5.3.2", - "lodash": "^4.17.21", - "msgpackr": "^1.6.2", - "semver": "^7.3.7", + "ioredis": "^5.4.1", + "msgpackr": "^1.10.1", + "node-abort-controller": "^3.1.1", + "semver": "^7.5.4", "tslib": "^2.0.0", "uuid": "^9.0.0" } }, - "node_modules/bullmq/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/bullmq/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/bullmq/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -5041,13 +5934,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5069,10 +5967,34 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "version": "1.0.30001618", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", + "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", "funding": [ { "type": "opencollective", @@ -5118,15 +6040,9 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5139,6 +6055,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -5155,6 +6074,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -5165,10 +6085,34 @@ "node": ">=8" } }, + "node_modules/cids": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz", + "integrity": "sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, "node_modules/class-transformer": { @@ -5197,82 +6141,6 @@ "node": ">=8" } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -5310,6 +6178,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -5323,6 +6192,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5445,11 +6315,32 @@ "typedarray": "^0.0.6" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, "node_modules/consola": { "version": "2.15.3", @@ -5478,12 +6369,13 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -5568,12 +6460,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cron": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.3.tgz", - "integrity": "sha512-YBvExkQYF7w0PxyeFLRyr817YVDhGxaCi5/uRRMqa4aWD3IFKRd+uNbpW1VWMdqQy8PZ7CElc+accXJcauPKzQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.7.tgz", + "integrity": "sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==", "dependencies": { - "@types/luxon": "~3.3.0", - "luxon": "~3.3.0" + "@types/luxon": "~3.4.0", + "luxon": "~3.4.0" } }, "node_modules/cron-parser": { @@ -5591,7 +6483,6 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "optional": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -5617,26 +6508,43 @@ "node": ">= 12" } }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "peer": true - }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "ms": "2.1.2" + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=0.10.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/decompress-response": { @@ -5667,9 +6575,9 @@ } }, "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -5720,31 +6628,17 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5817,6 +6711,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -5846,14 +6741,14 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -5884,9 +6779,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -5898,9 +6793,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.630", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.630.tgz", - "integrity": "sha512-osHqhtjojpCsACVnuD11xO5g9xaCyw7Qqn/C2KParkMv42i8jrJJgx3g7mkHfpxwhy9MnOJr8+pKOdZ7qzgizg==" + "version": "1.4.767", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.767.tgz", + "integrity": "sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw==" }, "node_modules/emittery": { "version": "0.13.1", @@ -5928,9 +6823,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5945,6 +6840,11 @@ "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", "dev": true }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5953,108 +6853,34 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "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.12", - "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.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "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.13" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "engines": { "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/es-module-lexer": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -6070,415 +6896,92 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", - "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-import/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-nestjs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-nestjs/-/eslint-plugin-nestjs-1.2.3.tgz", - "integrity": "sha512-CYS2l+oO9sZ8QN1B0/Xgz+2CERfiWCiHDmDslX30yrJrNlBNKFypeCac/7g/NE+LDuox5MH13uvd4qd52Tlt5w==", + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { - "tslib": "^1.8.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "npm": ">=3" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-nestjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "node_modules/eslint-plugin-jest": { + "version": "28.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz", + "integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" }, "peerDependenciesMeta": { - "@types/eslint": { + "@typescript-eslint/eslint-plugin": { "optional": true }, - "eslint-config-prettier": { + "jest": { "optional": true } } }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -6495,33 +6998,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -6550,6 +7026,23 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6568,6 +7061,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -6705,6 +7204,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -6717,16 +7217,16 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6757,61 +7257,11 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -6830,12 +7280,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -6868,10 +7312,31 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6881,6 +7346,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, "dependencies": { "bser": "2.1.1" } @@ -7016,19 +7482,6 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -7095,15 +7548,15 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -7119,15 +7572,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -7204,15 +7648,14 @@ } }, "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", "dev": true, "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" + "once": "^1.4.0" }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" @@ -7248,9 +7691,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -7278,37 +7721,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -7317,20 +7734,25 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7339,6 +7761,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, "engines": { "node": ">=8.0.0" } @@ -7364,34 +7787,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -7438,9 +7833,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7466,21 +7861,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -7548,43 +7928,33 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, + "node_modules/hamt-sharding": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-2.0.1.tgz", + "integrity": "sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "sparse-array": "^1.3.1", + "uint8arrays": "^3.0.0" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=10.0.0", + "npm": ">=6.0.0" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/hamt-sharding/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" } }, "node_modules/has-flag": { @@ -7604,20 +7974,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -7636,25 +8006,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -7662,55 +8017,41 @@ "node": ">= 0.4" } }, - "node_modules/haxec": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/haxec/-/haxec-2.0.1.tgz", - "integrity": "sha512-2DaSqGZIzgVkZ4YFHbk9Su0Q6gm7YbzNX9njOHK/D/XklOdvgTemsPmjcyExlLdkl7lRlNIW0Wxo6niVfpWedw==", + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "spawn-wrap": "^2.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/haxec/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/haxec/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "peer": true, - "engines": { - "node": "*" - } + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -7792,9 +8133,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -7838,10 +8179,19 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -7890,21 +8240,17 @@ "node_modules/int53": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/int53/-/int53-0.2.4.tgz", - "integrity": "sha512-a5jlKftS7HUOhkUyYD7j2sJ/ZnvWiNlZS1ldR+g1ifQ+/UuZXIE+YTc/lK1qGj/GwAU5F8Z0e1eVq2t1J5Ob2g==", - "optional": true + "integrity": "sha512-a5jlKftS7HUOhkUyYD7j2sJ/ZnvWiNlZS1ldR+g1ifQ+/UuZXIE+YTc/lK1qGj/GwAU5F8Z0e1eVq2t1J5Ob2g==" }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, + "node_modules/interface-ipld-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/interface-ipld-format/-/interface-ipld-format-1.0.1.tgz", + "integrity": "sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" + "cids": "^1.1.6", + "multicodec": "^3.0.1", + "multihashes": "^4.0.2" } }, "node_modules/interpret": { @@ -7916,9 +8262,9 @@ } }, "node_modules/ioredis": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", - "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", + "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -7958,6 +8304,27 @@ "ioredis": "^5" } }, + "node_modules/ioredis/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ioredis/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -7966,74 +8333,89 @@ "node": ">= 0.10" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, + "node_modules/ipfs-only-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ipfs-only-hash/-/ipfs-only-hash-4.0.0.tgz", + "integrity": "sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "ipfs-unixfs-importer": "^7.0.1", + "meow": "^9.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "ipfs-only-hash": "cli.js" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, + "node_modules/ipfs-unixfs": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz", + "integrity": "sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw==", "dependencies": { - "has-bigints": "^1.0.1" + "err-code": "^3.0.1", + "protobufjs": "^6.10.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/ipfs-unixfs-importer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz", + "integrity": "sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ==", "dependencies": { - "binary-extensions": "^2.0.0" + "bl": "^5.0.0", + "cids": "^1.1.5", + "err-code": "^3.0.1", + "hamt-sharding": "^2.0.0", + "ipfs-unixfs": "^4.0.3", + "ipld-dag-pb": "^0.22.2", + "it-all": "^1.0.5", + "it-batch": "^1.0.8", + "it-first": "^1.0.6", + "it-parallel-batch": "^1.0.9", + "merge-options": "^3.0.4", + "multihashing-async": "^2.1.0", + "rabin-wasm": "^0.1.4", + "uint8arrays": "^2.1.2" }, "engines": { - "node": ">=8" + "node": ">=14.0.0", + "npm": ">=7.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, + "node_modules/ipld-dag-pb": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.22.3.tgz", + "integrity": "sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg==", + "deprecated": "This module has been superseded by @ipld/dag-pb and multiformats", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "cids": "^1.0.0", + "interface-ipld-format": "^1.0.0", + "multicodec": "^3.0.1", + "multihashing-async": "^2.0.0", + "protobufjs": "^6.10.2", + "stable": "^0.1.8", + "uint8arrays": "^2.0.5" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0", + "npm": ">=3.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, "node_modules/is-core-module": { @@ -8047,21 +8429,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -8106,18 +8473,6 @@ "node": ">=8" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8126,21 +8481,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -8150,32 +8490,12 @@ "node": ">=8" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/is-stream": { @@ -8190,51 +8510,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -8246,27 +8521,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -8281,7 +8535,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "optional": true, "peerDependencies": { "ws": "*" } @@ -8290,19 +8543,20 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -8335,9 +8589,32 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8348,9 +8625,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -8360,6 +8637,29 @@ "node": ">=8" } }, + "node_modules/it-all": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", + "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" + }, + "node_modules/it-batch": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-1.0.9.tgz", + "integrity": "sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==" + }, + "node_modules/it-first": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz", + "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==" + }, + "node_modules/it-parallel-batch": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-1.0.11.tgz", + "integrity": "sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==", + "dependencies": { + "it-batch": "^1.0.9" + } + }, "node_modules/iterare": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", @@ -8386,9 +8686,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -8575,6 +8875,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -8634,6 +8935,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -8642,6 +8944,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -8679,6 +8982,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -8693,6 +8997,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -8712,6 +9017,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -8742,6 +9048,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -8887,6 +9194,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -8917,6 +9225,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -8933,6 +9242,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -8992,6 +9302,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -9006,6 +9317,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9017,17 +9329,22 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", + "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9048,6 +9365,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -9123,6 +9441,14 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9155,9 +9481,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.53", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.53.tgz", - "integrity": "sha512-sDTnnqlWK4vH4AlDQuswz3n4Hx7bIQWTpIcScJX+Sp7St3LXHmfiax/ZFfyYxHmkdCvydOLSuvtAO/XpXiSySw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.1.tgz", + "integrity": "sha512-Wze1LPwcnzvcKGcRHFGFECTaLzxOtujwpf924difr5zniyYv1C2PiW0419qDR7m8lKDxsImu5mwxFuXhXpjmvw==" }, "node_modules/license-report": { "version": "6.5.0", @@ -9182,6 +9508,29 @@ "node": ">=16" } }, + "node_modules/license-report/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/license-report/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -9255,8 +9604,7 @@ "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "optional": true + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/lower-case": { "version": "2.0.2", @@ -9283,14 +9631,15 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } @@ -9330,10 +9679,22 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, "dependencies": { "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9353,11 +9714,66 @@ "node": ">= 4.0.0" } }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9384,6 +9800,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -9396,6 +9813,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -9453,6 +9871,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9472,10 +9898,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9500,14 +9947,14 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/msgpackr": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.1.tgz", - "integrity": "sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", + "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", "optionalDependencies": { "msgpackr-extract": "^3.0.2" } @@ -9550,31 +9997,112 @@ "node": ">= 6.0.0" } }, + "node_modules/multibase": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", + "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "@multiformats/base-x": "^4.0.1" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multicodec": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz", + "integrity": "sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + } + }, + "node_modules/multicodec/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, "node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" }, + "node_modules/multihashes": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", + "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", + "dependencies": { + "multibase": "^4.0.1", + "uint8arrays": "^3.0.0", + "varint": "^5.0.2" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multihashes/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/multihashes/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/multihashing-async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.4.tgz", + "integrity": "sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg==", + "dependencies": { + "blakejs": "^1.1.0", + "err-code": "^3.0.0", + "js-sha3": "^0.8.0", + "multihashes": "^4.0.1", + "murmurhash3js-revisited": "^3.0.0", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multihashing-async/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "peer": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/negotiator": { "version": "0.6.3", @@ -9600,9 +10128,9 @@ } }, "node_modules/nock": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.4.0.tgz", - "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.4.tgz", + "integrity": "sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", @@ -9612,6 +10140,27 @@ "node": ">= 10.13" } }, + "node_modules/nock/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nock/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -9683,6 +10232,20 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9692,9 +10255,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "engines": { "node": ">=14.16" @@ -9706,114 +10269,27 @@ "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9852,17 +10328,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -9890,6 +10366,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -9948,8 +10434,7 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "optional": true + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/parent-module": { "version": "1.0.1", @@ -9979,27 +10464,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "peer": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "peer": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "peer": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10038,24 +10502,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -10074,9 +10538,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "3.0.1", @@ -10093,6 +10557,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { "node": ">= 6" } @@ -10179,9 +10644,9 @@ } }, "node_modules/prettier": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.1.tgz", - "integrity": "sha512-qSUWshj1IobVbKc226Gw2pync27t0Kf0EdufZa9j7uBSJay1CC+B3K5lAAZoqgX3ASiKuWsk6OmzKRetXNObWg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10193,22 +10658,11 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10222,6 +10676,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -10255,6 +10710,31 @@ "node": ">= 8" } }, + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -10281,9 +10761,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -10300,7 +10780,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "optional": true, "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -10352,6 +10831,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rabin-wasm": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", + "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "dependencies": { + "@assemblyscript/loader": "^0.9.4", + "bl": "^5.0.0", + "debug": "^4.3.1", + "minimist": "^1.2.5", + "node-fetch": "^2.6.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "rabin-wasm": "cli/bin.js" + } + }, + "node_modules/rabin-wasm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/rabin-wasm/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10407,28 +10923,141 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/readdirp": { "version": "3.6.0", @@ -10472,6 +11101,18 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -10500,40 +11141,11 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "peer": true }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -10546,6 +11158,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10609,15 +11222,6 @@ "node": ">=4" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -10759,42 +11363,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -10815,28 +11395,17 @@ } ] }, - "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/scale-ts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/scale-ts/-/scale-ts-1.6.0.tgz", + "integrity": "sha512-Ja5VCjNZR8TGKhUumy9clVVxcDpM+YFjAnkMuwQy68Hixio3VRRvWdE3g8T/yC+HXA0ZDQl2TGyUmtmbcVl40Q==", + "optional": true + }, "node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -10883,12 +11452,9 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -10896,22 +11462,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -10935,19 +11485,6 @@ "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10987,28 +11524,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -11019,19 +11544,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11087,13 +11599,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11120,14 +11636,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/smoldot": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.7.tgz", - "integrity": "sha512-VAOBqEen6vises36/zgrmAT1GWk2qE3X8AGnO7lmQFdskbKx8EovnwS22rtPAG+Y1Rk23/S22kDJUdPANyPkBA==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.22.tgz", + "integrity": "sha512-B50vRgTY6v3baYH6uCgL15tfaag5tcS2o/P5q1OiXcKGv1axZDfz2dzzMuIkVpyMR2ug11F6EAtQlmYBQd292g==", "optional": true, "dependencies": { "ws": "^8.8.1" @@ -11136,8 +11653,7 @@ "node_modules/snappyjs": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", - "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==", - "optional": true + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==" }, "node_modules/source-map": { "version": "0.7.4", @@ -11164,100 +11680,38 @@ "node": ">=0.10.0" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" }, - "node_modules/spawn-wrap/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/spawn-wrap/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" }, "node_modules/split-text-to-chunks": { "version": "1.0.0", @@ -11278,10 +11732,17 @@ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -11293,6 +11754,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "engines": { "node": ">=8" } @@ -11319,18 +11781,13 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -11371,51 +11828,6 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -11457,6 +11869,17 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -11469,10 +11892,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/superagent": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", - "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -11480,14 +11908,30 @@ "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", - "formidable": "^2.1.2", + "formidable": "^3.5.1", "methods": "^1.1.2", "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=6.4.0 <13 || >=14" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/superagent/node_modules/mime": { @@ -11502,17 +11946,23 @@ "node": ">=4.0.0" } }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/supertest": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", - "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^8.0.5" + "superagent": "^9.0.1" }, "engines": { - "node": ">=6.4.0" + "node": ">=14.18.0" } }, "node_modules/supports-color": { @@ -11538,9 +11988,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.10.3", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.3.tgz", - "integrity": "sha512-fu3aozjxFWsmcO1vyt1q1Ji2kN7KlTd1vHy27E9WgPyXo9nrEzhQPqgxaAjbMsOmb8XFKNGo4Sa3Q+84Fh+pFw==" + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.11.2.tgz", + "integrity": "sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==" }, "node_modules/symbol-observable": { "version": "4.0.0", @@ -11550,32 +12000,10 @@ "node": ">=0.10" } }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/synckit/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/tablemark": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-3.0.0.tgz", - "integrity": "sha512-7N05gRK7t6B4g8AtedUsKoKtPjplmUjOPr/V4kVB+7U3yGiB3WvKqMTTQzVCZyhfZUXgQFp9YyN9ZgC52uCPKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-3.1.0.tgz", + "integrity": "sha512-IwO6f0SEzp1Z+zqz/7ANUmeEac4gaNlknWyj/S9aSg11wZmWYnLeyI/xXvEOU88BYUIf8y30y0wxB58xIKrVlQ==", "dev": true, "dependencies": { "sentence-case": "^3.0.4", @@ -11594,9 +12022,9 @@ } }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -11679,6 +12107,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -11692,6 +12121,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11709,36 +12139,14 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "peer": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "peer": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/thrift": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/thrift/-/thrift-0.16.0.tgz", "integrity": "sha512-W8DpGyTPlIaK3f+e1XOCLxefaUWXtrOXAaVIDbfYhmVyriYeAKgsBVFNJUV1F9SQ2SPt2sG44AZQxSGwGj/3VA==", - "optional": true, "dependencies": { "browser-or-node": "^1.2.1", "isomorphic-ws": "^4.0.1", @@ -11754,7 +12162,6 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "optional": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -11783,12 +12190,14 @@ "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } @@ -11817,21 +12226,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/trace-unhandled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/trace-unhandled/-/trace-unhandled-2.0.1.tgz", - "integrity": "sha512-wOZbhBiNyuZTs0b/ADZFTiTDVVDsvKQj/RkVJTKefH6u9CowGDSR+H/3miaGUrYCCuzS0nVmIzpbIIm6lRF8gg==", - "dev": true, - "dependencies": { - "haxec": "^2.0.1" - }, - "bin": { - "trace-unhandled": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -11840,22 +12234,30 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" } }, "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -11871,7 +12273,7 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", @@ -12100,30 +12502,9 @@ } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", @@ -12141,6 +12522,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, "engines": { "node": ">=4" } @@ -12169,231 +12551,15 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, - "node_modules/typeorm": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.19.tgz", - "integrity": "sha512-OGelrY5qEoAU80mR1iyvmUHiKCPUydL6xp6bebXzS7jyv/X70Gp/jBWRAfF4qGOfy2A7orMiGRfwsBUNbEL65g==", - "peer": true, - "dependencies": { - "@sqltools/formatter": "^1.2.5", - "app-root-path": "^3.1.0", - "buffer": "^6.0.3", - "chalk": "^4.1.2", - "cli-highlight": "^2.1.11", - "dayjs": "^1.11.9", - "debug": "^4.3.4", - "dotenv": "^16.0.3", - "glob": "^10.3.10", - "mkdirp": "^2.1.3", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.5.0", - "uuid": "^9.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "typeorm": "cli.js", - "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", - "typeorm-ts-node-esm": "cli-ts-node-esm.js" - }, - "engines": { - "node": ">= 12.9.0" - }, - "funding": { - "url": "https://opencollective.com/typeorm" - }, - "peerDependencies": { - "@google-cloud/spanner": "^5.18.0", - "@sap/hana-client": "^2.12.25", - "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", - "hdb-pool": "^0.1.6", - "ioredis": "^5.0.4", - "mongodb": "^5.8.0", - "mssql": "^9.1.1 || ^10.0.1", - "mysql2": "^2.2.5 || ^3.0.1", - "oracledb": "^6.3.0", - "pg": "^8.5.1", - "pg-native": "^3.0.0", - "pg-query-stream": "^4.0.0", - "redis": "^3.1.1 || ^4.0.0", - "sql.js": "^1.4.0", - "sqlite3": "^5.0.3", - "ts-node": "^10.7.0", - "typeorm-aurora-data-api-driver": "^2.0.0" - }, - "peerDependenciesMeta": { - "@google-cloud/spanner": { - "optional": true - }, - "@sap/hana-client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "hdb-pool": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "pg-query-stream": { - "optional": true - }, - "redis": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "ts-node": { - "optional": true - }, - "typeorm-aurora-data-api-driver": { - "optional": true - } - } - }, - "node_modules/typeorm/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/typeorm/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "peer": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "peer": true - }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12402,17 +12568,30 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "node_modules/typescript-eslint": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.9.0.tgz", + "integrity": "sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow==", "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.9.0", + "@typescript-eslint/parser": "7.9.0", + "@typescript-eslint/utils": "7.9.0" }, "engines": { - "node": ">=0.8.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/uid": { @@ -12426,19 +12605,12 @@ "node": ">=8" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, + "node_modules/uint8arrays": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", + "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "multiformats": "^9.4.2" } }, "node_modules/undici-types": { @@ -12463,9 +12635,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -12481,8 +12653,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -12522,9 +12694,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -12548,10 +12724,19 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } @@ -12559,8 +12744,7 @@ "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "optional": true + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" }, "node_modules/vary": { "version": "1.1.2", @@ -12580,20 +12764,15 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, "dependencies": { "makeerror": "1.0.12" } }, - "node_modules/wasm-brotli": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/wasm-brotli/-/wasm-brotli-2.0.2.tgz", - "integrity": "sha512-DgjRlpZz9z5br4TjQHSlDHRF9NIuGXHUj3AqO08koDCXz7EYzmPDb7T/6oar5UKLYgPp9Yxc2ImGpx4BMFwbNQ==", - "optional": true - }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12611,9 +12790,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "engines": { "node": ">= 8" } @@ -12624,33 +12803,34 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.16.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -12689,6 +12869,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12701,6 +12882,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "peer": true, "engines": { "node": ">=4.0" } @@ -12728,47 +12910,15 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -12808,6 +12958,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -12819,12 +12970,13 @@ "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -12852,13 +13004,13 @@ "node_modules/xxhash-wasm": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", - "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", - "optional": true + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "engines": { "node": ">=10" } @@ -12866,12 +13018,14 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", diff --git a/package.json b/package.json index 0f26ff00..56ec9f11 100644 --- a/package.json +++ b/package.json @@ -41,81 +41,66 @@ }, "homepage": "https://github.com/AmplicaLabs/graph-service-service#readme", "dependencies": { - "@bull-board/api": "^5.8.3", - "@bull-board/express": "^5.8.3", - "@bull-board/nestjs": "^5.8.3", - "@bull-board/ui": "^5.8.3", - "@dsnp/frequency-schemas": "^1.0.2", - "@dsnp/graph-sdk": "^1.1.1", - "@frequency-chain/api-augment": "1.7.0", - "@jest/globals": "^29.5.0", - "@liaoliaots/nestjs-redis": "^9.0.5", + "@bull-board/api": "^5.17.1", + "@bull-board/express": "^5.17.1", + "@bull-board/nestjs": "^5.17.1", + "@bull-board/ui": "^5.17.1", + "@dsnp/frequency-schemas": "^1.1.0", + "@dsnp/graph-sdk": "^1.1.2", + "@dsnp/parquetjs": "^1.6.2", + "@frequency-chain/api-augment": "1.11.1", "@multiformats/blake2": "^1.0.13", - "@nestjs/axios": "^2.0.0", - "@nestjs/bullmq": "^10.0.0", - "@nestjs/cli": "^10.1.14", - "@nestjs/common": "^9.4.0", - "@nestjs/config": "^2.3.1", - "@nestjs/core": "^9.4.0", - "@nestjs/event-emitter": "^1.4.1", - "@nestjs/platform-express": "^9.4.0", - "@nestjs/schedule": "^3.0.3", - "@nestjs/swagger": "^7.1.8", - "@nestjs/testing": "^9.4.0", - "@nestjs/typeorm": "^9.0.1", - "@polkadot/api": "^10.9.1", - "@polkadot/api-base": "^10.9.1", - "@polkadot/keyring": "^12.3.2", - "@polkadot/types": "^10.9.1", - "@polkadot/util": "^12.3.2", - "@polkadot/util-crypto": "^12.3.2", + "@nestjs/bullmq": "^10.1.1", + "@nestjs/cli": "^10.3.2", + "@nestjs/common": "^10.3.8", + "@nestjs/config": "^3.2.2", + "@nestjs/core": "^10.3.8", + "@nestjs/event-emitter": "^2.0.4", + "@nestjs/platform-express": "^10.3.8", + "@nestjs/schedule": "^4.0.2", + "@nestjs/swagger": "^7.3.1", + "@polkadot/api": "^10.12.4", + "@polkadot/api-base": "^10.12.4", + "@polkadot/types": "^10.12.4", + "@polkadot/util": "^12.6.2", + "@songkeys/nestjs-redis": "^10.0.0", "@types/multer": "^1.4.7", - "@types/uuid": "^9.0.2", - "axios": "^1.3.6", - "bullmq": "^3.0.0", + "axios": "^1.6.8", + "bullmq": "^5.7.8", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "ioredis": "^5.3.2", - "joi": "^17.9.1", + "class-validator": "^0.14.1", + "form-data": "^4.0.0", + "ioredis": "^5.4.1", + "ipfs-only-hash": "^4.0.0", + "joi": "^17.13.1", "mime-types": "^2.1.35", "multiformats": "9.9.0", "rxjs": "^7.8.1", "time-constants": "^1.0.3" }, "devDependencies": { - "@polkadot/typegen": "10.9.1", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", - "@types/node": "^20.3.1", - "@types/supertest": "^2.0.12", - "@types/time-constants": "^1.0.0", - "@typescript-eslint/parser": "^6.18.1", - "@typescript-eslint/typescript-estree": "5.59.8", - "dotenv": "^16.3.1", - "eslint": "^8.42.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^8.8.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-nestjs": "^1.2.3", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "ioredis-mock": "^8.8.3", - "jest": "^29.5.0", - "license-report": "^6.4.0", - "nock": "^13.3.8", - "prettier": "^3.0.2", - "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "trace-unhandled": "^2.0.1", - "ts-jest": "^29.1.0", - "ts-loader": "^9.4.3", - "ts-node": "^10.9.1", + "@jest/globals": "^29.7.0", + "@nestjs/testing": "^10.3.8", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/node": "^20.12.10", + "@types/supertest": "^6.0.2", + "@types/time-constants": "^1.0.2", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "eslint-plugin-jest": "^28.5.0", + "ioredis-mock": "^8.9.0", + "jest": "^29.7.0", + "license-report": "^6.5.0", + "prettier": "^3.2.5", + "supertest": "^7.0.0", + "ts-jest": "^29.1.2", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.3" + "typescript": "^5.4.5", + "typescript-eslint": "^7.8.0" }, "jest": { "moduleFileExtensions": [ From 0b841b120cc1211535d36178740ecaf17008239f Mon Sep 17 00:00:00 2001 From: Wil Wade Date: Fri, 17 May 2024 12:29:27 -0400 Subject: [PATCH 37/53] Removes the use of ci-base-image for releases (#67) --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ec22d761..d67dbc68 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,6 @@ jobs: build-and-publish-container-image: name: Build and publish container image runs-on: ubuntu-latest - container: ghcr.io/libertydsnp/frequency/ci-base-image steps: - name: Validate Version Tag if: env.NEW_RELEASE_TAG_FROM_UI != '' From 6c7c96e8ff5f4f82eea362f1d536a81b14b4b329 Mon Sep 17 00:00:00 2001 From: "V. Claire Olmstead" <43625033+claireolmstead@users.noreply.github.com> Date: Thu, 13 Jun 2024 11:36:55 -0700 Subject: [PATCH 38/53] graph service readme updated using template (#80) closes #53 ## Changes - Updated readme using the gateway template and changed made in account-services readme. - Added new graph to /docs --------- Co-authored-by: Claire Olmstead --- .gitignore | 2 + README.md | 297 ++++++++++++++++++++++++----- docs/graph_service_arch.drawio | 1 + docs/graph_service_arch.drawio.png | Bin 0 -> 150765 bytes 4 files changed, 253 insertions(+), 47 deletions(-) create mode 100644 docs/graph_service_arch.drawio create mode 100644 docs/graph_service_arch.drawio.png diff --git a/.gitignore b/.gitignore index d53aa5f3..d608595d 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,5 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + +.idea/ \ No newline at end of file diff --git a/README.md b/README.md index 682ac9da..657531d1 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,285 @@ -# Graph-Service +# Graph Service -A service enabling easy interaction with DSNP private and public graphs on Frequency + -## Table of Contents +# 📗 Table of Contents -- [Graph-Service](#graph-service) - - [Table of Contents](#table-of-contents) - - [Prerequisites](#prerequisites) - - [Getting Started](#getting-started) - - [Running E2E tests](#running-e2e-tests) +- [📖 About the Project](#about-project) +- [🔍 Arch Map](#-arch-maps) +- [🛠 Built With](#-built-with) + - [Tech Stack](#tech-stack) + - [Key Features](#key-features) +- [🚀 Live OpenAPI Docs](#-live-docs) +- [💻 Getting Started](#-getting-started) + - [Prerequisites](#prerequisites) + - [Setup](#setup) + - [Install](#install) + - [Usage](#usage) + - [Run tests](#run-tests) + - [Deployment](#deployment) +- [🤝 Contributing](#-contributing) +- [⭐️ Show your support](#-support) +- [🙏 Acknowledgements](#-acknowledgements) +- [❓FAQ](#faq) +- [📝 License](#-license) -## Prerequisites + + +# 📖 `graph-service` + +The Graph Service is a service enabling easy interaction with DSNP private and public graphs on Frequency. + + + +## 🔭 Arch Maps + +The account-service is a NestJS application that is split into two main parts: the API and the Worker. + +The API is responsible for handling incoming HTTP requests and the Worker is responsible for processing jobs that require blockchain interaction. + +![Gateway Graph Service](./docs/graph_service_arch.drawio.png) + +

(back to top)

+ +## 🛠 Built With + +### Tech Stack + +
+ Framework + +
+ +
+ Language + +
+ +
+ Testing Libraries + +
+ +
+ Linting + +
+ +
+ Data Store + +
+ +
+ Request Library + +
+ +
+ Scheduling + +
+ +
+ Validation + +
+ +
+ Environment Configuration + +
+ +
+ Containerization + +
+ +
+ API Documentation + +
+ + + +### Key Features + +- **Fetch Graphs** +- **Update Graph** +- **Watch Graphs** + +

(back to top)

+ + + +## 🚀 Live Docs + +- [Live Docs](https://amplicalabs.github.io/graph-service) + +

(back to top)

+ + + +## 💻 Getting Started + +To get a local copy up and running, follow these steps. + +### Prerequisites + +In order to run this project you need: - [Docker](https://docs.docker.com/get-docker/) +- [Nodejs](https://nodejs.org) -## Getting Started +### Setup -Follow these steps to set up and run Content Watcher: +Clone this repository to your desired folder: -### 1. Clone the Repository -Clone the Graph Service repository to your local machine: - ```bash - git clone https://github.com/amplicalabls/graph-service.git - ``` +Example commands: + +```sh + git clone git@github.com:AmplicaLabs/graph-service.git + cd graph-service +``` + +### Install + +Install NPM Dependencies: + +```sh + npm install +``` + +### Environment Variables -### 2. Configure the app The application receives its configuration from the environment. Each method of launching the app has its own source for the environment. If you run a container image using Kubernetes, it is likely your environment injection will be configured in a Helm chart. For local Docker-based development, you may specifiy the environment or point to an environment file (the included [docker-compose.yaml](./docker-compose.yaml) relies on the included [.env.docker.dev](./.env.docker.dev) file). If running natively using the script included in `package.json`, the app will use a local `.env` file. Environment files are documented [here](./ENVIRONMENT.md), and a sample environment file is provided [here](./env.template). -### 3. Start the service: -Run the following command to start the service: - ```bash - docker compose up [-d] +1. Copy the template values into the .env files. + ```sh + cp env.template .env + cp env.template .env.dev + cp env.template .env.docker.dev ``` +2. Replace template values with values appropriate to your environment. + +### Usage + +Note: using [docker compose file](docker-compose.yaml) to start the services. This will start the services in development mode. + +#### 1. Start the Redis server container and the Frequency container. You can view the logs with your Docker setup. + + ```sh + docker compose up -d redis frequency + ``` + +#### 2. Once [Frequency](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer) is up. Run a graph setup with Alice as provider 1 and 2,3,4,5,6 as users. + + ```sh + make setup + ``` + +#### 3. Run the following command to start the graph service api and worker containers. This will start the account service api and worker in development mode. + + ```sh + docker compose up -d api worker + ``` + +#### 4. Check the job in [BullUI](http://0.0.0.0:3000/queues/), to monitor job progress based on defined tests. -This will start Frequency, Redis and Graph Service api/worker containers. +## 📋 Testing -### 4. Swagger UI +### Run the tests + + ```sh + make test-e2e + ``` + +This will run the tests in `apps/api/test` folder. + +#### Check e2e test file for more details on the test. + +### Swagger UI Check out the Swagger UI hosted on the app instance at [\/api/docs/swagger](http://localhost:3000/api/docs/swagger) to view the API documentation and submit requests to the service. -### 5. Queue Management +### Queue Management You may also view and manage the application's queue at [\/queues](http://localhost:3000/queues). -## Running E2E tests +### Linting -Note: using [docker compose file](docker-compose.yaml) to start the services. This will start the services in development mode. +```sh +npm run lint +``` -1. Start redis and frequency +### Auto-format - ```bash - docker compose up -d redis frequency - ``` +```sh +npm run format +``` - This will start Frequency and Redis + -2. Once [Frequency](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer) is up. Run a graph setup with Alice as provider 1 and 2,3,4,5,6 as users. +## 🤝 Contributing - ```bash - make setup - ``` +Contributions, issues, and feature requests are welcome! -3. Run the following command to start the graph service api and worker containers. +- [Contributing Guidelines](./CONTRIBUTING.md) +- [Open Issues](https://github.com/AmplicaLabs/graph-service/issues) - ```bash - docker compose up -d api worker - ``` +

(back to top)

- This will start the graph service api and worker in development mode. + -4. Check the job in [BullUI](http://0.0.0.0:3000/queues/), to monitor job progress based on defined tests. +## ⭐️ Show your support -5. Run the tests +If you would like to explore contributing bug fixes or enhancements, issues with the label `good-first-issue` can be a good place to start. - ```bash - make test-e2e - ``` +

(back to top)

+ + + +## ❓FAQ + +- **What is the difference between [Reconnection Service]() and `Graph Service`?** + + - The `Reconnection Service` is designed for providers who have users who are migrating to [DSNP](), whereas `Graph Service` is for users who are already on DSNP. + +

(back to top)

+ + + +## 📝 License - This will run the tests in `apps/api/test` folder. +This project is [Apache 2.0](./LICENSE) licensed. -6. Check e2e test file for more details on the test. +

(back to top)

\ No newline at end of file diff --git a/docs/graph_service_arch.drawio b/docs/graph_service_arch.drawio new file mode 100644 index 00000000..24247d29 --- /dev/null +++ b/docs/graph_service_arch.drawio @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/graph_service_arch.drawio.png b/docs/graph_service_arch.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..d4893ddf750260a4cde50a1645fc985d3ac31012 GIT binary patch literal 150765 zcmeEv2OyR0`+uaOB{C|76p?vsk-f6_9vvK;BO@b3sEk6iWE4rrDncbPlQJqPgp6p) z%yS)&B)Dd;f!{-!LmEqyII*dg3sWj1J=UE(gtHOdjU5WH!nLEKRb$B3nj?NBZ2$H z&CkKb%Wp7yJ=zN62)D+^!37#%Rz{oKIJ#n8tQmPE!RG^xt{8jpUvL=wR@DT*^uYg7 zT&5^KQvnw6r-YM}Jw_K}rfB2J$SupqBf!DK4-PXc%4;brF>*_RzwK@8FyKFO7;`%; zbc>X=Gu8ndkwtOwa&U3*p-|i$C@!e~nrKV3vkhK5&_RqV+G=({3UV?Y+Hzh}Ix^C> z?uv)BWfUz{X9wb9j<(0ZqnUo8>fW_&9RP-7;|{R;TF-(&RF+_msw)%;nBj^H~~3X z&^mNLbAHP4F4MKKa0Rjh$)_M6+&$=Od5n#fHS%N>7ktJ6ja&>LaIr>PVBKf$#~s2g zgEJNjZiN=a!9xmT4+$hPFSGZ_e&_65$DHTn{Kq$_=?kJXt@f+q=QjFgwRCuAYd{Ib+=%EpU2=0*d2qZR3j3bV7r*=aF^?(g2QGyE@o|Pta+! zvpKwmC?TAhK}+p~p6?^_K#a311`!hIk?<7AVSxI$I(ve<;Ir)9g75^w62yauhWq?_ z@FB;n@z#O|StK+p16Fg5gI>Y&3jTm6e)&aMcGke{(768Ctl6W@F!qvYb2}^CWJ_V~ zv5bVuawD_xgK6YPv~|HW3c>UL$EOiSs0Gu=j~lOr&0$7veyiD` zFFB;9tp%11?F6AIz%VCk7jQ8=PqNG03NBl46q-vs0mnF6NI*ydX58E!?c!o%zEGy; z6@Uwz09MN$Ss+Gk9t%E4}Pc`7Fc#X%;4b>;^5~In*W*YF*F_EFJP591bOFA!s9{Ocfq0z0CYk$%W!Se~l6r>jcRn5G7lTtE(rB`)D^;EI5Q`6D+ZguCizc z8+&M;e?sA0z}&koRdU>6S)kDHI3NYW=@;k> z^tV1Z4r}H2RqJo+^6W}1V;X104?G!M@gw#7shV>0&OYO(divM24NM~%vd@ULIzhSz z5O`i%9Xu9k3eQ3d&WD200BPb^HBMl0JBuvScQg#ADt}FTR86J%WVO{bxTGu=RJ)kt9RAf%bsN&zmMwfw$bf-{RBI=g)TQ#!Z20pwkzC_J+! z?t7MOv0g2_9H`H%&d=MOzotw-LNPq&PeSbgfE6iV6r8d4_P|eBtZeg^=occ9MP|d2 z5BlGnbR%X4cyRofZ)SC3_;)kO*rB^FUEsKGGc+o2wEA}aw?@Gr{?Kolu|FC^tVtv_pc=$O4_~!jx0eIyRSricB;1R$(EigMKMB;wc zIa|6L|mt$sfj;z)w(uqI}Rgo@0Wc>x9gL-hGG*o=Y|5dl&7SvIR0IL{dG&t&bx^G;XwkLpG7|02*@GJ`*$LrMgnGa}W$Z1edLHyH+10pv5%(qA_E%X3Eph~6!F&iBY8 zb{+v(pO(J?fZabpAEA~y7*c3^douvE06IY-1UHv9E=&V|z(os-HT<6s$rdL#mWuxm z@##<4VlF;@cy)eLkhvG9v;IMAyEKlMv&WjDL2<;ATreolvBqM-nlGOKUbN=_Lw1xO zv8#AEwk(5)*jof9{*D=4-esH>XFN9r!rXs2nK*CA5Ss;Aou8-9Ayxd1B;-#G@-J|Q zh`~g7%Gr+3M!Ell#f0@9-(pIrV?Esz91oj1cq$4Wc2ksA(6vFl=${(QzXl-Rk2RM! zJB!PF__${g{(EL;@%6ky3$FidtFyew!^ZsICG#BId{C{)97zJ4H$db6m?imb$^WI) z`6B=H@0Z0ab~BgS%w z(v36&w+e@0h-m+FP9Q>u;|Ze#RPl#jdc1%m0rj=GN@tMX2Y~>_9t-j_4gedS@ao=*^ISGSLJD#4WCOt+Yk*;R%o&o$a{x7sHjeDBP{|sU=;QiMo=+F+YzHxRbI}CU z-ao4jQuo+%uP(3shXs1&ZImUInxx4hp$kozadiXmeMnG9OM&;jUuF zeKxm7+c>g-6Si107Y@9K&OKs@hYjitptL1k3UN6y5DWM@OM6^Jt2IaBwrb4LOQ#RWSa{0Qlbx2$uf0DoB#hvj!xb=e3BUetN;=KdE@UcYIpe@b0h zB1`#wc|xcwz_a1fS%9w6$I)&=Lck7uKi>nL!E>{5g?O_v|C1uzWoIAB!s0Vp%ln7$ zI{nj;zaSF9!2&v$qCo`jJCXn22-ufpIN(wxJdDwFGdIV$xLCSDA-NX5_qhmY{sjT} z(uH1jRS}?E>^X9CEgu)dgvK1-F~3s~RE2SIEiAZ!-O}HTffuz2`-sRQ|B)DY*{Oja z^j`%xi-pqJktw^VZAb;M5-|A@=RM~G!-76sG+(ujW=A$a*f z!IuCECBVxgAi#}q8ZcY{${JLI&HuoCLgeZnX8T~F{;v|Qzqo4z00KX5y9%DYLaN5+ zOC6xx3$!9oT)dpY`V$g8pSI%QnJa75$C*&@c7Puf_{&ybd{;&AMSocpfmP|BmV6$5 zE|8p9BHVM9QV6^pVRjIRy#G04xxC85kHfQ;NK6iSSV#z~>IAVhI7<7l4H`g%tdfKr zav?C>_}9+%e~||L_tM&cxs=8I0D;68`XBK=%T6^6Ez8?)uy1~`ssFA?2eh^zC|ANk zH7q#@AN`vq9Tosj8bRM5F;j3Z-Q%(9U+M;N2uPu8>{>`vaL;yn{ee!O>qx z;8-A)vH!dP&Xwo>g96Blyp#rpJCqRnZIgD zVT<(pMw1s|I^osk766*SHM^a4c26q~W)QdQkF6zzZ$;ME>b` zlwV+p6UH~6aYi)dJ2B{AEoKB<&jNps2R5$XD`o`h{iExFFNIe^zobM5Ai{#Xxe@OY z8P%U-l9pXTc=I71@T-9rH~=Tn3cSJzN_Ho7ophDiTN_qV`83=Vd47-$I7Z^LF@fien0KTah7@hmyz$g9jO8;55S@7Xvip z;{S%%@z*TbTx9!w=6yb`#{+f{gHF%!q<`b(I=^V!W;OqBrT<{3=Rd`w@Noex0~sge z2dOuPoiY&Pa|rN&mrx=)XwBuL4%qL;^F?7={U0m3`X3{!=cws9GX~o&{53`DUhuiX#X-m4;gyzO)1_n~ zvZg9nSLmhi&P!B%Aq(`A?8FiW>3^+`4q2}MoF!e#6-t7QM0U7}cn~n+yexeg6f^`oFHN|Ndo#UHJbh+IJDJ`wRQCmxkBB z7}Cy@1RN;vo)SFX6%-)Nm;209!VBJFwk+>DADIgYB9yW|MDs$t4jie^xA(IOrtdm? z_$=*A??+wA%d8f2OPpvQvLwa}kZiSKVc~1~{PpH)}4~iZeS_SY`OY z7hFKj%=a=Ti?8SApH;bKRsD}C)zV1h0JJgQ5xh%wc6&UR2F3!~4hr_3Eve&zzEp#o z%MyG+6!;J9>CWxm`%yU-v^4*{RfTv-cf763^GBD8__9$TBn;r+cQyt5m7+qB9D%-( z3u+7&Hslp3zsZU5!+sLdDjzH^i1qj*q}cM4^KVX$fStRzOgIGV`Zza5NMP>3JoL?> z{#?T34`)agf&Slm9qliI{!+1pffOHbm)*64kYxX6#GQMyJS?s}aL#&J1YMGq0Cxl5 z7UUiHW`Bb(;KSFbzyA&t9&Qd^!TD^*B2DE6VugDSqEmm)jaq)KW}k)^&?0Y@<3~F< z0o(3q<^ug^8MyzCeKE>X$^9XwEFpxyhrvIn;)XWAERYX)6@L?Okqv>c1cR@fTOb>M z1aFrY3s~3xwchn2bo+$_@6wPK2`m@-smL2V=b?ImmkQxF&cQ_-`B{vg+sHD1+X94N zDrn0<g zQbM!*_+i-n*TNP8IpEd9bKx)qAag~D5Y|A2G&rwtdEns?nEk>-#K8pj&W74Jz?r*w z0sJh2%U`JMTplhL`>4wjc1tA?F%h_L69l6JSNss`@cqVRGvBc4{$Wh~KK3k6u?Zks zQec=vUU2-qK%GZuVZF+t>jALM_5k;^KL&G46A{{uF8|Sc9B2-uiWr(>a*i8gp*$>68KS>(@@}{KOZx@mV_0S7< zRYJw)|JGOYFY-q1wp4D;aYkOzEEgVsN z&+ym6^T;%p?TJ{if_}vTX$dV4laFz0Jf3M&SGHfh>nc$bv0vu+7Xre)G(^$tgbaca z`za*IRz((Rmpq_aMNOQjq|Xfw5J*@&Y)fa~;hIwYHFjO94GXWs)8T~fqPntOykFyw z)b_W=9Bqp|lC{x(w>aT~e;u7f8*hA~`h->>;l8NELCaG1jDdi&IKqWXmNaduJ7mOQ zI9xPx1xbXs3Q3>yzKAY)KcWTyO7w|8nvR53H?^!pV_HfCuIJt=P!=-|6mNaPQ{d~& ze$U(0ftlluyvEkmBoTfL;^@eA{)<}ZA^B+hszK}eN6nLWZw7TH)>s){BG52;ZfVj- z3GQ(qVrFZu3{N_+@X4`$e#D_N>7)KTXBaAE_B=eFenbM}T^STKs#)8ew|$j-zTc7i9Xln$x8uw0P>6D>q9jz+Di z7Ytl*v3yA(u>}(wXfkvAoy2?!YGYJ-STIp*=!zhjua5+h81XtyPmsUci4$ttkYkPV zD&<4!n(r?2fTmyV22Ecoc^S8;>2cy#RlTbPect1)eBmq{cMN2=l9CjV608mV9Azh~ zuweNe73o=Vz2?~Pgh=I(I#255T~O0duW7Pho?XZ3nFR_ zfO`FqCu#S>UNarcfF>{Fd@$3ol!EKQy!9ktDOkbENtVA z%ub;S8QtpLUGxM^d&JQVBQB4L7c70rClU)?XoRDROmzfmMvsRm>Y+!o5`(4*$?xK~ z3;q@q@Q=kcE!>;gu^%-3kii@@%>;DBwB{?iwLsGkd!m|%m^t3Mtrip`i71%{ zEq71gixT+T$&>Il)UL6wr?sefNN9{I*^b==`HY}l2hF;YgdI>1- zOD&W#cgBONX!R|!2@~7Tz9)6pjSUkHC)qyjwr_8~L2ccTXY3jkRl?mRAu^c@mKn^u z0Fai34QD>e?$pq8O|sz8BCi)D@GZMCK-92*Uiomd*8;76+)j4u6QB>Dx{t+2_}$%n zIlJ#OtKUEro;XDK(QE>TS06Z>w26i7j{425dr7Qg!9Az;ocz283jYaF=L-IO3KVc|^rK_i#HNfRWGZa8)3iP{12F6bT+3DYKuYsi(w}FqN-Q!i>kFarjims zQomK1$v90VOYw!o`GdzeR8pj(s{@@bXmD;lm8v_uZyFO->p{jc;c_7LK#HA6(cVW} z^&70f^i)9u-BKG{fdXCGcbvy+Cjt4xm=!@4H@4=iL3E^KKk-yyvP*WtgD$cQVSFO{ zr)f`AYdx`6;<)nc2+cj8fHQ8i@zle#_j63z2y$rKW)6wYTtU;C%rIdSI%K^_v3>mK5Q7780)ARXZ73_K7m0_M#YB z46NisMoy?CbiO;wSz5Da?0EiBe>-*Eud3YV%J1*h*4fSDkFzD{NV}4=Kt)`W?YXJQ zog9G}#|a-Dj)&)TyF$nFbF~kuSNrf3wM`!A8+j6T{OTFenN`^FRn$X6Pjp{aRf(+! z9p2PX-|!^DdtEh2q0R2iEVybc=bWw(CLN?Pg%SD4N|Yj*m)iq zUv0I&UdC(pp4RfbXNEH;?|ObF>l@*j-f-tYa4R;H@pqje7`3|Gx|-K3$;>Wh2jk{mGx_E>xPFnc(+(4so2u9hhjHgnD#`03!Q3f*L4|>W$q6@r>hO;-T^?-ea9DvVL4M*Umc!(k>jF#zr z_bmu}KYOnXs|e-$Pt-Byh8%oqDVL%*xeUay?%|i&dIsx2s&r@EyWzH7m+@ZN)l!6x z@}QG6Os|8au4VU?R%5JpcUVA*s$bg20Snj5fRYB~IJKZ+J_w@YK;ON|N8iDx~wu9c3s9H zMYECG_wIf5NNmtb_p0IS zG7_;oE=S0r2)bNz?FIYFr0l+PHdgh!FCPGl3OhSElTj$w@$%Z|7Rk`YjLkqwy!}4! zFB!J{{N!!-Ik#*2T35{rKD2+9^k@A^7t*+jcIJvvyHW>FEhxf+ZPHRIsF6yk7 zAyhd4o}_v0lnT6p;1k<9O3vO&)q%R05A|Z#mB>w_c=uKD97dO3;Vr4Dig-+6i4Iy*29n+ zvT>8mF(UaA4(KVXcAbJzm?8t{5v&(4)6GuT?v52u9C1zIK*)o}s7sAE zf@=8v^G&a>6mdGua%MAw)2HFXJ@%1<>>WLuug=txI@d;uc^x3U2qyiZ+ZzR5 zR~Br$J6b_6_qosX?T4k)A{4|M*0fs=*>F0>wgeN(*fHEFH?Kc3W>IsE)s6oe)6Q9i zr(31SCvKh7{I0ZXjgamme)B^DKu}(@cV+J2Y!5dQE)F|Q6dMdy+v*XO58~y~kbsCI zLhf_nkX%1(edrB|J_FD56tDqWoo3JTq`r`H_+LJD zmW)CNW#}TP*?Zwj*U7>|L<0@fn=}ey$SI4a2itjwd?Q@0eSE4*F0blW%Agy_O4czM z$%=`}iSToQ+``uJq_6OtN3av>lZ0BDGbIr;2%M&WTZwXOP&{b8iijdY40Gk#yIXuI z=k{Gvl5GtU2{Me_Lq>B*()b~{)|Z_`)Hl}0wecwGj!SSTN`Dk5i~%0H`mNNQYE)Ep zpk320b^4>5?iCf;-((CpCA*6}>dc!@J*!kzNiTisIY)4xu7^s$8O-5B4j}KZ7%OKG z87L>ZK}p3f747hpp)`2Qp0hsVk_u&FS9ebZgp_e+Uw><}yWB+9`>{;9T%4TIbA9dL zt!kI=kt;qqe^ZZ!NbI4$V#u_-_z@x_Wj!|aR7wt$JHFI?{l&hds`(CyMMN)O?IK$t z7XOXCEsl#iC%^OTh*!8yRi~%9`h9znkF7o{HY9uuU@djJ!Qj`_E)yAfrxk76M|S$QPYT#JUJoQm zT77xO{F|ny$xs*P7S!nGypgXxy)9-V6A2BO+PfGHZhs!$X4`b**hNiK-Il=QwO_8R zQS5rA+9snALZB%+wq5bQe#*yO>}&Za$xR;`?oEqN^}h*`S5T>J-cZ~TTH^Ox%_J{I`&4l&qI8>YzFwqec_L^Ehac>`)GEJin;g!Oz z>r>K#wGp)6Fixg*vn2VGhruV*O`r ze#Hr#x2Nw>C+&Gs7OY9F_Teb$o5EVv&Y;W;r!W0SQGKUuJZ4_$gqZ3a>Tcv*+a5j` zBGL;f6>zQ?nuri5os8hfy3ntZ?uK7NWfjcUudmJl@yLS+@)T)_R4*mI-7Gn3wa!{c zm1IY%TD!N)jmY(<&YUEE_vT$v+6I}};o(PXRI%fmi8)QlIAzM$KORvU3^2;v^_FON zgdLHQw%*ji!FpbF&OvKm*H6z0`@<3fs{4?T_V;g8Sv+uh8^v;hh1yk4q#IPXoMb&v{A?^gYcH;4Y}KAk>@CV(Td9dfy(xLn9#Z=!xRfgDMwQ1}ZX@w?%B zrs&TPJvKPaTb*+Bwmn(B{%5x*FXRvNZ+6l~H*l9(KB!}3yX}*Ue?Y?|2FMPlLfior~sYVf-;;=P7-OilHP_NMWM!GKsFCre;ZUu@a2<5Wb%rb(qlb=K7Z1o83u z?c(tbK5Ij7?|H5rRFNRSCVzK>{_QaZw|IR$qkOY-%^GZtp@X-=l+)H>gm0a+FLs#T z9{$2tPn%RH^%5iDc)g*Ixz>9A(Oiy~Nyd_2{btH4^X6;&Sw>?(OAkza23kIUm`ZpQ6ns+ZOhq z(e4eiR`!aGbVA92GD4>6dpW;OyHSMmdP`J{Gz<%%x--5GR3Gbk_pwb;FPDOgy(`;C z`)w;>d$@D$>0Q9ge}o((AJ3=TV0Ewe9_vMw8%BfAg{r4Xk zy=<88cwIAP<2epv+o9dX-)4kC{H~s5QsjEOv#TqT(^NE8@DO27&G~%Wc+;cPlpD73 z$~WbE40Kwz+-7e((!U?WDa_8yOf2mFxtvsN%I}s{o!LNVh0cbQY-`GElZTzP(WqNI zR8LAfYn2nyTqvGU$K8AS_4Yw#v(AhHA`!LS>lJnFwGz9+S;a~2Q57#kZ**MK{MQQ^w_0w%U(&Wm}i!+DaS< zOQvtinY=WH{&d(#D2GI5?TIuO`YhvcH7nLfRF*j6 zO7vvf{{A(hqVCwBYuVP5{dDXgA}D}d zxy(z3va+yZyOTM|qSez(yRT`m^R5jYtv;s3784|ss`arU=>$39iH$o#4s}%~D>G1@ z+CalEUFX1oJCjd?+w)o zdwj^qfBG>vV$ZP-fp+hJkq=E>Pm>h|UEZ$e$F_wTi1ym)3} z-O-uxJ((s&Y2G3pU+9@sUOYF^-M{mPDPE53~sm} z`XMw|QAwIPmd{~}h{&)_K8vDQs!HqKZ}Kq!q+Qfa>|T9D**8xZ8mvk(a^NzfwJcMqpHe`iL{n1xefh6(`&-7=mhj?8}%!DZwTi*B6KRq zKHsGHovvF>SS#1-%NVR1Rr1L*Uqj1AwJ*A?^A>v~BzzihQrVnf9Y=c(*uk#gWgEiN zo2ZUXf8rdu^7v-;3FUD=X1ce7|*km3B_{7l-G!`_h2<)$F{2S(V`VVK9JH^klf$%$Az-oK=Z3q0z)FXHR4A4IC$@ zrt=*`GqQz<3psU&uiwfot-UhDp@zNA^2oQDNzVHd?^ziKgCq0{oiXbHs7;gk*WbJt zR58?B$BITVGRio-_MLc_l4JjhTV(R%tw%@6C{vU#t-dG~_~cVdeiD#0X5Gx~d$q3n znG|`wDI*mt&osUpojnHBl~rBy_A#;1m*&>buSeb#vU|Z+URjy;Ub#jV-7uQhYg=lj z5-eYFrIl#Mc8ZAF^1Kg`_3!*HspoiHf5Br@n&_&apdhPczkTiTo;ug&f-$0pV;YRK zYLdx(%4tVAO$+@4%Xhn_=VI~(qe(@p9v-@t<6W)g>N^oU8MC=vCH9Wr<;&j8Cb??2 z)8gxl3yvkqtiAR+&EZtL!Mn1ryD}_}`2ytviIQzdqC|k9LmoZQ8tL|BWZ-z~x5=+! zdm1n5N6C_wKSb}(U~*((ix+a&_bKq{d+<~zJl|c;H{uqlx*}SgNRn*KB0cBi@pDhu zh#XsPZ%~fmRX=vg9(WqV%qHFgGP(Az$Tu@7sY!`W4{I`#n-n+^d~IGEr>;ja(0|_4 zSG^0Pcx&v-NRw&G&`w|^k^@dgPJZn_asE8Dh=@pZ{rJ>SU3yOEB`prHSm~S8hbvFf z5U*QT=D%`{+AYf`cLQa}=#mLF(x@<@qXS)4jh<2GPT}8_&IAXU zPwHITOx0sAEyp)bUhO@TXx}3GwQk=SrB|!^Gb_9J%(~o?r*(U*?85d74^2Oe=d}q1 zY#R(frNut zy886!i#p)82Wh3tH!41p&D+^)4Wzs!QeXWwl<0T|JJBl3 ze)3bXS5MP*J4=50jCutER!+l)cdiN-qSk3kKelVXUlel?m<^B4;62Z`o_w)3R3m6? zyf-0zK*NFg>`9FS*00#=^rAy#3LEtURmjMC61S2Og;KH}){QW}<0=tK#m?n3;mSy% z5cR3Wd6#Qth|GZT?LgCF-yL~&O_di==Jj{nKDhF;ur=QwH97z?Kb1x7($cc#qsMx# zYbTw#6Zxt^`L=kr=BMZ)M$awLg7F*+f#_iT*gLCyC+FnU$JWY?V*ewUF&_S(lui zThTFN+<2l{K+fmn2LXn&*@BjX-myYQNO-Q@JADijuV&cYE&ffQ?PBoxJ9!U2WVzOj zXbl1XZj+U+o`}x`@1tmzBqo7%p*LR_YNn{zPTtHdbm=u4dEfXxOvWxqM#x-!?~Y^) zBb%j&xq7XneN$#!3@bhT3cD9KB!DnQv!}*H@0BIv=&`!#V?ZR6dXf#y-9Gf8H>E*> z&fUamx>=dE=F#h{bTSN*Yb~N9d*3o3wE(vAE=j;_HG^NmQU>)K0UcqpT!O14gIG{Q z?=i8C&$@G6 zjp%33NJ2NukxHjNa`-YZS=Nwrghsk8OhQr;tPXEJjo8CiC$jekR_qWyeBGhOxfTsv zFzr0Es?$3f$3vXoUWqjw`;^~)%|)hCYhT}bk^(*g(aQyH6I(@aeyAVd9CBNzU(=6mx$|>?UO`@8k!3i37=9NyBga{u(&9)-7F`^F_|MNi7;eQe3cHZ!s@6dZ6%DD zquCAlBHMLHX75+=O3LMdl*vDl3O`bzsus|v(O~xGn#8dg|1Yh z3>X3H_#NJwo-?RoV_lIy2s6#gX*kn)$lEWC#q3i&R5QBY`k5#3#(w?Nf#uS?4zKCb z&p#Sm*xy1F-lJ60hsWQtyx1ebtC&H&!AEbq=n%Lz&OI#pTujQ2xGV5Cw$` zH0LoKOKfE@&M@Fx8|wa)*Vi~fdtcON@wA=eWgpjuftNZ5~g2N$a_;Vy6@OZap>2Lu`d0>fcMtx!_by+*KWmJ)Wd zgWRQzRokf({CKQ5lk^&ny+3SKb9i(LGd3}HS^iD^kr-k3H*3#CX>NDEo%o6bSZDsb zU;E|Is7YY3W~%I`n(qs*;Jq`nIenEZAV*Ezw_h=aq|ni^Z!1Xw4Uodm=MGgW;?TR} z1ySy9wteOdV?ev~ld>=PoTi}qW^SpTXHCMb=pR{XHrlj9&ied{_VCZ7 zT}^grnFfj0CRfD}jWR1mDPY(|Z7mF9KS=g>w zMPIRP*bBA#;zQW}*b|`D*gd+#Ag2jc2I$stbpav~=ccTKjIrTH;0Mx(83t9j^wz!s zKA(7RZCt;zMP2;L)=JH%rY%J~X6=$|X;fWqhtX zz5AdlVdjLdg{o{WNaS>EA=DS8-&eVzRuVR|yE}*p3mMsDrDdhEnqIq+gzhqP?%tj` zAyL~v7)2Z^fNd+c%PKl`t&kqWn;Q-Rj$pm z=c8};#Cs5?s3uhM)QJT2-=E}QAEDv57Z0c19}yAZcSY(%qU*b-AQlQsqa7X|E{_#* z;lezkc$^?cS6yA**H$D9qEjL5=5e0P=KJjOdx|@hKQLvZX>`G4>haK4K>2n(x7z>>AIZHGYoY}fHo+NupvgRE7zzaj{o9^l; zkFHY!(FJ2)%18mF7+6HInd!3c^n^ky#m<4O;+fJt3Esz6Z`dY2wRu3Td_UPH_DjUk z*!$zxnw{AR->u`kcbQ0a06R4{pdfxjJ?S{P(B#O66z{Df9$cgS?OA3*M@DaK+r^Mr z&LY_jsG!iS`x6SM=mZ?M@72u=lL%OyDwZS{el6Q$55c*!w{&#aWH0&YGf55J;P5>( z(%Grew2B%_aO5PEknA~ni`SNsK-Wj?Cb#!tpvCo@05EJ*SZxgIW+09BZ)F07OeoQv zWaDd_s)k7dP}!#LHe_&JI!m z5@5x7cEjV%d3L)P8CSKnwJGRPNT}RirPvs+Mf)g-O(ujwUHin-UK7JBG7(VT#Nznur_E|uU@UtX&si`O8IYGF0s^7-mP=Hiq#?7g11w30h}-*Ua;jasb~RF2+uYnS zQP>+V<>bV5$Mv0ale7k(-VHredXNlRzjQ6TejW4WU zwfXeb@1)=~F><(DtE4A#bVfw<+tlc1lUIZs=bt|GSR4B8e7R2=B@ZP9yWC%yZQd;! z>N%Ejt;EH_=M%6euAQ1A_l8x=Me~Yi^J1|tAF%&iS{u#;jmTtyCqBUk?5$CfDvu`ug10cdqAqj2DGS%(f1_)*Qm)TeL^{NL-+AvH7 zw>uYx^<>n89Qti9#Sskfq@U|py_#VoOpDFGkYm>1ED}`lxT$4-8s#kticjnu8hW{P z-$<<)tw8ELn#XZFRDN(2*zHes(Nu8$S^O3e$IQUzQ8Us!tUc!%z|NLaD>kJnlu4aX zWxge~#;t5J>Nx%037ux0KB;f9C7L_d?0P%MNxZ(mXUIXV;rNAb4Z?uhh#;p@of=vB z=sdgs!%L`_IYX+h_Dx#B=eklj%KfFP20px%*}~g zTmpH_zScU|QQveVZn(`#(D@_pzFeCy4$dMUU3nL))8gMu>RxV3+m=91E!y?`0izG= z{=(h4*^OgEv2F4=e3#D>~BX;TUvZxjoSURdp<}r!)s+ z$P4l*Gh!tTw?Uz#`1vg~S3ee&*c^!4X!vG*oKOuRFdW3rihQ3`Hvo~#poe(|J+`WB-bWc)K!ej~CWF~eZ2jy=%eLfcPg9SYfGo72m#rLV0zevKFIgB>b1+FxihB*k9rXp^3CZ+jLcdf)_|uXvHy$n$dtIXOAC zuB#DfyxJomsTidoURWYiE5e&l#w;eVWxYK3X<>3;SJbyMQ|0iBT&Lx_uZ1q4Csvwl zPsKGp<=W`zP}{ZC95;N|NMDXFHhjj+)^-gSf-yyX<}B=aHK;*lx1}vzRi#1(1P5xp zdWL|1%soqA1(J6!L;XIfYK;yC9)|0!{D_?6N+Rim#XfY=O`u=J6v@2GK43)gCQ~7f z;{xBO4eR?FN#f&a0o=OhdRcPa&WsC<`F4bOT#@&|oBcJ7C`C<)ldQj^gP<%yHR*T~S#(6O)ZP$vt@t9IlLxj+SB##pJRix&{F2Iq>OB>iayV zjEO6sG&c;q8Adbfy(PIPFu=F|bG!B{>YbWzGc{6gWEiD9T2-9#^{5v+i)d%wqYNEy zyYvUR89h|uM=%CB>V~2t?%IWWD8trl-0oNW%>jLZ9SZjIJ;SE2$ek=Al2I%bBBN$u z8_ehBgo?HlCt@!F%YOz09+_+4M3NH^PK2loZaBtep9$~1rENq(kPUMDPl+Gh?(r`Y z#zoQz)rWhHi|NXfyJ+aop3GW*DYI5Dn!VPUK(UUx`At*%jD{H?HHLdw1?nM!{(fSv zgwNgUp?YtR3TgzO>`GxTzbC`0e*GYU7PGEoT;bSwD{Aa;kEN@Rr$r2BRMmQgp|Teg zClcCsP#?0Xqa)3mYW7{j-~3){W0jqZUfAi=l`(vF^oBmk1_Q6G60{qS+Ft|(K^G=j zcirt|2&!nUBe5zF03$cr0Tg3NeHK08x0&Y|HySQaW;ngF43Z4d3dra*^Oj^#NhrK} zo4)2nSJ)>@Ev07V2K9!V0*`n59-U)ZeN?O+fJlq9YFy!U4zoywhkX|ezl;u+&ID9F zXRqt2p*j&BF5opx7n*jq2K};wIywU|=zvDtS`k8}bcv@|Pnn0{b^Z196QKU<#Ro6d zXXd1$15e(?wmhqpXD1GArkCK9?{Fl11+9zqT4CQGXxl)v3+8rt{_1Bh0_`jxSNH+R1*z%%c^yTMR8)8rhsStK=xJr5R znHC+}LbHUV&c{zYLD?UZar5C-gfBvX=WM*QrIu!8kWBBB9sBnX=mNZNXykt6ffOSu z5X!x9XG@)?E8cxy)^p~EFo79pqyQ{Nd!0GHD z|Eqg;+10!pLMZ3QJ)3D5$h%6vp|*CK-e{eebQz7?-G4(}@3HV`>?==VykKYd@b})C{5eq)Y&By1 zt{Tu2$d4qRNckq8gi6*Gm%q3_sD|%oD=3F^czAWUEPzt>yI7gH)byq!>RBik91tl4yoP#)W;{BMC|mJAy8(qr;UwZ$6Fd@7MC=U!p^HTs~?wu7H%qc zm_V{_pVYnLM}?Qlgw*HUM?*JA3t$uKBU!3ZGDAVpcgQsgye|3?LZxwW{MJ#`Ck-Q0 zHhJ3g`v)58vU+;1F;-Ctxv+gpC|1E$Ke8j&zu^!Fos1YGE*1c`N;mSE2Nj4GoPz=L zVjTn)3eN6;j}d;dBoFy*N|FLj*9 zGNO<`?cF(H7SUGYe$>`^N>}{-UftK9Z!{!J=gXI*l2}jxP1xtQFRsmVZKz6u83=xQr1^raxWjAq@Af(&#Trms$!h;IRr>Zhey2yvzHQ?IGaqr~L0n5nfs~60?R1=1{ zw&ia-RZUa0|CC`3pDEd=6$yf?z{u8-XH!sbAZt-eopGWLJF`=0B~a4Z2*wF{!p{<* zXGgj(s>9Kfc;==t7th{<#p2;|2f1H-86G~eok^1~2~`-V((mwPbc4d^Aj#;L(VG4b z?>2Yz;1{2*EIJ|J>c!bNLRox9JKwz3q}w4DUU zqdm5qaZCnfl}btnLR6Gh!Up)aM(rQ*>R(s?ZsXSVBzLboqpLTaL2o}36`#es!pddU zic_GA1v?0C6Db{Z1nB>($o7{1-KfRz$4{lO^p_+80H#FK#2#1y`oN zkyJkp?UW(;hIb>?D;N$+Qn+6Gz?3v_48=DdTYXY7K7PWbI#_Vh=>&$FO-ks_rc(s= zYqGCu&<#Hf;<7md?2(n zowY)@5Hs_dwZ@vBhv$yac>Z*z)r8pluoo3#=i0oWeMz%_beCV3>jlE=@c3ebO- zx*y7OY*5h6u#OMV4lR_vWC;a0U~h+e8fD#z_j+O1uRg!ZZIEWrT3;wd8b^{4iWOZQ zjc!aFDa5FPo`7;$bi@9k+Usy!RANb}kzq|}LN2wh?~--0Eh@@Z#^uHh10pV82h*sn z55XhH*sO=Jgd4!PEl&6q8Z?N=+G&SsWDsAD9%&|oYzrvV8gWO$m;(+_(edY*Y z(~wN*W?UF;P~*`Ky{N+)^V*^jU?NSE=n3F{b;pVyx0SiI^NAL_ffnnv@yfJ{*xpM} z9nq5gf_KTYZ|LySypU|{1Tpm!$2&fa46Ib2Cep>t!9=~HkH|4VeM)CJ6`N?cBqavm?qb*G~liZ8BcGAwl8TC>T9vaJb9~+8~rnH^F}k3TXl!P-I>tFwsflt z1Mr47za1p4SzvvXO|;nCk_;MFlnl|nx$6K;y6}u-Jq38UHqrm%>OH`*?B6$VGooyd z8A6E1&WccGGRw{;l2NipRw;U9%icn^>^-8$N+inOd++(b9`E;e{Ez>?<9LtPd%St> z`~KXY&vl*Gd7jtxe947tJ>v|`MXbZiK`&Op4VfulzrnSByE#8NFD% z?_fD{w1Y44bz0mLOd{HC<09wN#B;*<$-(U=QUL20n=#va7j8(5)#M4RU(Hwe&>U^$ z?GIWgF#{ZWu+dEXf^1RaMQj7{oF9UUinjvf*hPSS+%a*O@Z_fo>mu( z59&U$Pnc5qiZkBAEO%d+(OyG69QEt6jC0k!u+ z9Q~3mdMW-(uwT@ewx7u*Ve*Zd=aqDrYM~SmX3<0kok))Oj80|UGB*{R?Pi*Hz(zQ(JKU&}v7ELx^ryXr5cX3T1vD`;^u z9ME5Xm=?>Qe|#A=*RW5UfGtb^AIl!*C#_#Tb?vT0({b-=7?0!F!8ePw+Z(U#mjo9_ zOdrrC;L1n7&P8zNQugDtvE^xh@{}6>`B}#NfnQ&1u3VubIx;CLfP0qe|J<`-(DbaU z$(2iNgeFc))ObT^8!N_neLwrr<_ikbkIwZc{ihIZ_Gp`b*W$KB_zJZ!KZ2f40G?su zIGOr=I_tI69$f;2@8{wK$PwK|K~4B9Z&_){Jt1Un85+|Lcm5Oq{l2t|@;wc1Tky6n ze(-O2y+z2M5H)?d(0z;qdKOpyZ{MSEz7?#B5c0{z;mU1mP7m&le*U`JsSzywy2Os^ zf*d8$&s7}Kboxea896le;EmikMg9*Z^)6+TsFXXq zqq!39&r9#T)Q7*tgn5kaMlnt<`#&2OkAlex@tu2__xR0CrvL05Qr_(f*L|lmSsH;a8yRrw3aU5rYi~vCV zza6^&Au-=aq|}XB>+3($3Sa7nDkxMM6)QZzgc4JNZu-w2q-mN_7t9pg^0KFkgn-+U z(WrR-W-2<>sml8jN2-40tNBj}MAvJ4-iG7jrZwEirL-dP+|@d%vZ;iFyQZL-eH>&# zuf_`^IO|C)YC8ZEr2pT>-v3r0@qN>q@>hGYsd*WRd$)emoDQ_q>l46X2$170P(VM+ z1U;<%ZH4588?ZB7fX_mspP+4$4GeXfrq>uhE?v5$y|cM_(_A3#eP&kHoZ9{S9WjZC zE0OW>OHXdm?)H!)?x5GyZ-sP0WZIe{PhI_L{P_`amD7~`-j$h`>o>mo-llx6w)N|{ ziSfIm)xCP7=Q|r4iko|Ts#{xI@3%KLsy_EG7P8&AkreddL$sb6_5oEBDaPmO>407B zYRbPJ+QK_s#HsHkxZFHEwDF0E3N!l`m8h@0<$K*s5(Rf+!$&8sVdWzv3FD#~pAETHBg4Zm1)#DYsOK3DVelum`M z-nv=a`?MF6E#Qelv+Y<|SQE?3glcMP3J2fC(C>gr4Ig>rEWo3X^vH4Fo{x+eC*}va z)SA%Z;jRja&y#l^)fUUE8$PKHg$GuA)M2r)f#3$de)~2p^j=iCtkR+t)c$NW_Vevt zsmnmV{YjGYk>v0>JF#-UJ(?089{vyW`lzb4jgw$Wkp44TU#VJ6dX>E zoDCYhXh04ADs_J1xD2f9TXJ^QgX4pP5wJXrQ86$y&@>fc?1|B7OLmAp{Wu zYkrMa;&bl3GEyzLHlO07TJL>YqtM`W=prX8n~zgW+T?DtI$OpV(3TkSK!gWFy7uSK zpFE&Js}NFhT09%fkJFj{_Tlu|pTZAl3olRPPcVaU`c;4Zm=z#AaXN1xr2GxIb7?F+ zGEtWmYOoNaz}LfSJ6a<&d$hZJ+sEhJj+B(N6Eh$41=j->_Yptn+GF?aw|OhAhtd1y z?b|)@cO#EyBGt0WZ2s^RTlZ&i7}Zr-CT60CMzE&dz)D$5d;?9}&c$O_$C|O5x9Wpk z;xjlAc0mUqD-2cG(GBM7k=Hs*%kvr=kN3m1P?&)~IUeV%j)64wrp)o_)2Atcfq`?~ z@j|FIaLK*^ix*w|E78qoUY;J1tWj6qk9@ZdN9x znQeMEedIL`ao?VkI|orWnJv=V=;6a(^q!jhfKol;e#8Z_fXhDNDm9<4$DD@)@Awvd0P|fqu`G|_ zR8#r!yZ0oD)%g1Q{)RIhxjpqOW+YH0Ls(8dabj{(!=^Qm6fBoSZ(?F%J zrM#lt#|gv#r3hP=;)$4`Di;N?acvk<5d9jAE9)^TiRBl6xx52H2$DGBGRV6LU<8oI zKKNIGd|8I;hX-3I8~drS{YaHBh|;70YovLAi;sO^VhuAnz-0%XdOGuO!Qq{T74ovO zS9i`-@0&F9lE2`dOON+& zF|&_Qeg4=!#(TYfpU?Z`fR&fGsL0IRTmh?UO_bQ+WtM|Sz4t(s!}QL2-8PZaZAs=@ zi;px>mgp>Y;qMCbjU?xbQ;xl59f2P#pV22u+C;7Jt~HxYfqdR8gqd%kv(x5B>fP5) zaHpF@moGaE)Fr+{*EJ(=p}%yfX!0oq0cY0dA;SVQewLA(9FAZ*5gzxwmEo+Ys3=kl z%V(UJJ(FFL*RNmSP7t<>KL;N){>*AmPxvj5#S`=k@*$$ZguGgT-){E{4AJr{6?XsZ z<>lmdv5WgO7=RH6MUVgQ?!=jE=G*r&Q;g^4y8iB?+!iS zT=NFslR8sCTb(Wr9x+4f&or3~;%m2^ZZb39V_@~^CX`CFQ-#2!c5-rJ1b!rYv^6KG z`_<6{EWlIibLXlKIipji*&zWv0M5gFKjP=>mSBPTqbfQqte90&@{Cg90PN9#`rgUl zL$XzccuBL>r@(j!Puzdq@#RJ9(+exC#eg<`4hmh(N1_JxurMpVlE+uTj;E@uq!j;z zk2=#ooZAtr{GN{0_J0@o;c)!^zPPlu0@yZb`u$dXjNw=(&PJk@GOx3B3^k zseRSAeUZfdU31}%id36%tK8+EG<1R!!bFJWbFzsC>O7g_>CvtnM7pB+OMLLKccX=`-Gj`$(GQLlSAD=3 zFADU_=>^!?FQ6|B&S}I^TT&$)MvDUmshEF(q8%Kw6Sh*V_0?rxh0$mw%uY$^|p|7ij=DDxz}i7cXrTziX5qF3Ny+^e!tDM~WW$kL6)#=aC zs}D$CgU&sb3Vz;W{|Q_F4VZA+1t-Zd?El(a((#EcqhkNtN90EfhinTq3lLi+PI(jiza_z(R71N4I!F6H+7#MkN=Htt}Ye zaM~w{Zfv{>4egBw*V|B$T8bo5Qf%aZgu{r6NlyrWU=<6J$X0?V4JJs`DL`na&XS=J*QcX^j$^|Ht-O8A`1)eN>1Y7 z0CD4 zfF5Ybq)d|xC|=c8rxyc+s6a2y`ShNZmF|a~KEul^qbIKV3+0a`@^4;&rHLlGfRHF0 zi^n^##m@gT(*!I*zY*ic znPcV!q+<;YipO8@kd$8_pNm1pdM2>9tI@e{~??z*=y^5J5}af#q)8=fqcDw z%kwoWleYJi3jjX#W5B9LrH1)Z16p;r?AhVf zui`{lUc@+6oU?;z;(-FL{VM4SB(T@50O~nIQ_OtWq3GrRka7=x zCKZDHdZUkS&z0F<9NI{IVwbL1{#Ze)9!99@mV$o8=|e7SjAU0U{8{ zs?lk0YHDg?eZ9!L!u!+%T%mJ?hYue&f*UAqenrRdzuTbN$sU`-3+j5`h5xA6Ez7mf&OuCHKxl{9*Nb9G7CpaAv@#42w zWj2Evr^^Z<^v!XCR+^L+U`rkF5zMotm=q8b(;ME{*zheXDmwCXbF0eDi7NO5py&&z z=g`0xttNm@{~GDCLCPh1)1gm(XO*uE|KB(=MW*NY63`4$2`8)c0?gRl0n&^6=AI*t zUjsDHrg-lx^qFi|p6(@U5~;_$9^n2LNXqhylSCi^?Zynlo9~K;QDo3-q5(O#UHJ3K z;db`23uHyF)7?MTQjrM-;MuZWFMfJ)$*nii9;OZg_fE>4@8WPFN-L2T%l7av>1xRm zV)RY^D<66y$JE}weOo9BjX%D3dbGNz{k&|(i;Nq~7#qRBL@jI^dsO*pf#Y#vw-q;! z-WMEj-J~yVw-EA9g&M{HeTQAv($T?Zy1dzs~| zeLL(1@uJBGDVmfITNa$r8Ci-aU~qkzMFp439`slrtG^yy z|G$}-?h4X9kCBfnRtlg3?ZFV%pS~O*XTwnv%7Wjng*rYz*;X6Ky`gYpR@LTr?r+1E zDR6xMetlXWANX$Y)}hID;!!kO%o7Mx!aLkBwTJe!rW}ooeE#o}=#8A}j>Y)=T2Rg# z{Mq>l%Sh4{1yhaf`<*R!s|{v)y1%{r8koiF2tiS-(xllxV&9Xv@&+SwVbFxB{mbQ2 zO>Ct|UP@TxSM;-wpVvpbSa*W8*&kB&L7^n%g|~@@7WS}9M_;Af={lY3ii<2<>U-E8 zIZrfPXtyWx4F*D@4SSnI=AoZtwxEx60(_K@q#l<&4JUJ1`;)2kC?uC(icW8uI6&^P zw&~tCHdfXNXdQhPhCglWeRu<2)aSF+>FJE>f6bq0wUbe^uDT&a91k<`8QdoPR&cxj zM>D#xGkwq9S^c-~rKzcT(&@08JOIT@XY3ItZd}&{1KVGNndUAUQfNY#( zzOJ`=yKQQDOS*f$CfP-|B+yj#rHY=gX8OzSL>x^^Yx5x&MQL>3-Cf6cNe12y{=jm@h}47dN0yj@kUCZ2y7qCyPY3;nR}9@ zd>B3{o$e!f%pebEXfcv{&j@wWeL_+37FMV;LIx{*)(pV+lOcuq&6y|ihej>w_+jWO zUu0f^5e%+GpPuXmvz7$Bc{8G=VSN~oFLVY|p4!*H8b)@-3q3IG+Ub=#&-nxHs_0^5 z@89*t^9HhxCs$RICG>(qnY~epJTW9e_-D;{jHyb|oIl>?2Mm{5<^33hjg!m&1zYhw zrbTDtNismR_G*J4_5lQxnzLzoIUf@`o)~@pWd}UX49ey6S~Lr;#cJnp#>09JT#T)w zz6=F^Xhhwu-T5g)Yzl9GiQ518@J6E!7zEqCJn4jh{`T{u>~y<-74Fz6rDy@$mypD5 zF3!pf65Med#y1N}BA7RbzqxC`4q;jB6XZN>@bX`aN`MK6;hJO?gEO}2KYw;{*$EJ! zJ`&&DD*otD8#W~J+!ZQ`1e#BFKqu6(!P_DYR1MU$zhWMJZO)_+th7zUPi71WY$f8sT)DN9new3n}-K{c7#zg$Zl!M8(@efp(@bGwr>@8G~K z|8XVHsLKps|4D!*I+n5~6sBz>vcBO<0%9ojR&@#jgMguHTEQ1{3zxEy2zE721GCC02#vWTr|7 zQ$}u&vFVVnV|@ej-rVCKa!fJKr+;mVK0h9q4NR7Nb;NO3wY3Ed_U6zo$vF?*A7x|* zvc-{tQnQ1Or0jG;&oYf7#bgtscA3Oo(3W?cdf=yWxp!ZBKlQ`HjSAz5xz?c{!-6ZD z6XncvZwlQVJ{NXP5?pfkD(y$rp{BY~hElJ#?q~Bln0zPdzLiPFwmusZ`00x_J2dEj zpcBbeQmlS+pHryx-(Cn!Ks!q%?(ko8_EhQU++m^Si?Ku#J2*4vv$H><1!+HgQ^Hu2 ztZZX$u_Z*Ydwcz0m!tZrRJ3nh*uTgqLi^}Jyz*P=Smny1Ci7B8%%mQe4Eb$omtkIo zZQ4GA-x?LOI2cN)Z>RWWoYmd_vo~;%6^Rn=zjP|3W-KG$WdnkQzHS#dDeb&J zn{XL7c$pa(ByuP<{_QTlb|nDv3ax;JqNf5qcZ7y!(&Fj@b^$d_sYEcZDWG^-Yu{&GUes zKm*xKsMfRXtUmtXP6@Y=JoF#f(zX>lS8dgBjNH90sXrZh?V&2U7!%Cd)fg;3q?ggl zW?t(kEtDvIPtCEc#=}X5sWxaLE$vITB%A-ynd3Y5E!!b=E$$!Oi(B-_Wh=1i=YG-V zIU>b0%5{}X1;*f^W9)OSmz-Jd&)-gF@Gi=xjY!@kMtX3iN*|Jp`!a*!gjlV}>*wMfgE*_?R!f1bmN2q+Gj9?U zVf0xgvzmO{cO#;WjU7E}MU_~M*$&F{YlD&O41Xm*+xo#a_jqzBEGd#8vD2roxZPB4GIh^UBcE7ysZ$jvNV_k=dur@BSr! zL^_jjhLu;h7y3BOuCvK1<<;BCukUQ^9ypx>Uw0L1ApG_TV*MGk|+?str_ZQHj zteo843hW1hKH(hcD147!7B)Hf?3SDAMv)JMGHE`@J13M@3)%hE4C19p_;klzr6Nvg zR!9E2T1ByC-NX$p(@hj_gF05k6Y|M#TZ9iwQ_a`R593diD{|gHHUA(bHrc~pL0%P8 z%#oflBEh55vk_%?#Qd>S?#&m%??|KzdT2w}ubGF8!|#!mv7H{#x%X&TjPpZj1m(4U ztPPdO+#!CTmF7jtD}s734rP(aw_qA2->xB0NoUz!x@Vn9d0Js*Kl=TBQ_574K=9$s z#|dwQAKVPMm&vL}{=6);?Ju*(qqHyUN*dPWc0U@lE7UbU$`VlCWI0w{pZ9z@SHHa@ z(K`}X-FqgL5~|kSRd02eRGWBw=e(`vg(J})(fjWpy|Mcp$$45B;&BKdkoMT_oKG?f z{o8^mel_M{G&wdZhBLFi{7h$?AtqCNFd8MUG~e;at97@p4B*=k4KoVg|m2y>*So99u2(G__OSLZOH)ogR!vh8 zSnu1rB~8R4%1El4(&AG*f2YbwjzJ^pfAaRy&$`pSf9JGsd5f_JCuoslEPf zo@>?Y-4DL|%Nd|BBkA9D-lAJ<)np~&aG-RsVhg|ir=P|u(e&)wZCYQz*Ba*Kwa&}h zk(-G&-x+mVnIk+yVuPgJB%ggI%)2k$*y!zW<@BajZdA3Dp3ijr>YJQ64ee$#%Yk3! zT9{f)W0Vtmxs^gxC2y=@y%Z$6PME)m%@KXD49INL|f0Uy6rJCTD^J+S4!ZTOqDhkZcFU3O3we zDOT*FMF^}!{cXXMgPtx*q(#wSgG&k|dh zQQ{`1k$fj{n<^r?hfB!w{tp7B>q?5(rze1gqVJqzPe?sGYOV6(rhWAtcf?e1kP3OU ztTw|F(`pYiq#|<^r&eyPXkaUi6^|a>^p`7&S8x!R!_XL5Sn{ydY(GSNjW1!lRs06x zDQrKSJl&p@JDwE|32bo$4&p)CL*+I)*t{?;$T{)^m&?S=S6}DpVDHX5XR*S*fxa^9 zN93v)dF|3Bq&a$N_i)M7XqF!@H9d>Xl#AmgKnUi=G87TyU~LvQ=~*R}yB_bY?qcb2 zU&28xTUO9VbGe=&+J209T;l1~Pk)4Ikm>Vye{s!RVZZTFR?p*W>7_B}Yg&-XjQ~ci zqM?2d`I030av;*BqBzHtAN#3=&cH`NTUm~^#f`48vtHv9*b$1S>Czt5;BTfiw-|6E zWbV}JH*%&D$UelxMTKihE!$aLLjF<$Mmse4n)qHfq}8#6UF}jIOVBt6p!y&DIx3Ke zyWD`{si_|Q{`CL601L({SmPKR6#02CwD!2q1`$Tzbe*sfeu6MrfZt(0u}!~lQ`{=0 z_y^8yF~Wo#X^qEQGly1(Stk66I%ac!32+d93Laa15iQ+Ry?4*%!-KjW=#NmauUTZn zUdO_eSZeF0?$p7!?jR4Ola+*@VnvI7oU9zH=XGtC5;Dw>7_tO^sFq)>T@9I+xJMY4 z8sIkH>Qi=^>N846xGAFezHgWG>6aJdHJj!EhoH(>s+L76aOrkM*m^|3!?%`TNo08L zuideODFT%TbXms52VYmT$+zZsJ+|GStV_t4v&*0Vz6&EU1{)fWf1a%h@)Qa+=EG|kfj{lAV zr8=&eoZodvhRFJNE(vQc4WCmIKZ?wR!&hQ{&_^D{aFv>b$NEE>+MASlN2Em-t`!%L zvrg2oFz`t2)E?S!?>8Vk#)L?#*o2vrl8NcXybd;;_(x8z^@ABda;8NOsa(?7$-z}N zN;2yv!qof6%;9&g7MpO=bBU)Bj!+kLI$`T#uawLdRE`OhtZ+#8ql*-}MwQmdEUC#@ zMmv^e0uv2F3igj2g*_*oPhW-XG9}+`x@$G~+&i>WFz6LVOx4o%ImJk%3CIJ&wltY8g7)fm)R&tX7G*wp)g_16{cpCj6!E7dLZ#IZ4(DHf(u;@tp*PO>-mW z`jN2->4P>e+#Y+4I)na&quYV|aa$%{kF^^sk0-|LG@e(-CMKR}zym+GD!I1Qa@CjX zO@I1Np10NsZQjtZ`>V$97^lQE@rIyDxZLfv>t**fim8`q29MBDE`s1n@@edfxEC36 zaEU$phTNZDcbn7C^H^YU^@}-aMPE#O|NQy$RThVCU@e}j1DnD?3nYq1<2ax5B|>gw zd13%7sjlTP789#cQmKiY79eA%M(lw}`4xkN3C<6{nMi(8nMBA@i9C8w7eW>Tm%#x z#ZTdw9wv$>rbQ%3_c|{}G%cLtQeAnBFWhaP%Z*$)ytYPHao{iaWokGgDvA|2L_xym z1`6#wt4IQbj8Lh55&Gc2#(Hff#d%D$&TqJAkk^>_(aGbM(}UwMKP){+rY%6PA4~v0 z>VCNpzp@?B(Z6k|)+sguj3<}A?=1FzGP-k*@U#(QK~;RUtjt(17X^`e}1@!rsF2lUrgD=jC5ZTxLjRMwt4U-M@WIWQ+4rzw)`r>E%E4*5bLoIs_cL zJ4*Kp&?jW-KIT1Z1NYfzPhtj%gCblXT3yy-$HGT1&()W{)H+%#w+$tEoAI2TtR}#z zmGW@7Wr^Z3sM^T1AFUasA+nLPEPk}u|OEc#PR7lU{kgf-LfAUvY6iGwso4qynBz(>iQx*&rrpXa&3=! zdzI&Wl55uKGw>07dlHSc!0K5fI7!dHWh-wJVIG$Amikviz)ykJxE`Pc|E7%Wuy_4= zFPsg@0S-Lg~dG%FB8a#1O%Mm4b^y2Q_nbQ@6r?lv5XTV#{mH zeZJ#HjDgt~MJqN6R7?%VaL^-#msDnh;S1OgG%6j|>Q+#Ll#K+zYkT&8C;k#YWoX3y z9sU`;5F`o&pbV=rc&?NT!`UrQ`YK@J&>j3O+Htl^WIa8Pv4c^;Ty-HW|NQ09nK?Vr zVBOB#{l)$xIrZqw%uGxeX5}MFAD2oq_vSKrru+6euV(Q*+rIR+Mhd2|TYdv}nDS)r z+ASqCi>aGY@(J3wntnOjCO`A-znr(Ek`{G5q6=KkZu#S+CB2JHO zu`eMbaBo-ZMrU=*Yj4(>7VrrW0Q}W_==1o<=+=`U*bD0o(Of!nR`cTYpP=_$zl;g@FARv%_5q|_o*SwHX|C54Z8cM z!tQZL3~ve==6)-np!$hRh-iNjW5@wSa7=7i zZ}~wy_apjPlagPRLeyo)*H%|}OLwhtKhedse(_y~iEaTzNPb)3x=j!Hh8kYgI_Nnf z#+jCT8pCPguk=-bXez)hoZ;WbQRPuah~6#H1XmJ&YZ1{OT9pdWHctVC{+ww7q}KrD z3Lq-0C~iKK_1Igno|>IJGbl6=n~dwtqB0?kdDgQ$RFZLpPFNWnE%wL>vBsCPKQ3`> zh2Ar$0nLzlXd&T%i<7-8L-lvQp5s37*QBO(3R;))*~G*Sr$HDIt~&Q_Iee-C`^QZ~ zy4kF*D>Fm}LK>M0=3s-G?hE;}r)vumUy3fTu{G>z~>Fd8W8)K}r`nUWEh__hu z3H;`75AT>noZ}(4TnW+yfo;BNG34wo=baJ}VU|Cl29w0TPg@#Ry)adC`VgRm&V4d4 z&aLrQ>wSYlPL1@|I^guIU$p5~ag>GTO0z+_kG)*7qYfuP9XDOs4+ey+4cECls*oPW z7tS7-YUf3_{kT}`LBO3Z)% zkxaO^w0IFvWFxV#EnUK2E3gnEf+9shkpsOa-w^sRN=OCy>1`?v=e8E0R`C(aL z*cEam*LXO|O|!vU)4#8z^ge6xvbFKw3Oi4ektzqA&nt{AZ*RlB%^gAm_#B}roqjnQSV%)f zK}uqnpn35|Sa8w5@B)5eRL&v?6E)sjWix-MQ_dYFeqZGEonNBQa>YE{LTyhxR*Yjt zPF!SFI3gk=|DeZJJ}ID79Kg@K2IuJ_gnYz0wQ~6=qd**co1s8ZcT1j0dmBt!Z(dNb zE_13+q~s5P=P*)yy{;eQUelBul_4v*AtHd-qTNtTr=*h!cPy+~;=BpN7fN)|)aC~v z7T?XR1p5e()pU%Yl)JB@LOFGU$zP&5Qw62nZ;UQulwKv9L&nf zGApN!fIkAxKU44SVpQtG4Kg)Q96TFbD#O&uH{@x!l$~*L+e|%_CV~yX2KPhJZ7MJ} zrz>8+*eCGEsUsSgNe9WDR=Tlq_K?n+8?Qs63yzJ}@IxBhU~~JZi!9*x_zD-Gk$`j{ zMc}34r|;g@3WkO1R*5;z-Djpr632u{b5FK!jf*OKoTE%`s5YwRR7b( zhhS2w7w1sDyZD)gD-0-fmUqOAmyl~&5i;UUqeuuiFHFqhgs1%Uj$jv1d(wO)0Q_OZ$xy8sYUvi ze3(ctp>$wk$Vn;uKO4(b(Z(JpH@I?GEJ2-UMh3muWdviRd(I5hOypE8j*l1=m**et z8uw_YJc!~bv4RNvTh2nRf^$nu3`WWHqW6Z{4j9xrpOy1mJh^}-!hbBP`UlRdS;fVuJDUljFKKs4VoM@v7Z4Wnp*F6Nc5IfTm z9Tj%F^>1oD4hlS2f6w6skmY+u#oPvWwGT{>owyWF`uBm>#dTj~`1;Fy>8JfwmqY<>T!b%&RK__~mn` zBbxLX5uE||#YYHhN+9&iz(7YtM93&iC;akqR>>L!HJF&8#Zx^)2J@VXZO0o7(Jru0 z$@F3`Tc6jC`<&N1E&RNTt~g-ia1_YVKVVptnYZ^$xPnEqKkm!nCowcON=sL*Hp!4? zhG-9G4e@2kwcn!XMBWJ2ZJlD>5;G&M&%5Yz9d#4X$qzQ!+Kh{1&PIVAFqx?wCs4b$ z`cFr(*^KQCs!fIkAJIw0Yvh&2W*^j+Cx4uOu|VRu$th=H^y1zF^dt3a_#MvgF_rar zR8ehc{|J=NPrz_|sReTr#xAjigb;9|Xg)m7qRlDH`(+VxXu>24v_f{_#)@G_E z-QEHub%cvT1DLu!@b2vZ)aY)i2j}(W%@a|^jXzZm=G7Dagqa|=&aM024S994`TY|Z zKC^&kScYDO_v0?lYgdJ_B_JTPLO!4x$=_cYHc#c4g?d299MjAm=8U}r)%MA#fM@K=u<>9|0ocA#ye9A_{9{VJ!az z<0$=Ym}n-6i_#DlGje73H!0D8)BUX{UTFDB(f7>Vi<1IC;T=}5nx|q&lIUf`@`o@3 zv3hJ2#84^$tZ}dHZp&g_F09#N>Y4o$uag4@y?T%Gpr8YoG4}&)&p{%Bj{oFpahZ27 z^qM&ge|dt2bM6ai@09PfZi?>?JZh`CSNXK>UXSSX74vHyJ|#+^ghc>f8n;JGFUkb! zsmSROK)dvX^QC8kDJ-}#eM#ABN@DP8!fl^AhzDcW`Kj`N^|RJn2Fq<33=ze+59A}hlUQwb3HIJvC0{4ycsiPx0`9`=mz7gp&~!V~0u1I4&J#Yr zu}H`lt|DSk`FTIdb&M2AZ(fa|&Im>tcX5}Ms=ludK+CBs7bsB%%A>3K>HMcD7YXY{ z5#-{1{kENOcr0LhY+%Z}0V3uW_x}LS=4a_~>uWOyK|W-d`#B;?FXtrM`u(Pqluw#V zdv0?jE%TL7`Z+;4qFS>DZgey67%m;2>8#*dhty0C3^@Uj$kYJkpA{HLHSyJ3=9JZ7 ziM&32&3>>MN$~1lTY7jV5`qJ7Nxs+OrZ$i!tjQvO10T6J<5H~*H~O5P3;wdWE12?# zi~%_{7}{pvmoE1Sz{Rl6EoGq>tL8%aa%kA~KZNlZ%CgNnjn)|`3f-GjX6v+I#2CG*@FHx#1$+PELtwENkm#5qtlK50nw*puR?D|gGo z;F%5}q>@BSbaf1a^cuy130@F{`>(!B=~x(rhL6;*Gt@mktL1-KUDrnL)u{*=I7(hO zgJd1M=4IvziR}@3{1tg9`5oA8nB+eFAJNwhiyi^kN#>p;+lO^SY-p%YnwQO~0*=WYOtmHkrX? zLK!8!M6=g)+1mrMzCu9?5Hxjvz{MIPZJwJq4%ySE2^5-@@Bs&ux3?XpS}*gynq(nB zbPT9izKB=@_N5&ta1{ZDiEBZx{F_U_eG{uZ?kg>M;v4KMx0Df9l?`}d?i{@RrV%6> z7%1s#7*!XyG6!=Qb4EOt3tI4IU?Qc7Kql|w3S|%+qwLMVzHb$&m;*3kGH!#Z00#>N z-zyRYX@|UYKt%Xit9ZdRbzCnB-7_b(;cAx;hjyQgdhbs@=xocE2f!Lj9<9@T zlK((^_q#L9%2a})G}C!`&^m$DzF_@p`Q#?#^SG;VpjJyQ%`L#7Q3|trrD-#t7+_XY z7|>R9s69v}PdrChE5S6HgeK7bIa}ifWkc@5iQ886lOt^qI#(r$c8Mo?-OYh$HwaT>*lP?;*#_^zrjUWtW`{euKa23VC5(A!P^UueRmHl0eT1% zbmNNo{hIrWZR&?G#!Eqadm) z^VF^gV2e3yX7kMfNEl<4$OWW%n6OSu;@ez};S2eiI`#df9df4kE)AE@!DGt`V7Gq6 z`H!K1{fOvI^;BQKT3vr&Uwg~i*6%m$fZ#!G^9yn-^~Mj~pM)gh;BCWp?l@BY==!Z! zLVZDmU)^uIa^xinknMOd_A6@MZ32U4$|U42ybU2|m*v53iyU_BJFoEKp9L}EPF+U6 zY}`~HuCPleQJgkfAFZu~UC`!xW+KmIa12>D=KN${3jG#E_*%**o3{h4^nlUGSi_nT zYi1+urRUuROz!+B>F2eF#j#BNMJD`SVnXBzPmilzPtHv$QfS--NoQd;M;IposZh_50yTuc{D zQ5u*CKY0r(bT{l(j2RhE@KptHZ`DK!CJLgJlwX=MIZ-+=VK~Dn{aNn{( zlgC}|(8?g9E#u{jg>VRBdo8+qfM}vwYqc3XF~9$$6DUbLNqxMlv=)O*U|hMyln;CF z+piqpMixVSpt8C$Z+j?g=Mu_l37z73H0n=wBd~Z;rH-^muJ`uy@CTq{nHYgm*G*CY3CPuu0L#kf#xK z2UjW$KE7xYpQ%3>*auqqa8EWxyuY8A+_`V;hb|ayF-3a#axFAI`_0);HAh~LLH@M2 zqzmu61mH;l>tC$ypnzSCZT*Ehn1s|^JmNl|^sC5N3XGF#f4w~1PHnVEHJKQinU{r@ zmySkV$K$SIC5uVBVu<&OOx0j*4bx)|)ncL~LaWY)y_%-%fSJ2A=h(X~{&!N+R1hPu zgEq=D!gDj;rjS1Ycf?%6*v*@Sr`ev9gv@`QRtjK-;TjBPbkf1yXAj!}MnQ;<$Tk>5 z5^|sU_R6$av*6nlz;^er6+g4+o=W^#pz9@Vn0Fg=7=Pq%C%fS_dB;RV7^7;(uO*Av zdH8B7lz24V3sk+f$;}eABO(7J=@!|0J$qybzft9r~fF_xkHnv*jhBeibq<2#19Cf~YjPuR*geWVQzE`8KhJ@)U@i0)f5hhwEK&`by!P~u0kU%0WXd-12 zKL6dZ_s%>45-YQ?ZcAy>8;9wO{LEO(mw2m7cAIxv>jSm6(506!W)&W0th8Lnq&Hsc z=E-!!x8E`I%)NpQB?rmdr@~Wb(+%?yO$-TFFqD(KZHZp+40cI~1j%$d`dRUk2&$h- ze07`qDUwVjVT|D_k&SI9`;*6fb{L}!B#r$p(Y|OQ@vxA2s_(&!Qe#h*Uy2|z4=r(L zN}91I90l!KNGeB{M zg`=sMha9SB$vGzBF|*Ke&4o1b^Qx*YrVHsLZ3-XdbIH-mF#zc z@n|2>tZ4T<>&k{b#B0dpb!_Jv^~&`n_J=#QCVh*4NxMzLk0Sz*jIHrVrdzy1xTv%~ zp@H(ZW@A&7=>1T#^|j_*D6dHdIr58elK>wJN)D;DRy9q8U4miQbWie)yFBLnLG0Iv zfcd)TY)>U0!Z%r*@h*!JBJ|#En05-rW3hgnB71PnY7-Z=lMrfrG_~&K%gNVM8O(6! zuUGI^cn_Y$6R2vxb&FE#oy|CmUJgnlAke{u|25m z#&(;2@Q^tIxkcKWCGZ6JWy`Db=NM(WWSh;;G1+Oc8Qs)w&o?z##j!|EydoS7o&C{f zPv4*}>z9*tW%KD81gYA3=`XGH40IKER)tcE=uJy~K@h81WIVV5Gy7P!kPV=S}_q&Z4Fv zuT&#r9ouZKTc_O6@n2$;`9f04yx8vs!>gwEaaNkCNA4dn6&4wLsgfNM-|56Re!xf8 zlsv0^h1-S6GHfz=Xk(bR>KH$d_Z^$8FQ7&6{XXXRTAE5+6!muu@xux^k)6q5gzZ-x z-9XH%>+}tJepM1aeIf4ICfy)CdRDK*s92ZCV~>8FY)H0Sd1U3Yq2MV)633RPd?IV?K8s7QLj~ z{59bkGa|g~HLia@GwdEl2Kuju6~*Fh_6!qb8wo6RyHpz}ww7tU*FudbJ z<^FksxhXxCjyCLlT>XcC7XM@k^QjLoCf4gX7(5oPZ(I4Woi;sk`q6&cO}Xt zecYkWprfYaWCGC~!pTU|Mb4{^!Ov@q#M2EnISci~<$Y+ZgJbm90DFba?D}2P$rdRW zmL&cZx4vV?jtOY6&Gf%EAMA%4>r(R!qvmyaC;c}659%s!>UX8%iJ{SWgjc?x%qSn+ zWk;wZ|0V_yvq_5T4XE?Rm*AUyzm>7=Am~uz^5Pm93u-x0vV=PA&XmgJL-MBvJ!d#C zyYZbQ_lar?4LVn_994=%+YH~foW8r{RkyXNYN>_1k2Q+tSD20Cu3}*mn}(q|ycE{k zu|%+H+^ydA7*=dxhUWWmEV0TMH$r!l|2=LXU2)(IVgz>+63Og7u3sETNxV$PM4S4d z%F6ze4hB<5PFjyK$I?^1Q1Yqi3m!SCJ=fIT@dLV2_OQ7-W3F-s7OmF z8k!X8U8P7>(ppyT@+@z*Lm17*3aIFysYKgDQt^ThhC)^w5iqcL@xEGWZIg zpqycU8F{%O^N?14SM-WWXQ+1BZ8|-|%Y8r32#v6v>IcPVF#Or9O2Pq46q7Nt@&mj1 z&F#0}acyvLqWS?t9m$oQ?sRp?FjvF9b9E*8eSKD-22a`S@x82J3OlFrAqqO6X6b4m z$8~!T)f-9wZd|@}iq~sJhbVniQ=lQo@}W@mIowlMSN@3 zTK9xautH$#;p~Dul!NE_e$G0z(3sM|U*qAk&)rnvQcnZHx)#5BV#To6GJ73EsUkrE zTWQ1ua(+0|fJNSbsQjSxt(sDw7C^I@>yS^eLxiz+Y}Vm(6R}RhJR-|OMR|#ovW|N& z(CI0>X6=qV}!uNDyTwG`3$tA4FbK< zeBOi6aq;`@*ip61wwZKN6?L(E9h5io=W}2eto(18(dQScnlU0SLvrwF&$cZ=;Sv2Vvw}B0 z>7@^!zY^fvZ$oJoo-%z8fg#{l`z?z>PD=gd10%h2Y~8&#FO5r$LxK()7(TO7`6xU1 zsIGj~P$PNOIAYRT5O(#thA2`!asEB z@Y=veh_fYF3`|3Exyx>k*ApD1AJc2(9ycBab}3*(o7dfz_ItZ7@U$Q0zMK2G1dk)> zQy*g}qYV(QYJK=Ns(H&i68GWp6!%z~k}XLjAiZ8#%tW)rXeDxdRFKxz1 z$9=T1YQ-KO*;tTc#twPF4{(X22P) zA)|?moYI4i#SoMaEkJo5!@gp@CYgWMAosphW1Dj{w9&3QTp^^IyMY{A79DOMmwA{K z&oWlRaTm9?+|X+QSE#-;b>Nb>41L7?y+u0lzKYV!5eSUMx`NW2#JFy8Fx|3@SmcgN$PlQJ9_{l-f)2E*6U*_cdy=leva_7%_I7XS`I1Ze2 zm1;rOFV|7J8_CQDuYYDk8xWF6S%tH7;F%t5uEtU3u46jq5-H_gEVw@gKB3{Lj(b*x z9$B-rI;O^~L*~a8xR0AByD~@Kiq1<+K}7i>l}HCf8i)6&=9I!-Y__of&#J{~fmP%C zIKLA>#`>v-G7kHu%tQp0E{~Hu-usOHmKcoWH6t6`poBdMQ&HRFg?LbS^+2+SrhLXV ze?FwOz;_h&fV8$xY2DB@^2qy`aXeNdWmOg{(Xei3*j7M+?7q%T|BRMBI36uu%P?3b3@&98wo8Il2^&wH3Z5JYS$&AoAy-SRL=;51p`Wrr)?{T`a zz`x-8?-)n;=hrH=pNAR5nD8xc#m$*_9Acf6mq|qeGf5ftXBX^7I=$Zvxk9*jI^FCi zp>cMp4+qp_*q%l0((|%M{_<^^|0G8036?=DkQ^_@g`T;}>WI zZ{JXgz&rn1mLp{kNqI{Nk- z47)E* zli!LT>%6Kallt)%B`L5=N((#QNv)r0=S6!m{gTT+%flZx5urYvyhreY)j+x_yfjcB zzL8-u!YUj&sN@4^o&D^W1))c*u#E78EpqIbNo3URe7_$oSbnaC-UNAMoCfcC+Otrf z`Jbx{NuG4Hs$5f1u2d_uelKToe$&EMDaDTG?N~CymaYyHkSKYq>Np+BJ%7s_;>`dZ zGk<7EV5jni7%Y(H1gGSQfr}>B{dvgha|zM4_GJhWh)HL8y{Z~;)#YlyRa3xbY#c(; zHgXxFxZpfFA%rcPZ`YZqdWJ$;C`FZ0sV{uvviuNu1~F{G{w$}VMwL>5hZdod5-4-n z8P=YX;^cmVTKDsC%`&>9+XA|xEipG+^#>&$utv(Z7wy+dGq&3pjdxR{EZZ+36}>bo z%9YW0f0!8=>mV34zh2)$uK1K?wXP{az&9tNV_5XQbvCfz+&d8E>8Oh`*VtC{v(F`Y zQ2C{{%W|@QRVx#a&(ou5Q{Kn{NvH8>w}5s3u|Iy*k=__9B}x%Nwmb1upLZ!gAKlBC zm%M&hgWVuA{Uq~*uX*`*i14tGtDQ_6r+5B=xoVXm>b=Ua)4OZL+(Q{&s{m8Y!3mL` z$U+%s>#^pFnlfBL3FJ5_MV&y+0=err{dsXQDsf`NkEqvEe)BD5(2KQ+lCbWN83Fei zENNp25?__lE7IcR*jC|5+c=Fw=GpMRwkg@pg6bRGvw~s!KukT*Hw?3RLDoV(xWQcA zK@B6V<6hr{!mAKVi|VbLaqMC|Fl5F?Vts(&xB7c_v3p!%8K}l-kHX?%vsn?3&b*RF za_q@8X^y8J9JxKN50eD0mZT-(d{+Xucv)k>JsIs48CS8(`#KVPv?Jm?lD|?WKbs&O3KYftPv9`T2R;-P zhcw4o{As9$lpxqb+MDNiO4D^-pZDIXxATnKtj5|1oE|$94S8^6`Dh9PQ?5 zD@}HvTL#X?ud|n-hUr>ET%;b2?eVL=2MzL5HP59#$KmlXX~i`}7v+j@(B~pW_vP-= z2Z82^7Vw}F$3H(oLR0w|z2pYw_hl~+l57FO7IS*-TpX8Ry^r6QX{{nrV(Lc$63od+LjPF0rEF9>fwuX|-2 z`!3}YwH~yN9~az1%k$RdCwYq@Wdl}biN!Q7+)4`K>Rs)Nu29k&l6K{5~tGG$|D9C&dVpFs;w z!D*l|jw5@#`j0{g&1}_RC(Ko$j1AA+(R&m7me^2lI^;3lIr(%)`c5Wp-Qk%Yl3Yn0 zluw@DMlC-bbs1%US7RlT{jpx!;BRS)A7o1?u*hxsR7;4iM_+3Vj{*6xmt)kQ^5hx$ z7IseOdwj#cK`~>!60&j&$I-n5*}c%hKRoPszP&t6j=e_XmwZ0A0X?R@jeRRfcXi@| zAPQHFla8)aZb|dTJVOj2gpQHHOe3Gi(I3Xaxl|+UxG40kWX#d|Xf8PC3NE+(^@q;- zHkt%aX#8is;@K(^P4q929Nt-Zj3N>0l9usX!EKZED%h!zq#oDV<5+$OJ-UrU8V_FA4`b=)53GF%9hpP{^vgN?&DG^hMc1}oIt8ERO>lU}DA@?pmd zAz(14xt$Kll3G&YPFVDZepE4avxVD*Yo1K=cWhO)In`0dV(c~3zDh{6a;Ve{llxZ$ zf$$-=2rDe{Ei{2Gz$?~T7SX7o^4&b2S;-80X|@)Mq?t>JYmm)&`y`$`eP*kPJ8>-2 zmmK%KLkjj*u#6J2LUyYwK8NrE*?90ssXNH^)ZT&Y9NL8Im51I(hUo)5N9X7{c3-D+ z7Ak3Y#x5zv>ha2EKhVSHWGe0N-q?X$u({*m;xXgshSrKKyK0WnQ{T zvCXl$Gn?0-=XC;*RmzB`pH%65f^j(oaC{ad{}TW6^y)X4*_v+uPZYTq+a2293mUXa zli#N;J3a15vs0NMtLD3LG#Y6}{{^ljVOJ-Dj9Z-e^bTlfF_(D9T7+*V)P8z;6x!pP zSR&;48kFX~KS7q!kvt}Roy#cEU|Y8!v5JmOkGX&}g`%8xLn^xpcO0xqQm!)@g>$3~ zN}*aHb|&$ba;RhmrFX{W3=PeWc*ofoPRAxsYatqP^;Y zoN?w-`tdx7fak1DWDvP3$odkQjs2Z5d)^h~yWAp}>lwg@gxl!#Ew4gW}q&#Jj_g_Wcl+^&+ zQT7TJxeSJ?RqK=Z-=Rv)QTE3#caSbvU1dls}Q$!2pSn;{%{zcO%xt^8?< zj<{sTwf5wW(I;dSh&a$S{B%LpzEqf#ReS)UJtxCl?FATor`m!JEF3$aO-&Q>P-6(x zvE#@K#ReZLh6JRx(5xc?w}!&K%4%;3L%;XBkH3a6ib5TG*^t<) zP;da~Y{z!=UT@A+xuq;=zb4_vGlZEivVCqQkNehn{F1?91)oh(M9) zGUxZ{O!g%u#XxRvdQY)o;ge3^gO55APsl=BE2QtQ`Tf3Yh}HOAGxGFrheFIlkggYa z9z-??R5&CbYPJ4$B=En2@bm~ev|h+%@CfUGD$zpjF|*~9J^2#OH%8Cke^+I_CxM0) zq6DRNro>)MS%O$oO%76e=KDQ+@`2=03**=R|Hi?_yHPRQUjs0re2t`vrVx8UeEwLhqVMvNGIX^CGz)YY>dS9P& zNZCS`)BNK_c3iQ9Bq?5vjQNhaF26K76Iy|ZpU!TPn+*e04m~bngINntl9rp1RZN{N zq<|=#(PD$7h94|8YD06bDj(Hj_GIDkm{R=_?M`X_OLJnAdW9_A=g1o-#%&tW5OEP$O!!kaGujXAXW# zN9!llRBBgH=)FLAU{}A6;jy@)iG_E19B2NL_UOH^8lLfVF?zQ$)&@t4lblm z{W^3Dvtxyov4X(tT9iBQv0V7}B{5qZ!hpTOTY_c|&lzh?F25#QD*VNG$)d1b0=^ zBQC)&*RgYonqrY^?o)3D+~|;I-w{C&hH@Qw4700x*$EXM;WGL<9dAW8{Q(9`VJ$lo z{sfqrHD~H7&oIN~o~_s__ZbB{mwU3}({8u&rPs$Su9N!WQz)3XhB_tNEf`BRWn@32 zE`s_6^)7~@U!aRwc#IkrSv%CpK)r}d^MTRA@ZTM!DU&q2scC$@t?_lFNPA-{Wk{D5 zOB|1@ci6c3l}?(0lhm88|26mk(g9dLB@Z~JKtk#UzL0Qnnq^<)BeNBW3JQ)gEWaI& zG{rEOLLg(JZ`NC}J1jUn;L83;c`Mh71}ce#M_lfjhustbvyQR8^f>4^LZzVOKCuDr zF*Q|0#~GeRqzB1Opd0y9nds0$<;gPx@@Xu>zz?s9N-?z*e7cwJ$|D9Er&&RA0_DP%7{QtJwiuGGD4GRs6#d&f{40sg)o0xH8XD{UhiH{L;!TFT;{0YyzU@35d`RpMKcHrl^qVMM< zbK`5Xldxi8wp+yDAGzE;r;s$VOK`slLnr(*AXkX7;gCpiy&d*WPVTYT>G zpV4EbGyx?LQ&rG(QMXUE7}(h*KP1#b&Pyipy`N?kv{uRsJnsVtyZ-7ez%7%-w|KC$ zFLL$?tIXBeg7pk<|M>U-pD}lej}Sa5_4f9OzT+G}HLC8;|NW77J=sS-_dDin3@XqZQI9Jdzlz5RZ^}eOlS0TT) zC}FW1(TnG^Nsts?U+p#?jS6BU44eyFrT^Cp(41qIB7t1s?n0kQy762hE|QQ!SpFC$ zLj(N*&TiXL1C$sZ^OcKbw%eVwcZgur7OxIqNpI z?zZ@#Y8?}lGp4GPhhM;Zo-0>*V@r_#X!bSHYfi}mGke3>H_ERtMYgM*3n_SuXX8w` zGjavJbH9~8+YsVYp+820QJLd{`a)vEA>6z)2(q&IcMDc(RO`~bG4y&5giQHyo)zqnXehRE_px@0BUHg_rVtqZ|d&6-XX{9_p*vCCF{ODTL0E96pIm1wh)sv$}$u z^mZ?8F)A1xVrVYrA+SO zOeJL00@jk+$+3E~#rI8@5vD^A@6QJIOeV{>YbSXy9u4l(RiTp0b_iXCvO}t6xDOdB zhB+0(Ads|xWO};z!JL}w90?R2Hp;h4eDDj zKWpZ-X~PiOuGy3KYN;G@?N`udIp^;{Gp5|)e!U@ODdE9F(L1v;-IS13{P(W<=oxQV zBa+nsIh(>7&ft=8XPJ}zdbZwWgA6q%RnMN*a;6o2c*1u9tS@X6?)F1Cg9!;|R*WHB z`&H(hqxW;Rl1GVmZ{10<4?1H0DvwBPsQc}Z0EqVf<%0YRw0>3R zs&Ed%xf@lGrTZaN^3_(%X)`dD5vruYXehZyYcvGIhx~J0<(-^6P=9xBh9|Nwb;Fk8 z{XWku&qLS^eC8wRUbRM(&VwfL0{IJt2XYjyt=U+y0CsWa^pZliJHOJ`RnksQh7d_aeG}ai>p4#3T$n6Uy3#cHJ zOT4GJ?gNf3jMOVHCj&^abRUAQdPtzanMZ+FV3$%$@5QZWchewHXm&sbX%>Kee0kC$ zy|UJS$U-TIIvd&XHjd}Y%rNDcT0{^k(An4i*+WYSS27vp zi-L8n^_-;|+o%BzJ}c6s54M{y#914P#_D}V#+0jEc1z}6kN8|A!%!c-E|Hl|H)e*X zjgW|RJRaT+>Fkq~3BKyxvf(zClux;e^P{7H-8(E}Lne~AnG4HdtF6Zrw+GxA@hW$$ zBSr;R#K&Z}^ByE2V&az&H+e31qcaojrVn$XcqfossB4s0NR>8EM|!%Vq`3rWm1a2`))3NV(7hze zIYUaGMI;|?&nY~ymc;a0O;5oSw}_A{sG0X_U&J*@9WJ)NZiT&!IzPq?KiMCKI2$tX z(mMBW?DO7XdR%&jM`)Yrtw-1~>YBUs`xKH-{;jlfq|VRzLYJ?TVh#LOI912Oe&ueF z+!0IJdlDsSsuv>noN|nJn^T8QdL)*h2=M zAmoe5*VHoS=X$rnm+UVM$91BrnTr-I7FK1Nj~lT!zMM=8*J z*M5_Us`W$L}B+hJ8vnjcLHp))(Pc=H&@!JLTtjG&aNSi=k{wyg%C)7@)2A z)xQpOB8idfG>6>8D3+x)X@9;JhLoP&JSS47eOWn2p-Mh{MSMkajA<}JW@JcF(tt#L z^UIqJa``i>NW1(}Z&FEVcG;)+Tu;}5=o7-D>V3Ldvh|HqcbXO1F;zlXwW$Ye?5^{@ zaeXVZGXLTB@$5%eX;$RR5YO;6q}ERE2QRw*HZ?P@{v4`=bOSh|Cqnu&tqroM#N-^kDjydCzNaHGQuSZzaIluX|0fUtdChYttmA_|wMr{y$Ju;f< zA1y~odIxp<0`j9see26+&cQ-h)%B`&Mc4UJ8!3LRU^#h_8hgy zsOFZiCb{%aξnN3z7+*@@Ml$nZm4aixwe=1*c__kIgdHu^v9C{=;EA4K)Nss1de zGWc~rLc?iHcls%iojSsqrpKbk5E|Lm%x1n3n}?*>7FVAG&@c;ioDu9yRXvY)rb@H^ zB1h}+(d5yf-}n1;5Zb#FGNk|?yCrT$Iv_4DI%3DIO+ z9|AP(M>nM`y2_9L9?V)q!T1Cf+y7Ys9onJvb_Eo~eELOzyMmvClaLr8$IW#v+hRLV zs1J_I-hd2M3`ETRsQ!%rFv^GDZp4%GghIi^YNz_= zUV!O8E=i22<<1DfbRf)SJg>d`_K54FRh~=g=S%{Rq7H6B>=rIYr!o70gVwZgI}-}& zsO^i;h&bAkMO}bZ5FV!5ix`aQS-m~}L4~6OLlyBWD?rml*d&}0h;2SJ69CmF-~%|3 zVJ^*D{2z_uyy%#?aQfX$|IiBVS41sN>E9GuFgf;vG&|pFY(&TGCKN^z4TDY;;!hO8 zVN@4!FQN5-j@=x=(l9^h7DrHXg29=i8D%Y@`7AuKSphZI;E2CVs=aCmCX5s`<@HE_ zEJ4)a%v!@xH!?paX{J{TX3PB~UoZ(|^1{x_n4!*dG-=0-Nt87L#)9*_Hw46co!8)m z^Uo>Qy5E^gKLZZIU3SM)j3kvLDlXeK#`V$3tlurSi#2=*<=Bu{sjd)Nzc6#z9-B4& zn{ZW9hjDu)vXib*u6VHH#DYAc201o1Xmy2P5{@Kh{^9*8e+=1TRDk8&7|J1TMs-v! z`XFaZ2kRj$TXr+jQN35@WOt5mAdQPLi!tF|E0y6As2FV5Yp0)xkgbwVID56X{l``< zQqYqY7K!AZ>!jU&ZSXvzCqVbjwZFsV^JkPAhVLZ3MebcWr{6;HKYEv_BMG#u+IsO11bLu67C7^@jq^vcd^ z;pY3jT&!bVxHzIM8O48m*O1YkY(q;L{J9=6E}hs;s0m8yNtTqSCHWd2wjKFSzB*8$ zwP5OiLn77zQq8)Qf!f4qNQFt=Oamn7$@a{4qjWq)Z+#u;m?afD{?To9*jEv2L#QS- zxkvFcNyWKlGv*>9L|m!>`l|{4q@3M9tSawjwq*h6VlayW6|BIw&ep*Cl1#uLI-1BU z>$7RP{T1^k8XWIOmNJ+(QLeyFEAk#>7YuNQOsySZh)Ie*~d{nO!>f=6|i|j ze}%d01Gjk18^UVzl&5^6K#PLbJ>1FmD(yPk_a8Ma3)852s6MFpadMG5sJ72!`EdwL z)P)|R4ryZEN3b|^mJ!Mm6(AWc+AVPLuNV!QP!gkqzH^)+D~^}XM>>r6_vZYN#}`8& zNpjZ6<{)z^O9@Hix@gQ6Q3`XAM-P^VPx@Wk+u`j*#nRkhQ-T#+cLG##yzG`@(|Yk@ zm2rA*wjS|4ja!iNKt5d7e|zaLwph?0xxWRu>Jod4oPv%c=?wgalSHi<{xyaLf|l1K zkW^J?UNr6$)M$%f+>3L7dzu*=89nS@Z1*ij1?olcf`yk3FI6%IxF~o9*gag;L{Ov0 z#B`wnW4Yy9nVsa@RNb0Q4=qqz5K%X^8;p-3IxYt{=AeVm_2B9IPxL6@@5KbIs~zL< zCl1%2JM?8#p*v_;U>Lnrpz)ZAODwv56mLL&!hBu?2@;H@yKnwjvT2f$gPn2jal84* z|HOxi#4Y$)U9YJ=r~&A_d!@qZdK1I%Ueo??g!viGEdS#j{ta=kkZeRzB(tE$|6bJ) zi#x>NW}N<9MT$Jz+ao|{9%*O4uqNEKc?9WYx}GkVi)VsOgiD>)&00 zmznrd4}UT_8@Hm#)W?MYCJn(xl?sJHn7h&fo<1bUi66Vkp{~X_@JJeq1(0&5kd**} zC&d+Fdbxd_43560d2SRGIRl>Cmv!AumdjN=T94GiEc!$(IiX{r%opungaL@NZa2lx z3xg#CFb4Ytr!q!-2$|sEGsW?T;`xa{Pk8w`1IX?<9#A6%nbHp>D>=CW+Xs|p%7X%8-*MW8|R&uBSC3#KABDw^4bLtWdIi}sL zBZ6V~j%ByAzG(nv4(O-p<$PcWo{B!f+^WmWI`6^O^ZjNOM~Y4|?_<00yH$TkQgqF#8-B8Unq=kqT>$wIIQ3WKA+MVs)$ zV%jyy=AL@mbISqhXbIpYZL`6+#EMm>eEv`Y$J>!aie;Uxk_ z040eN+YDw}r^KlEs_CYfp1CfnTij-r6ispys6C}Umje`1G@hVIBke~t!?{<*QM zR5fHsbW}_&f0yCg>MtNc&Y9_0c9A4+zAI67IO!efIjyA#QQ3Kj6;y--JEH74r~U+7 z0fny-v=NBC^BriZyJsLE<@vJd%|FHce?=leVv$Jm6?eD{cvFPWJ)^&~bNM3V)%&ZQ zSux~%6S?8{1Wiaj*SdV_B#5zuB@13WqVLm~;{p2gJ|xTt@<>pfQxg3U=sbd6rh?{Uziq#UQCg>^;i-6O4 zTmvXPoaf6kw{a0g;whyIAn(3<8HF-3O4*OjmWIXEXrMDvv1gi1jJ^U`dojS;bw+V9 z_6B0EPZyQA0>?{n&g`&uiSLw!u>Kc%UX3C3QmJy`JlcI~*0tCT7bD||uTaeN_y?2ogUPy|5QKii+G z|N5Z6$?KM9(7s^hbUzdjI@T#_CDOzK=XIUmb=w5AryMM)2N(VO%p^P%Fo{wCT55!# zYU|m-_7Nytd|)Y@Pclwy-Kle*?g+n&|884k(4QTl!OmX9{olSs9QF!U z2%Y%KsIm4Juk0M-rW^I%5#b$QRkDRGmxofdhqnDj6S&iqi954?bC$eiE4p7d-S75a z^UpHoWySRBFtNffA-6Y!KGy&5)qwmwgyu-jGr}!rJ9k0U>xI>Dk@;B^IQo%1<`RA< zOnG{Ay;pe;$69J59dcf8HUm_Bx)((MA4MNV5@Mi(@L_mL*U?zgQ9#L3Xad~xix#tL z)4omf(*9Tf#o_vw$$bdGsW9r2l)+Sgdo-U@^k_NfNHYIA`TfURr2H27dqa{M3kQaF zw?AJdk~ehKZq{=GIBhP;J=?!;v1ju4Eow*5ADW*&&ypp_+St@tWL`?*028Yl7dU44 z8aiRvVj)&ve!ZM+=F;MTC)fo6W7-v_t3(UD`pcN=qSh)|n# zQ?SE)`B_q10^N9psT@V)BwyE}_bMUe*l*)X{9>1oaWTIpU;QgT}jKj$ogIkNcQ zl(#)^8H*3o+>|H3aM3o`XTX6B#=xV*Ut;OsBfp%-nc#kxi}>orG=y4<+pZn!`uPzZ z>#p3%V9&mx?sxCsEIl;%`+nd4-|xq0O9O$uZ2l8v~+`A&tES37}ZsEzfc>SC$9#Q(>taVHbcLJuIOn8a&5e2qutH z*xY@NGHfl#98Vo91_owshT8mI2Sv5t#jDj~=}~0dlM7-PjYCBYzX#y8Qmo$Z4=M~I zZf$@&#Az-DM#%mJSWEUk48f(Ksw!S5Lp*5xAFP|g`|#Ht|3E~16 z($O2whJ6$K7PdE`Jd88nnbyE?CZFY?>O*TO)P;tunm9z=)*?jj9*VRC1ufIMTFJi) zg;^WS6ZO@ZYm}uZ!%A}SwQfxk*V?QPo=4VT%3l?MOiFAqg11zo)--O~7g&+kWOS_q z2r<$vx&Gl6o)b4}gHPos!g(Gl+^P5dw^TS2asJPp)7-8gT#o=kc)g83C5y;>%tC)39lsE`rj$;wxRt0`EeSU zFVTPSTG9~k#J6?RDibb+dX{58{rzZF;zz4e-uV$8(ShqOi~s9$lah#L-tDrh=v<2& zalHl}e)IqIaSF%`O}^dYQu}J` zadHmzKLlWS8PRjN)^|*sga72-Tl4;(xyM0?=6>cu-^f`n)RfbU-nqB^nZ`pEYYsb- zmS!SLK)}*(b7s=hgcnUCS5AB%^rw9KfBhv6M3-t_|5?GX740^V`3J;IAl^e75f^LU zhA48o(vkQJ3NpS3=gHAWb2{PoXq%I4U+AaKsNPFs0k@=#&oVn-k@sFqk=D+WSRO4GcCz&kZNCAC zt>}-@Z|?wqG-_%2&ytf_|2i_&|J#xA!q|}8Jv93cGp6#*YSda6O_3O53$!sw{(8b! zzuwN@GJSy#gUPP<8~9}?3z`zLpsJ0Mw~Wlnl9RtVO4W!;;9>%4&2n8AM^|D9rv+kZb7+$ZqAT{9eMjOw5NtyP{e3jD>G(4a;b-XiCC z3|e>E@j^Ud?D}nzn#i_dz(Ic#SVzAkdPeyYJsC;RL-7hOy02B>ituvOBh(M{I(F3YfG zO%R^n4y$r<^Ro$l_8gkGvnu8*6q@$U(}oA6&|EbNYlyri1c)h2W)dbhTHQm4M z+FwIla8K6MlURteCinl?t--AQ-IXnfyK=cS%d=yU?|!xgdQFI_%c8M)Gop*RL)?xa z*!G@OVWJSb7-0E~zy;f+%(dz_ND%X2C>)4DuMZmRS^)SGr%{;EeUXs{vAF0AeoKkt zdOgS!>$~35V)FoLKaIEA9ZMh(Bo zFYEF(!0)&Kz+r=q_k!xjX^3|zIS%ED0f?LQu$hiM*gH5lXA1EqAWb4CI{8u^pk&Y? zwj?yL`QQgl+|MF3D%s*I4uJKJhqPPY2O;51+D}YdKJnVg_;fU&IV=LQCGB-#7=V=F5gqfww~n@yx}Qk9vFxn;Sv4v$;M01HUncG$ z*8H&(K&=5B?|I)bHbAVC)pctIYIB!g?PYx&Z=_>8V3q+iPMj z1CO&~0YX`QlD8?k4*Yd(-?8=5__D|B zp1*DC#_xCHTrw51%cB*6)k+_VqjPM3M(B>t|DKJEKBN7lRJ(8a6T42&Tyd3k94r(!QnUh{tq-3zz6U8Vk_Ht6mi z6$$Lm>RwE#cV6%hhyB$=)rI2I`rro!KN^esihL7uH~VtTD<*N2O;0g5uN3v56*q$iE~T9PBs>t$C*vT`!O9V`c1sDrj-`} zL@VP*^-Hax<=iBOF9+)4l^#(f*sT}vZf1|*I|e-Ren(l`A=@ryTS;sLV!!=en#(NU&GzVNLZ!S#j8`(qS7|pV&m3<#bsaC z3zejUYL4o>U&2GY8&`rNlo_1od#fB4M;ZgG|2K=Kg zcuf%dx)5h|4&3I~!%;5D{$BPf*n(dA*1QD=sYxfz!^{{OdkXlO2M-7%bsLTXpYjw> zk{-)i3Eh7ub?vojoy>V;j&j%wR8-92daX%Cs#EYEHu$;l==Zi~`S0HfxK6`<3GOfJ zDpqb;!z7G6dT?y<N1nc3^GD3ST+9#2ZInMv~Ru@Kh>s*c~~0)ywWHxK{Z+w8k%8KmNEr zc4JfXa4_Y%m*#uePO(GvnAB432d|l{<6N=>FS)}ybE;3ecyycQZ!}+ARh$uhe~>71 zpqqVF>f)=%Zw9KUqH8YkmhRvKb+^)Q>^+@T2 zfcoY<`>oV&aZ&5Hj&^H=SJ=E_ap)(ZIWlaij9U_A@NW9)o8Xp_mEQp^bFyE_t*E{7CEN(E(H!(uBZ+r)pCWU z90u>CFhrk82J9yB`NKbw2O)A!6-vrpMZYE+^v{l0TnJV4O=}F??A{!8U5IVHZhyQq zV6^hI)B*9f!m-T#@jp1JIWbj`QT&O8MU$jTmB>z|xOA6zWkCR19Lk;-xWqXCJO9E3 z1lK~(?ef9#R`RmeWXD5eUa-CrEV;CzyfXWqU#E=km;;wh_x2|)=?ofsy$IJRTX(Nt zrEr=0sZv+Fwkq|jxV6e@$UX3Mpl5Ti=xxyu#>qkb^g{&sotMJgDN)jyXNM_$+&rCh zO1^G8x{SYwRQgy^z2DS4A07z!$tlrmzeO@_jBe$IerxtJOEul}Xt-rGpW(XrQ`;my z`;YJ^m5d=+f9gc4YO023XTGZ?rbBtM?UQ>Mb3Cr2-PNOx;8nU^z? z67-b>SKgiUAcYEgB0BQ=_9TCwHTypFLM#Q`5Usg7<(gHmogpGNr1aI8+httiwMmmr zMg6;oqveV>MwNb{fiBaU6L0TV>YhEtm%0L7wCI!V{8XYZkf}5qYEiHXP|a1eeQ;>k z5VG@yjOB0yh=!F2bAv*g9$47Ng{8@lyXj^Q<6oMj?*A&4`tv@q=rD;->fL?YiCX`} z=}%kDRcoL07e*OWE)O$}|8)KR&Qjs+-3$6({3}T?CkbI&pY)4|vdk7X-rQTL!b)V^ zq&$-r%ym`DePWU83*We{iQ(k5XM^rjc^yY_3;0*vApIo?%iJXz`mBYcmy^o8nQ7u; z=WPQFC$GBXP|&V+Y|Lkf8Lj4J4UaTp+2PR1{n|& z!&xSa+l}f*s9&G)DLFZ16M6Hfk3FzwPoG`_O9x)=t#scx zzHv4Sxplx5pFUg`C{5pJbvhtqelqaU2j$sQrQzaH@il3AalE|w=@!6~M6sxbj3Y0) zPrVyxX-5A$VHXbb9%ML_nsMnU z&z@bZZ?N1~=GK(EKOr?w9GT>WOO?An#8{jLQ?e@?#*j?<`$y8G68@oeNLVHE$r<>^ zo3zU(is&M@i8li|zb$d%A$FVgfnk5#_U|3?P{7dPfo8{+MTRfMjfy;;*B}$`>z=4n zG@jI#1%#!1m`}IS@0)o$a~A=Jcy6xWFj{gY7mZdP7_j0D7ulorOYjhA|-f}S|?^}U&t-|^hus>f|e zDI=U?QEsrMDyodP+4`tyf5HNOhT~6xAp5Okr{HZZv#()?+exxtw7yE5$=cZnsoQIl z;bPn+$v3ny)!TPUb}lcgpIUgZOy%7?TqfPwKnjt_A_qy1_S(MJVHaV`Kxru?=R%+ z6H(SOS^J?6%>0+1$$L8nOdK~4$vd^Ke|u$%SBp{R>3|V@tJzDwj6f%$v8X~hEn>^GI8R4d$O;AwGgbR|o2 zWRGuOQ`uFDAb6rnTjsj!w#bWeRPw`OHiGn@#_e;-9(y`UxKC1b^?zd@OhFl*5V%H2 znc-(gn!G${*CC|{<8map*@G4tZv|EMSm6?@Ax;~FZ7!6BKYr1KCSh? zG5UD)!y63`m8#I_KP^If7VBp(aUIrgvxic{s5!XalojGn`G!dOUaN_sJY!Zo(q0?g zUeGBsEQW<}t0L0t7q3QW?7aSXCtTz8dAp9sVzVzkhU6)0Y-mT3iJX^lzxHu3N<=t0Y4nOOY+V=6Jzw^#K4_lC z=3Pkm%G=6sdp(7p30~O&$6dR>3Bjl0Ud#QF08<&&u+I#Cw8B4eZGe=C9D5Gk-EU3^ zSdmd$8ZZpkSfXz9+x@@z`pUQ}zhG-pTDnWR5s;P=Jb)lwhwhRRk?xK|N(m?}-AFe` zcQ+{AEgg6JzwiC}e)A{BIs2Js_ROrcW^v9arLbExI6jG?3krm^&04GPPhdF@CQDuA zDg5$ehl}TQ{$MNq8Ols9^ZAhW7LOf|E6HK@jp>tUuToF}dZ}MGT8k&GOsO!fp~-_B zA*3=XAS%@g3AU&4qYDA1{#rG$;p4B5iM>?fzR@LoAJCK+Y}U*Y1~RY%pE4Xyr6k}C zTD>utP(sBc<|zcd$qqwe-j)*$J02}K!*dfd&`D(hYIh8q>ygp<&))-A#P%zASzB86 zs~sJ$EI%5Z(w^R4QHy`ve?;7H9ik!F_``=r)O8-~C9X;pYs9U36i=*Mj{-f(u^de& z0c%0==w*%m6i0~--d&&4Nykt{0RxQzNs(tOE>du;-l_LyuG&bgf~+C$4VUpXtpo7m zWUeg2yyK0y8#7oNeAF)dIE@@7%HJ?+|NPk(+K0g5L_8W&Ebsf%c0n3>0&Fiw*q-^@ zUa=Z*gC0)HseX$~#Hn3_y69@x(Mc+gd(D7DXp@Y4gDhaLUtWYRYB7O&u+oN+?x`3~ z0ZYAgSgp~ZgB~obAcKhP5*i(p{UXQ`56QH#9oMZx=T%@4OI$-3RUx@Vb7x~tv6lZ@rgMzLKF9s)|bWy zB^5{wz!8XG_g_tmW@11omRnvAfIa$>S)$RDT?w0m+}ZNPpY1nF5UhjD6NNt$7`Jtw zZQw%m3NGl_&En$!HeDG7E}D5go)O-V3B&FK*jx_OHG+@CoylscgoE}M>;C)x<*U_N zU=fVnBpHKlZD-emC&V#+B|hJ1zV?u|E^Bt$hDI{01|Iga_NmFx2*o9)PJ3P?bwD%sK$h}ly{?qlfkg|jpf~IrD&eJY_(dRwP ztNH4K#*ImXl*1UId2z-ssy;%&f*wt~|NzJm(0EM(}GSi+g+#};8BW^w7{^xP0 zen_ym)AZ(<3DJ)?XXYwsjetOq)H-EV*9w6Vg`(J>N~giK%8C>#K#8FBdBn*J+{WJUG{}i ztC*)oMGU)75`}-?{!zye@|^IoqSK zI_Mgh-)0d)7HW zKaZegDJ;)}lsU1z2M*~#LFyn433e;e@QHmF{=rQ`x1wO*7Cfh4+oKtAV%{O*3C`>R zUqq}wl}fq`m6tte_c1tT|Eh?v49?7af#i)L*@=YatRGM$ZpocgqPzAV{$UqCj0*YVod7ybkI&$b>sn?3HHr%dFlZF)^vD1k5BBVVNy z1a{?^1nD!qjC@A*(aA{)Sj_+a{Tl~Mle{Hq=kPEJ6mT8W(|jHrOK`;xx1u;lT3VSE z`p9OoL}!+p4t{&5x(?sG-B4>j)k!ZwHJ?=+w9yz+*kG}xRmmp&&lGxB zEE8^%tsC|e3HD4h`qRf<`1n)5toH1FcCJ)%+71(5aX4YlRb?X;nOA0DY$g!^K@`$_ zPJRH7Mzr}ZmI`$d5tvp6!C)9)=-<&Un;BENJw1wok#H2)cds)y5Lx}rbfxLz(xQ}K z_r!BP4L=q9Oj>0#-^aQHDXj6;u_$)}G+a}LzOaoO=_0rs#)<+si0?6Bg`67MZZXQX zQKX^*U={pa{8TzV4+1!MZ>Q8lOz9vxsK-`OU7~p4SXm>I{ zbXDb&OCI~;Xqg;?_!-mNWR5c`Wp&s>G=atkNH-OvroetxoO^BUYP6h8A-e1XL|6($ zpi<=llc>=OxU0vTuU?AmGe9v%rOv#av1P%DY`+PB46YdFlq&{6avc15+y8}6Hkv~; z)%$oO6>LRya@wCCP91V&YIIa8A^J5WD|MefB)M5 z|9tV-_r_Bg1rxv~rpttJz^7P=* z=K7{J_$f{4`s|d=$Lq;|wJpk0?XBhGHuVdOlCNROFF5fSl>7*4-^KAe$<0~3qa3Fh zUK2(m8a7FzwarC>;kxMmY*zmF4PDTPI6Qr$TEP#aT9GH<@Grqt!`Lk3!3FA7Q9%|x_2PIhvaH7zr5b1liYPgR6=CGUN)7r63%fZyacD0 z^|?t;gfV9I1V^LjKY5WDrk7Srn^n|3C$@?6=ff_vEkgT!{M&EY|%E#eIHn@CvBw zwFwQ_X;QI2IoZUVA0IH>$~3@#>MZzoS*omC3c=hxz}t1cBw$yXWTc|2v^(=sWIDTY zDq?`OQ;kEeCfok5)Xt$0IyIw~w|G1-z9?9COm;wFXKb25hW6!`fWGNpv-#eujMJrU z2C9_{NEWMNpBiIRx-@^3aqXxW>LR;!EUWjYNiJEPECK9hkF#g3R|c77@{pD&7L+Pm z>~G{eIM&}k(KQ4Hn!n^FD?5s+6G+!@ijZ7ql)l*m!Tc$i+)@&p`?{-8vAf&9&pMYM zro#e&PtmKZ{l`2V-dYe`_YOsnLQUSG1`wxQK2Z@WZC>b|aZv`>xEF}pXJ$dpCW9yu zSr50nU6yW!K0#1N(`>yQ+AvE>CRRO%6QLu0pGX*rL*~cnX4M+2j}9`+Na}3q%buh+ zY+G-Wnn|<=O2{`AiN+sMH)qw6W56=7jPE`&v-O>UmRniBQBEqiK#js0I2WO|h zI&#KDTWPwlSN>@}zyRO~A5%7+zYrV?_z0uh>Sl9$QuYu)O@p7O4wXlj2PIP?0;S)Mr<_%GaBPnm0cSu-X8rpTn~ne9nW%5KWHM2ptt|XRGOKbvCj~ z5s*EgPh=*aW4dKYq{P17BkRmjr?goNT<7asiSYxrwD>z zqKT2W79@+Gq!R@3=l{}19fJp-EWq&^&tp2KG+=pon(C1nTK`@(BB)H6&=SSBYd4Q;SA{9~m2|#W!>izn9ME%dd);`kI|@)#eB&?OvE&2yKOr9*e&? zZtn<-r!S1A+bM4XiS_))yBPY8>~{_^yd!=8Qhpz~(eGVw<`seP%perh*jU-L)M2Wn zR@c=abN}%!DJMNL^hOxPvQ%mGp~-?KC{&{qKt*Z~DF%dzrMEQR62fDJ zl%%T-LV2m`eK&DeS}tV*4HAF6&PAc!fG>wHlTGEManLXr8BU5fL#ZH7xo^2(3Lk+cHX6 z09%31`*a8Tk_o7$tf`rvKu=Em-kC8Uk+cQ#bPc#jx}#Kh`i_3|8hsy=+tQfoTpX&q zW_f`#y_h(YU1#lLeC^cUG}@;<)xnFEpt*bCPj1;9$7StBN>p0Cy@8DB`}lavK*6e& zI8uRw?RLBhgR-cRbFk|KKrn=4|8Piw`%Q#?HD=`B30Aop20#w4t^jqj-g%#hO56ui zTwL7i_5ux9^>qRZ_n*|i-g+`dp5wy5=_x!Sdu8#SUN#mEaCRku=TjUoeBBUx4h zq2!GbY0=)b-+Hp(MA&UJAY!**-&v?ntdgr^Ket&meTf&pd)0AFS35KpT7?B0II)bM zPwXS_tgsp#wj9gUBBWO|{Qr&FAfoG zKYtrRz=DK%ceU!d(?4zgz}rHClT1JA6Q-OR6k2v^)JjX%B*8r z#_eL1S@T9>JAY#F(d-+DU3PVmD~%Tz^5Iv>y;d7JYzo0H7pK+rf4`vr!ZRfb36hh^JhJLZ%4{pu|-ZqBIo#P`@i*{ivpdSj@8QFcgA zOV}Q=7uv1AnGi!2P_C@sZ7=BChCz~c__@rg5SS1&>m)jW$wo(Sa zTp0vp!~?G28VWTO81N0~1|A|BTWZ{s!1>_w!JJC7G#^$XB~qxZ`Z&AJPt+)K0ivhY z&%1cHmxr(%nHb4@&WHcw0z~)%PeIaGmLqSQ-A-d^0=Lq(_NI%+fhFqrOD--Pz~z|O zrt4&stm>T0#}P2>R@nK2pb+U(zu8QQ zb|tWFAmG#!?6jGg4Tdc{wDbSq8`!9sCgqZ=C@9zG8g>MYNAt_()uD7za%6M@9A%Z- zf~$7G(pD}~X91qT^m|Mw;2c$!?5ExZBD5I~ySWk+eIpP5(m(c2U!d#hQ0CjBFX1rC ztRzM8T%&>g&qw(X+a%*L>GM`&Ce6;Q#TXl_x$uo0qILf+j?_LbE7<&SEQU&F)?m2- z^(I>a@RHNF|AsaU&)yS`j{*h;$b_E%OsmF@yJ5r#x8?&0Xs;}WBRMxq8Q(Yggb_iTm2cHi211 zQeqewe(wGh8hRsbPIGR?{VU47x}d;}vows~uH6J|r|Aa1cSjWC))y|{S^T>_TdBEh z&I#cO2e+!H(f*xP9i8zPM9_V>>jJ}RW-8?b7CKl8$^LH;!ut1A`_skAD(^wMVYV08 z%VnxHlrU=7GJE-T9>m-EM&0OYs77Z!vv!@|JiBS@zK6Pl?u_k0V#wZ>|MH;7cz0>I zJ#qia_zdD5`3xkbLn`O+mc#pxOm7Tib9gbwD+OfUhQX*;G#zWri~7=#zX#jTODMQa zHp1EzbxUQXl`Fq;8B3nPI2T7V#N+7S;laZLho3NDrnUy$W@vg?3|pI(QGg;%j` zM@M-oS6d7hh*=cfSlG7)+_h5wYIBB<1c}>jFx$)ojp*s~t7C1io$P|v95cENdSAES zi**kFW}d*u-JIYU6fp#Kjncoqk)+IRED6C~P`qTNWA zj_looU?C`NN4C&`>MuJG_G_*2S|9$v!xJ5U9?!O%a!pxoibVIoO+AGX(NMxKf*Hqn z<{L!#OM;yOXx~*KZ?nhWA~+*T;m+oZ>jhjWCSWX;k8W=9mAts*a%WtM z;B6+>!E3M_O@#!wrlNHk1jvPW$B=OU(-z>(+EiI~gy)7J|+a5`G2m0XI#{n3#s)Ty5ftB4giJR>+$)39M&Px8*cw zhR!MA3_WmZs;R^F&TSA$KzTD04H<3*WB7~n!Q_|Rz;y^1S}i3F*HisIMtt;n)nfpj z%~DIu-n{Ee(P#TXn%P#c36G28knc@(g^!ftt$eJB#gXGuJ#@waLB^@q>)Y67pX5-$ z;Bd}q4DrhQ$hha1kaCZ1o9(LzLe8wl$F;=sg4q(HBCWFUe}lT&m~_Dau|UtY!zO_u zAC9!2Jvg(tVdMfw)K2Hs<9T-b+#e=Ty&mu1HD|2wBi>$-1*K}(><@pR+@ z{bGu%*URmkMGP4!+oNg1BW*Sobj7pbXn%and_j%A2PEYoWXGC4RHCZEi>$}E=sbFIAHZAmd85$ZAkwv{VE?gB`E75yQnx#JZD{ zh78SA7)v#KUMUv96IS$5K%=9hB^CPhV%dqRfoc<;2rPJ_>-?gP*)uyUfCSA&h(oq4 z;H2lu6}2@mFfb7dfOHCKqB0B?v zx@xw+$f7e;BYXaB@OdiDOrhGY z+{xl^Jbd#dAv~^BqHo|B$)6=Y|5pWk$NZU;{s94|lpz{?_0UxBvQ>*}$5_FxEG#gQKj=5bqJ~icZFA=^s~SBE zWj)zQS+|;L#eLpDjbEYCvdNZ$L8)AcWJAo%oOE!E=SW;8m#KQsZngd+@$Ve-rh_QcDv0w=m%=M7CR;BF&qpu5qPj5IP68yn6J>Wfl1g;tm&p|M#t7#MW zx&KuM3R@-@+h1X)<>tpe1SKOB5p@OIP<2-{rzaH^Swh+@>b9SNO@jD$Z@LQ@2*z@o zO49@9$RHLqJYZ#bSC|^wreV@O_2FX2uwg1cjr6{18)w*VzMv zYwJMQCRr$3Aeomq94l#E?9 zv43E3sOfTZkT@%#1nkL?t0YM}l+&;R@DYz_y>K0ifOGp?v5bJDm|69EFsZy=Z9V(b z4J?p%uRYuW$2x=y9l3a;@e7x;h0~^!h9j7lIpq^qw9)DCqCkOeb!(r4 z_wF79*S^HBWe5hrT!BTq@RnT?a0FI9t@>t#oQf7f@cOl&@0O4lB1bzAQ`!D_(FyPDsRy z>xgPU9?p-&5lr~47jg1O)89^p43AeT5SKukFaa9b)h;IW=kB0TStR|uInuDrH%GR? ztMB_O>}O5Sd&4JtE4&U>^&?ILX(4eyr}BU>HrS z7&XVpSJhT&5zR3iRTD;`#h*+fYrlvIBT(?xx;7Hw%V zco-{cC4;MixqC~+Z6|WW#^yprMzc%~%S}W=4}4u8>Im z6T7gW;BT-DQudo*rC$zc3W?V%{SaW~TrzZRW@l(#&`X>b6ZVqtSc$X~f^iZCWIGiV z{311K(PV%-Ad`CP{V`AgBl+bn#3S3H8j~I=+!YL&`9N+1TenyF<`tO-ykCg$2~-r^ zkI^fT5SMd0bpGr&?RpUULOC?~59B{aXbsrzQeQ~Ur0yh;JPqStaYe;8Bl-MRv|x4L zjXGcFyZc9uAK(Jlc}+@ijb+o*l%u@4B%8o47$DVx%bwomMx;$y1xwBl@kYv!5o4_& z#;y3uAH~t?`xJ64?qhTj>-d$|TSUzJF)a7pmp?}>ufOtouzriM=o&z_(U6mMPU8{G z!$p6CY;o3-R_BnZ6Br>_d&SF>SJ$`Uy&gNUt*bSW|L7Ly@%^SgL3=F{ zy|$h&VG9+birPa7{j!&H`1&*19kzRxcd_utAu1l*^`n;FzNEI+3ghm8INbD+t9hH; zK?5unHTqzuW%TRQbEXmf`fz!zV^rlvtC?8TDDU54#H_Qs(WLRW*_O$_S-WrT2Q`~= z^y|ivXHmca@79c^LmPUF`vwh6T*0j_%hdGA@2)J%&2&x zyIDuQqE2GgLuXN+1fwUCY$1-T4J;UgmwCP@9h#hH%0^(yxRH!rkAxtQ0()#;(wB+e*~ zrmwV#ml(YrFA*KX$n|kT2%czL$uKff$S&y2QR29R=D_3WkLVe}s6W+Q$#SQ`fz+^yy(iDVuaJDdIy4K|(uwPP&P)3of z_t1=1GplkDKfAP!`cdp+vhb~@-nkbA`FyiIcU)8%=!}0Ji#>B~rbZL|Ixj}a?;swO zaz2~m*(*(p=`nt0_mO;7K2pk0$YKJ|>y{#{k#Eps;v$i?!tHOPz%ABywDR-WIB^G; zNYVvlhKQ|>c?<#Gg&Yb7WOmJRJp`(>zzkc~u`0K?B|BLi`j!ayq3eTr^zamKy zHwOti$9xWhQcnwy*)Aw~D0>wR@b*6_=QsO#?HN_dH$B^#auO+s{(Lx(U@lM89#lA3 z`RRM;*K(J?6JG@fARE^?1KdhwC8)QTSWTByGQm8-++Ic~bLJJeH`a{r_5IC@U1_x^ z-hLcNfn4(m`$J5Z5l~Ulh*HG4vK8QA>S$y+&bt$kAP38lZ=^OeCAh3_L+ouPBkh{_ z`HQZ`8GEx42naWmhbjw-lZT7jYK>IjBh*>(miWrQ4Q~)NZV%BN{PjRuB$z4CVtiFK z$2hYf9fGBbrchrXk}!5_GOuz>_1mYSkK_+6^#=6c1^e0MY`FSrj{BHvfS)-M>c}fj zFpWeML-9I@UthQVZh~&g#sI%Gtp>jV?I!b!M6Aa5Cn9u(ik$@~IFPkuVia4rZ2n;C zi8{-}2?szxOHy^RS-gF+oQPeYNMzn8G7yc4-?<_wL0{ifo+MlZqOq~MW1mO9 zqE95u`z#jS+5aLA{NE8XEy4jV)WG5KYG9(B zw#}1E#;ZuZ@M4Qj%EJ}&?Bw0z(o>dcDy&wp~{J{v#!8_jD{i{4$NkVe1(f%$# zF5pc-L-?d-*gjhlTjbVZXvYsVI&Ma(AT&0n$b)Dv_o@fum|Jeu_Uycz8jF4sUZ=8% zC|&H|D}nh|EA_03-&zBbC_^zMq|SS7#}sHcG0y; zi2_lKL~FFp_n?)z>v^G-pN7I)NLVO`iNVa8BVSRFmN8uF3N=!}SKe57uTffX?LGYX zTF`U<#|Ls=4dL0JGCXbB*5CEyhstHK0d<3H`{0kWq1$0Y#2Vid+g4tG6<~82Zy(te z)vfi`NvGhMbALF2=E|ny^(s+I0ft@o-4JBw_=&1a^jQ%BES-v}ayt{{=xzz$9ao6T ziGt@>iaWaYPxG7RXQqj%iq6JP?zx-B-!~g+J76L}o z`?PgN$(lszG#x%`y39YR-Q+=dRf>Nbt<>8JcRE|+E#JeRNc8t5`34_;I;^6C+M++DUH99TK+qoFU zedJL5Hpi?lLS3ZA;(za6RV?X;a$(QV={c`zUPKSKq185-E#8%gwy`(M8Ol-2MCV!w zzK*NgtQR~@e&iwAEER{OA0z~M)UXOUC^;x`fCLGKJI43QhYvE4B4iU-@3kAGo-y871>td;QDE@U!RJPiz`Ov=4_wn+2M*j|P2gDKAoU%h4D{&{Q5zC&~}PTe05@hKTA{%z^7 zx~+t)N3U*1wcE``oZa9g570a1_3SpUhk*Q6C8PL-XEQUtM7e0*<0wzqFA{PeMC2V- zTX2KTQHdPfmb-hEI)csDdZP3y%aUUrPELB%c=w2_xN_}ZTYg>n?~2LeDf;0D@lh0V z-b-K(=Q%F-iSjQ0^Wp>@V5mnLX zEw;}|D=pTke(rElEWZ{ut=08S3{XLfzic?-{DfY_MuhhFS@hSazk@wFj)8Ktt0v2N zWs;S$V|^4M6y-LdA=i%&D4>xD;4O>~oX$Z*n?6*j(^89uvfOpR0l^QkBIb6&bP7#S_ zCx;fi7Q9|;O!%_w`nA-+cZyeZ{t7G!EGg9KO~euVQynIWjhu77*O7jaK~b1*GQ?cJ zgL(FidqPfX77D>!Hioi#5}0h0+Sfm4WCQfq%sv_g{n7$<&$Uzxx2>y;0hwjWp(bdJ zRS(V$apHYMJd;xNMW_>{-pi(tKk)Ly<;-GDpdq<%@;$uPzt+2gv{pq+*LAC78Q~HK zbf;Oi)C9yYl&yc+R+!ta3RYt|R2#8+?P7KdI%d-2l*bzIs(~qVxZCL(aAy5|-04-& z(N$fUHW>UUb<)f?+eC z8({d6sa0+OI$v^D^#V8_X|sXiovD8f`Eo6^qA%7wgcHANx?G>iiO7y1tNqS(=*^E$ zkdu>Br@8GS2A5=r&IpA8=VRG(qF1@{SiO=XwD*njch8`WA3{k2jpFut^dMy6SBz0E z9gPZiZ_~R=Z5Uw`Aq##G1Kq6mH21d;7|CTz{#Or7th!ZO#Y~Uhecn_vwo5QzO@-#> zX7YrWJEEsuz?~A~_>lBK>q{?{ctfCGh_3&_;W>EritQ4|@{8lOi_ErjpCn4?Y?3f{ z_>5RTnN|08uNULKG(Y768@uOmGACp(SuD$>`AO03<^`TL2p@`8%so7t$g3dINKedW zUoZfp&DwOHQ6F!a5$S=F9}pi&Cx=SY9*J*r+!FA!`7c)=8!7(Y!~P}r!{)*bEsFK= zcbi|0`2yPdAhiG-YeH#5dKkO8(u7vuUq9j(_Z;8^%TCPg8X6be?Y%!oXQkJ&gZf`` zyhbz1D!*Kdqqg^O&)KXH4kKj?X$>J$uF-3EVkL!WB<8i1buY-}K* zprEK1siXanOO%Wv<3qAtsxU^h82J_saG`a8yuJwXI{EGI78M)23-R*yRw>otgC`S8 zs;+*;Z?_QC-Y#)^djKfSf{rHKAx%w9^&ztvBJLBmmpa_MJXfHG8n$n8=9yz}UxOt( z7_BQqBs!gBv>qxY7?9lV!|X|>1O#_K{Z2058S`eJv0KUCE8mb)H!!l|?Mf>|$lZ&z zYhL8RU2Fc|!OVLJzD_>=Ek3hE3nCR7sBV*WIVzTBXJVnjH|~DI(3tP|eoD(!&NSI}N}KSZQ~0_U}M99PF$(-nNdN@o5CpIfuz zj!97MU6?Yy)~!OJJ@0-Gsu@vIl$Ro1S+EY|wro?ivzI#AkN#jctF(;3*QHbi zhBnaYe)LVAD=JAaE092a&a<`S9a}=LG?V%1{B4Vu4ddCHF{uI?0O7jOE`VXy} zOmC-m^%y8WKLfbio-^BfdoFo+*yjTPMEu^}MI#!`UEq>WV$X&%2XswjBX+gC$P@AD zFnq@MII-N;6S*W{#hBZ7WW(naf-e%H*bR2KwipeVGD}o{praGA27$$4Fg;jMGI-`O z>i&wRlp%df*x=%wDFgVC1w0Ymdc+kq!pVI%`JDMrT$*-VYjqUWA91Yas!_?WP>ic` z!(*AVoZp6EpQn!c8{*)cXa{M9+9T!1P>B;G>wZp2Hf{BIcuqR;<4q*Vf=0fH!Pj0T z!x!#Vzbc~3b%WOynV9HgY7}mV+;dA~%cZ#hyN*ThX1PYIA%ObsbpL9;vg#l zxDh`ksDaqDxy@gP5FM4!&$j2v54~lp#YHN%0D#V9y>9b(YThs2Trw5tjVJ~VNKYBF2ZNwRK3hzrk z_X@xf5%?vq{XWAc$#l0Lu?>+k==B#Q*q=sOm$07yNIe3E{gr*nRz(3*Y^bVqg2B2Q1#oU*8^X8y*hXra^O`^`(o&UB4L4-HB81v9F5ertA7@Sn2!p z`1Q4G+4vP;*-i=xX2EzMNL;OMJE1vgBf+|83pmAMAI+#eus*A3xLG7_;v!0i?+vln ze&J{nRXhRZSE%|$F^WLL>X0xRQL&;IgE z2{~;I2|8^>Dsy>wdYXbwAhc5rfc5~b`H*-Gz(X;wYh|w^8VO8vbUbWLz_N+KrWSkQ zaxk}cbpmkLI7S6BZYqtKtr=PmaV}oyh4)`{ed(BPAR|)eEH$h|*uo?&5kMur{>%1- zh|T|X(^4FF>9AoPr+%w4}I<@QE5=VQtx<7rC4f!mGANQboX965Kdix^hbXnM4y=cE-eXg zA$dz5VrRbozh8~j@nscDhN6&w+krf~;Fzxwo0JF0)kJTW@%+cl^^}Ht!AqN3$7o2|3MV2 zD}wds02en(%{y}Fx0a8LN1`V^k>S;jVCE;dITYpQxNc1$2iD;nx%BNjEY87SIn@LN0uaWGnjaeEp@P;$Asfyx(8NW{GF$Dn-Hm zz0^x6#ADt$Lpph}_CdcRd$q}xWV{CBS&akJR@?ar&DoR#2`6;P`(98l|9$tN{%hp- z%~#jl=$iw<@yVQ7l6TQ=zFP_PS9*=k7~SVv8t8Mo=25tmpjHm^P&CL-1P}F}{zZ-V zFCb$kwVY;kWLGUzz~!(M6Iq{!{V?#gC804%X|82n`+6Hgivw1qwgXlRm_y(TZRLG2 zj5`9j>)YquPs6CCI_h~{sUJ%nI^$M|2_4co$ z2P%Y%sRC6Dx@XZu$L_0bFx>Uf&f{U5sZwof0f*K0u}3;%&|IXs+WwkIgq;YTRJ+AE zLHIW`v_e}iye?FR-nE>s!sUpyul?f^d|LbX?e!;?w+x4avz*3* z(NQGaA0y}T=P@i_l>V=HJy)KbtOrX|dysm8+jlkj!~9tLDpb7~Eal;M*@Zgu}Er zGi||Fg7$=wo|kV!yoc4k^f&cO#?H1y#4Jh#s;Gqd3@Sm;nNo}nCGcx^h9aFdDm2?S#%HjwKD zSd4Itx2P#`E5mKDYHu8vSAC8B_+~keZ>-so?Zh(Za^5^_ zsS8eCg`G8x1PAAZdXS5YFDnF%gw(rZVC)ZHNV8gltOo6y>CX96onU(8hW(uiY|=19*EmBFT!s1~*ROMIof)0?F7lFO%o9~HLzJOY`B>ivGeZV@ z?C1AajL{~{b|#;9m*MfH-%D?zYh(pAjC>VDIbLb&+IiPi>DaAFzyih8*h`Wbp=eO9 zv^D=HpiC||_=OvT@3wb`R4Oche`!`bO53TP#%mj$u7CUXvpa6%5l~zRHXWnuJTJ%3 z+JAD1V@&+w;R`4P)JBdQLB?*EOIm(hwbX!OeO10%REXwTaAGr8^}K%e`@(0)!@>x& z9w)Vj^I@Qf;tiL350apnOZy3Y4!79_T*-Vrx@kyssCUnM65cBD1zrcHOV|sYNq1w^ zVvluF7VQ#V;hMt;Lvi1=+tU4iO23f5)Zt`_Hnf&;B}F**elhTU8uV-DZ^{CD*J6#`fsXH{{ZC0(3+5_$68oV^<1gxf8?V)jGd`Gj0Jv&7$h{> z3Osss*e#9v`eUPg$O9kt!hi{Cx3<~^B$kXPSx(;Ge-&GDj7BeoE-|kkPo@onXF<+ zoi2!euTg9&+k1(?|2*RrvCzRQ;|Lq-`p68wZrxh+uiLRSbd6Dzq4o-7Id(0L2<)FC zxjB~|5AKnNR_oCo4f1iBro01;9FJl<=6*Vei}^kT9KNyypwXy7i{#3)k&o631S1-( z#`kLs*C(fRB3mOJOMl6^JeNJ{M^l2Y9^q*TZda(V+2^YWbGAl%kKCQ&1m8$%Fkcv# zR~H;kNVSjJy149ceWG8ODTTowE_5~;8PkV31RHSZWO`0A%9@p~Hol060gSNow4lPY zmmS%K$FV<0zy7QFzOD$|Fa7a{bR#&oTSXK>Aj7#VOG4}~c{0EnDy!>Pd54(l?=JRd zN9oVlCMj(3oJ5Iu$^CnOPlnz!){ zJj^E9_HB6fkCRhVKR7WYe@vQl>}x-fhOSuU(eeU1I zIYxRGT^+cc9(k9Vz4bTv>7n$f1~trc0+>n$P1byx>`*$t^t|&g{hUr=d_g0XeFD0? z_Q5`)D1TOcAJK@}S48$XrjqMg9MGVLyN-BG*hp+<(;c)LiTZb+f8Cm=sT4@yp88bL z_XmASGCI8sMxo88Gd7uR{r(YXrr~M%zC$|YABXCr(r_6gXPt9UiE^@?9c}OkC!rS< zJ@v$6S$kK3IUM9!L%*}0ojT>TKE$>QizP*(KYw}5^(jI5gypcWieXLcO@*7&wu_lu z^7G?+#E#XoEzHxA;sdaU%1UjOOy`2w3z-+zK9cjjD_&VP!tByZuL$gl`vf_CT}cg?#^o!l?s18)`n zj2Itg{+nQ0E+&B3dj*7nV$@r3M1+IIME%U4iXLxoFkmQl($h0Pa_+~HOZ1R5*fe^7 zw{{rjCb(SW=A$}rYSzCEqa}GiY;fUHG3HZNg4_}>PJd-TLco-oL+BXB$OKHt!p;}@)sN|)RmIBNXHvIv%i13 z3rM>F`0(HpyV1j_zO%ac0^{hFJNjk1Aj>DbD(<>Jz3mcSH)KKgBT<=t-NK?Coj?FT z9_miY#Hk%2v_Bh|m^+y#7k*(qQP7^P0agG^G0m+w&6ek=7xSOIcBf#GOHl3T&uH_Z z@$r`wtTU$kMnNH20+8F9fh63lX*I2~&RWt*l`3<#I8#uGR93u8L5RP5#?=Wth`>O$Vk%*l+3E*4FD*+%7ITT@Om zWLdmyH<&PU_S)gZwEWloS_wF&qE0C4TNQSGhbg&@cV=qsCSQKN<2DLnE6Zr0JL71* z^b8I#KSS*{S*2-F&XrKPI3T-69$#HG+%PudY$>qK%Y;T!3J?KFMX*|b$ylg~r6?c&#;#)QwUZE9#%d3>?Ko_zz{GZKEaQ>Yc9m387}sUqSR6jR%2dNC-Fo zc{;{3M?o$b;RV-RtO2Y;f__>9=SsbB#jYVn+2$K z(FNE;n~jM%wNm%e>rW4lrMFGjY1f7)zSB=sOHTq%Oe@L{a`#U*3-{6gL)TkCMH#hi zqk^DxGk|p0ASopcL$}1xFr)$^AkvN0ASpkVhCWdrjL_cx&J(N7)2Ek=66bx=I|+EWr^%v!9=T z9mLR{9bXuye~4z{wwODjmbRmN{-c=)XnBlQ!R{Y<{pDB4dlU+bR3XPisVWci)C)ZA z@u^s-(GSVoW-vqf=RO9<6#nMf6t#FhBPh2ZXP>M^{qbvScN?NZZrlm|o#67X57n1= zvP6lGt2!u^u9nP(?qt0X4BVl}8~Tm~p{h2I2DLb#8FGEiIQr?ylkQkbGcIfzytbdV zv_w056ligr)bGWEOtB>b6sCF)B8%Y!_|OA7Nysa?(|GC8W|PMPDr~NLBdA8FDUY{Y z`k3U!30+;i#3+aTdxravV_m0_(E@H)oJ&&qq&5YDSy)5OA94qzk&jD;c zn>joQ>W-)p7)Zy)k4V-@LAbAF*5}vYAsbsyPgN>+q?I!9BRPaA{JIv}8XKRorstym zhJ@B=WEsT`>#qMd$wCNDoges-g2p=&CNB7$OX0;jdZmggTiMe1|CJGWF1<%eSy9@) zCH_o=VP_G!O!Y994oMJ9#7p7#<11{&WA6hsZ)hrIb3A>NkNcAK?2I5tS{~e&kEizn zzLnrc0H33f>@B4{$p0e}Jw^!~xQuPiChIz#6z#~D)Gai`iUm>2IN+w9X#sq)sg3tfZW`H%@cR+zF~aJ(>`Qk++g6VH}l$N zT(Os690y`1`jquxf7ndQY^BGx-pMFSrhS*7#9?cqmL3Et+*`M>N`T`gQ?Q}hrysvo zw>5Y@g+)SvJjQ@XOdV%UkNPJfb&pVj(3zqqI@uEbc+$;Bq`Dbs&$pw8#?@B&@<>Ua zi|fku#WFS8Au}N}Ih!@p6&dclO=wT8%MK5lX1b~{{6`S=EWJm>43?H*-sEF};^jJt zC*2yy&mNI5p8`MuA}KYWW_;MI!nBbH`vB6N4HE{?s`oWXAt|vc3L6gyd6&`URQden zs{A=EcmN=Z{{+>C5Cq0%;B6@u+)hTtzeRJ7v8>}LZlG*bGSbqHk%5k@37V8LkJ5vD7O?qe{+1T8y?2!JV+Cuo7MWH0l&+AvR z0&MU?`ghM4m0N6Bl_u>(BQc4crnSF_8$JKXlY*`NR@W(#_Q~JVwJ!g$4p8^_2(=1r zQoO%BkkcaWciqa?zKy4Vn0nt1}+NFZey0d}nV=o^a*{H$3# z@ih|lJ`rwxoEjh3c_VSVA(EYT<&WV8P~{%~gSi(#mjKcDFqu9d1%lnWt>J_!YrQpN zkxEZ`%OLcqoE~Z+dm^^Z1SE-aA8Y-mVl1@W6gd5B_Y~LUa9-s{w5oZ(c@(sVRP4D_ zp>~GpCjaSBm&zS`02*qHgvpR`s?&WO@0I;xb%#3=PR?@HcC0vdaK8U*?n!qX>60&f zM*M4yuV}XG8(7ISZkESer~(rOUO&P!9&^KK;P4t>yc32WafM9td+ zXt41iaeMIA(d;ivIfpWPKYT>H{py<-sUJXjPH`0^)_Cha*H3Q9{9fKf5{QaM)38Qz z^^gIJdXy_k7(>oRl81(FLA-HWHuX6FS;p@GktF!YbE75E(CqC}~d7p|3 zZx5t0EN8vjT%W=Jk`bg(mmc}PnF8Bi&)K*?er)tVLK`1djB7xyA#59x>1eGeKq+C#q z$kQ)Uhc|f?;XK*_G`u^$nzLU=o&hf77eKibc=1b)PBw@RkYC9UB_t$3GL?9Jya<`j z8GL<7E%u!5OhN?}Wh>@9MF0e_U~+PI%+1YffadruX>h2^ms2Y<;Tq%+uxV} z^DRg4*+dD+w_@pl;cwrFfF!Uy;1SmVeg=@Uu^CDigo9>V>x+%2jfG6R%YVQVIt+7foF#<*zDGyrujb~o<`43OSOYR{5nQ|%S;X-;FUrtXa zLSzB{7t(?5u>dTxp5u<}pLJjtXZyr$^^ffy=NerZ4-o`%<_3m;(BEqj+5$ZV-wF#Z-(R4Q`7> zJXkbD+gn?4V2*5WuCMkE4!$m-k?vRjye7&FHRM_WDK-yG*9&iNs_9SZKU#ecm28S` zd3@8jx4R$)-~sRwjRDUTV+~O7UW3Fo{#oCtw6t{R=pR0_25Ufw5P$J2WPsu8H$Z*G zp%kv3Z}H|o^M6N@^x**T9hN%ikca30{^bK5^shaIYAI#$gp0*(SkXXeit^W6PtXg> zJY*bjZSng0eoWG3Nlkyu3UFaqC9SkwUl0deF+?|_>QaiGg@BMl zxLcAQXEXskZfiDn{VVI^>Y-|Cy%E|q$>Yn|k;^~>n8~$hmREL!s>78P3_XGSy>!P@ zy8+gP9dDfbKJwAi5mb;&`+h3Xf|k$Io%FT@ha3>8#v zbj8?2b<_W=@cPJW@qk=4O%w%wnZkbT73LEI=riY*EvokW`FPNAGWH{J*SR{(KGKh* z>-(oafUEpP1R4>F6%62t6nk!iqutdaTXgJC6ejSfh7dwMOFg z0h(G@SC=9e{YcJZPV42-JVlrlL^>W{w)ITc z>5yQSN%N)wZ>+?krGcwQ;WbO=D&U*FZUasQxy`hJnvlW8WVx{dih9AER5~@OiRy(m zI0!a;4;z7k(BTYcEs#lp)&7)x+L*@hL9+L1Lp^VadsX)d=NG3P>m;4$R;@nF3bE8_ z2fH0N&;Hi0k7-c>?Iv_BF>!dX7?#gi&nA`vmZHHDq=C0u*jnV>WvslsJPQ?B>b+iTH)Pv zV#Ckht^0q`^|?90c^)bmdD8Uhm9*uI@V> z%#IBhRZnI5V;kSKXKe+yP8!f$Q)iR1hd-LuL9@tu3fK9AJ`k8SLQ0uSx*si>&v68AH^ zvSUG;S06Pqx}!u~XH0u7Z^cd9s%`LDXqF^)xEeSBbGe{lg*snznc=)Z*Jq)f{Gz z(V&0kVngX-hW2)sXHzAH^`erWHzR?d8i8$VM*P166eGiePptA)S;h~%|G`TF&*eEJiTKCcl!B4EB67pzD=XctWX}4o%3RQ+gZS1cKBu2o@0Dx z;&KwJN^CxF#LKCvsinZ6Nb7wHo_ptRYYr=2s_i|Aj%bE8Z#%{{c&q0hA|N9W#MM1Q zdnxs0q$eWf5~{UV5^(atB2O`Ia=QqT1hW^nZ1PxDs)AuEK}wjNR{jtMUAMj3&V)a< z;yhcS+wgpf*D|%qJZd8Vtn-UBnpdgTV+3Nu*_uH2EBn=;K*IqQ-_72;ydqH`b&X7vMf#~T1wGyqfUv1Z;CAs|M^#tzSwd?jd-0XLJ0 z5)DaW95o3{e4&>syL&s|0bec%$r}&xl|g$2#g_%H;HG4$4@%+UUKVOeQuRF;JKT<1h>^+p zUtIrUTbvS8KtXbn#JvnNfr_5R1OrY0-l74xktbfuie8o~>i}iyxNj1vCvjQPFJLR9 zWNZpQc@bn3^f6XYkL8M@Hoq;7ghh_xw99+f;I-8bAc6&at99g;SQCaI2u^J z0A>M@iu?N#a{fB&MYPW0jJPq_DiLK`i+pu;R*TD713nvNFt02eY8w3k1a=;Nn-VsB zg?tWlos7O(^R=y)62*oJ?IOv(UjFL5OR|G<1HuzP&K5@4gXeAF$Ni>S_#I*S&i)Yj z42jc0j4LRsMo1>>_~DA-@||PEs5SUP&JVw+`$wc~bsY|E&O}Y_oGE3Jye(5=pGcEc zA@KhlCF6z8mxS9zl2l(GpEWU;8K$5U7gxeVdrflqC9Q5D{~Msp zb|PHyVyXi}S#i~vV3PpA2=sp3oaJTWVTZ|=Vd4<{_2*C{rr*#!ehzS0Ff#8VQga~; z$;pPxnr{~yfUDOn@ewa<*PZD72%UsSv_Jt6U5Jg?RoCWdSDp;ZKVYv|p(3?Z#2MkI zlJW#z8u|BUl37xJ{<#cQ_jMl(4HlMO5ej4uNKBv^0Ss)3uj}Mz+YxmIxoPJ&!845) zNbL{dd{@utMxs%Ju&t=*Gpa^4NBtF)uClC$lL|6FqbqXM)EB z^j?TY#xaDposP#GB`aj183!_5Tz*)J}FOye+&eu z?vHJ<4sHM{+i9KDB#L8x#-45^P7~S7|26Xq%VP0dq~Y*cU0fyTZiD$x@V5YMMpL*D zc&XG~Lb!Z1%Hy{@&)$rX%nwmE3=v@!g}uS#Ok@T^-b7tm073bB`-mpRQ`kf-_#=)2 z$n7aG#H);U?~z1?3X4QuTL;U$0phu+nk14*5-oaYQZa=qsuegzm`s z4HN`oJr!gRx!bd{Xdj3;G091WGLCpUIceInD3(%Bb=RT?;$tyGH}1aYU!XeIjrwgw zfI_@ikfB?;dUv=NG?aVy+D3*|^u2H-oK%}9Z}hUs_L>z_d%@Ayjgw$CQzS>rYo;{e zP_+dpMziZPUsk@xrq)`8KHJ2{h14Iv{e98qd%^&O(v)ZKy(Z<=uE5b!t?@Ytqq?n` zRRtfdFh|BSMAwP_6>vT<7x~|LznZy^DW}~mJFTaG<6M$OGh8(zj+Y3zvO92MjkrP% z?0ND5X&m0@!jR0a5wBM8L$}5K5y&jzsJ@1sv zZ?}z=i3?W7Rl>x@6|0Z^c8QoJ{{vSE1tmoh503>-8`a;oC~XBb%m}QrT(`X*67o+i zP2Q&qKivWZYW#PHGQ2smwptt=K58Wgn#K3=9|k8AW=(TTG&(3o$K4<*=;i~J+i#xw z)Vy0-2sl!kvPm*5J z!Os;FBEi_0_@u;hvm&outwZbi>kpxcq0rF6PFhD*rfl8Ft3P{dpMm<1(93n*V>)f=@bzw5>pH@};ZUJI z>S$U!qa`iz!XdzKpDeW%|4ra#>P{#`&+M3(8ZNdKjgN`%R_9KCLP8_qQAm~n?r0>K zM;J{X9qQI`WhD5eJ`uB=_=W?Z-4dhDcJuz-6a@EPNyqfkHK|;eiUmD3ZBc8;Ig(Bq z`)p95!?TaQJnzcj@=Nm!hBKd;+gmvAhOqUvVLmwwv;I z&JKOYyQ?Rhu`Okfcyuzme6GH15=OA#eL7@1+>_VVN9==U$j=_ieXwQ7wXF^RGYS5fL-22p?R z%#VofiQ4W(tFbgcay;d7dp>>WoY26x7Kf|q$15k5E&BQDHHvQ(pg}ULNsZHZpYGj1 z3Dk+D@oLeuRbtm;9d*gY zmmUv~Du&*l7KpeV#7TY6D|InPX&tP5D-Y@|G5A~&cWqrkme!Yc=`uv6FVdL4HPdFn z*U2CpWRRcW9q?D8)U2hQEQX6DWropXaKj=29rI^Hr1Ie;kFoKUoD`>aZsLLcwKUBX z13aoBH}Qxjpinz&;N-{JgfllJCwBht8$GBbeNz!_A-wKrkDXQujrbJpBd?Al2mRKP zi*nqED%Hoo_U9^PH!M@JdLkQebevZh#Fe}@=9$3YAMK2F({tE(-C1yP?W;Li{NDd; zykXa7}IK5}{ZjOCf#QwLH&-&hSsM1Y&mKS~-%2xJu?!5XeV6<^|Pd!pHyO>_PXuc*8;6 z`3BeWg_nxY6m$`#%nR16-^nyA+?QyoR3b;k<`;DO-_{Pb(R|154{frEjDc+lM-9nt zN!*PImA0zEq7lN%@XLfpaLIRON4%I&*GG_gSxX5v%<21WGep}%DJRoJoM{@OF*M!@ zI@TyXxR`JnJY{}TGeTJSN&yu;1U^0m&Qq5V!i@NQdKq#uvg8tYcXkhV@IJnss1ivx zi%=MI&l@NSvPcpOO}}MpXI549I9%rgT{dIY=5=iUuuU`!`l#EPK9*wy)yuJ_@ih)M z5e3}~3Ay7Xown;XQzIXv*80$9howcprc-(S%$n_5$baJXv~qx~O^|bS^**tiJORl( z?kR!Rv*#O4Vov%OymLZ2OZYwUhJNL%=SEx<$h8MW>+`28y<;63lMbtFwxb2Rpsvup z)U4&adYHf%h_kx;hhIMQW{3G6YUY!#bN!F=^?lX@gYtg|r#<1x65k7kq<;ke8V!01 zuSRKJ{C37QY28PyQSsj>`gP17$}+#X{$-o`^UR@R`mOHJJI;>QfBHJUrJiCpr*^UgYXe6L!@0lH^W%VEdG-n;=ctc9y=-;_|y6GrUF&(j8?)HVBW14u4q+ z1fSKdGKK4s zBNKzy?=RHk^KBJJN*|DLrk%^{GIweEd&b$9&+w8Zlg}bES3>)ghR$N!1{3L{Dwxcp zhS0<}0mGHWu?fbKrA8%5bKYZpaWFfAu*WON25(v+ZDuQ`YqEJ;L7B6{Zk7nVHHL^s z+N0m`(#CCLxIVQp4Wl^e(<1V%Em@rLY3$Sa6H`n%@+uLef$}F%J8nE7JLcDkIce}7 zmQTU}>Rg@XT3{W|qCq`)UB5~G{#E5^_je(Pt3-_PZbOb?u4t|>>`&6FhH;PU^aqs- zump!(TN$2u;xfkmIwocuU`s=l*neZO6}Y~)m9990cjtmpfrX`3cYcW8gZ3-^DTfrb z>R`j`itg+9M%i|F1iUvJy~%~AE#12icV^9wYASX7$Qcy*tBb?#?PF6WYW_vMBKS*+ z4|h+GGio??s?>I+Buyp;?01`4Jv^*R3|y>lY?NcRQPjEE5fwm~u7I~`Mkdg3lwZS(PqehQ_VWtvX&^t2s80W}(mNjd zw|d{C$uDE*^2CuHQZJq)_(oKnf|pw*o-r+>w&RJv!gKstc1z0>KAJ^J4>`QlepdU< zjd#q?yUh#WB4K5|8-;L@5jdQgEEdKam%J>f50(5D?>#3Mg4j=j$8}Ih%80fKf;Nlg z$%3Yx`Z|3wP_rp@U_GArpyFu!y_oUIrdjdtB@^l2zX*AXa0fbo8xi`K3doe+p@rRY|Ss@md9R(ICk&qk*jnHiT&$*(L%O^Lb)v895*ViM)sWqUVR&bTt z!TX4jWlR5EHMV#kR8B{b`r7U#NB?f@nS$QqZgihCgju7eI*;R&WCo*@!Z!-!`r}wW z&iy6H+AZgIKNyg>e}wJmELoQr*KNBJqB$*-f6(;^`Sy7XIkt*2&y##5@emM1;o!y) zd+q%TcdoI(TBDZH?7UB#uF+?%1YxNPXN#!oX2|n-qrnAX9!c_w4+Fa~u$Ky%Y1eyt zPv|pqQxYtO*orJGE5=?!a)6||)H?acb!_~UThB#0%Be?>G~=+Jj2kXlz0#LES#@Wd z6j{=!l55Q7xhCfu{N+VVD?R(0_m#Y!?Pg49WLly}y?R-=$z1&o(+#bdf;}%Wy?{B- z#6xz)i(sbe*0ZvT#X2L)zdvC{4^3Hf17wVTp1!K~W)tF3ADDzPYphip3}%u02W-X< zAI#_CuMX;Tq-D=~s{Ps7E;3n$jJG)_+(e@f>NWb`=YO{n7o&$!xGl z*m!l~+H>6fOUM0^S-H_#nQTIO$DyVhy1tYgNh_MaUvz0S$$WQ+Oi-pJ0XzWvA zoxntO*N~{;KQ(D*p@r&KBh$f*8mW?#fxhV*p@qr!OD7&3$X!MGFI(NnF-Vp19~b&7SpYmoBtsQ$SOCt1isl1=0DuC6BAMVqt$!ucFepAU|y=Qg-g5 z^ZgU52mO1y%&z@?G``A*o^{b$K$E(9ZhTnrYz{`U*t{gVS+MjjT@+e>qiKD&c3&5L zgAYViDA_H@P1(>epNMp4S!OE}?t^tj2M-mynJFOEC%NE8j0oECvv}S|+}HSsa%1fV z3lL>aJ1cXBO+On8cZjV}od_4(=sW0KWKJQui{%J%Oq23>eb2)+zY4)9?4Sw?%t1H| ztu`taea+p+%GsK(M`8;4vlgod6N$~R+*HlK;berJ;QTMRhyyZRFMeU$o>=DP*zhRFYs z@*|Cg#x_X(J(Rg5%Tk)%;J?N%y}0AzqwFdt*~x;6J&k8Cn1-70|F8uwU?$7_EFfmq zP4=U!=Kb?6H??lzDLcrh>RkGIF0T;+w=gU@3;y0!N5bn@w$ef~A78VqWMR+NYsA)TIfT#zR{Bj0yE!e8!^7K6*am+vkY#FZAawNn}p)g?!+e zTQktiRDEfo(J?nYqBgW70f`ClIlR#DYVjlX-x&0b#5A#I*bEA|G%+MGiD{rnU~J;( z#HjE+Eo?Ocu7GT=FeP*FX6K}+4>GlYntHWnQ=X=D=R*_`VPlgf$o)TuDG~Wo_vzZh z!~N^J{Ib!;C^vrj!;^vYB(zem zYTsq$c(XTafAYl`^CJg-3Zw&L-dnT^DqSe({VTECl`Q_hmNT%*bIf0a^rB&O$;sxO z7_{QLcQh_)-dX7CCQ25<9(OY}U7$oD2vYxLU;QTc$C@0K4EfD2<+>ARy3poRO%x3J z42uj;+1Q@%*=%eB4vg;=>xprly~D4UegP!mLoR8-xIRnQvFpI2ZtB3Fx@lH?zSzvm zUWS$RSeIPI+vx&VEw@u;qps9tiHngKoDM>YtGXX3kVH0zGg)Bo`LF-aNdb~3L>Su4 z=uft;{HT@uPNDArkx-_oV#hP*$GCx(hxQpjEt+3?3^z_5cHCUGZH%O(NpViv#KJyj z;@$j>lST;US+@pkX1^@?G5|o4X{^q_Iu7K+zb`%#=5P|uO_S`_o$#GE zXx^6=A5Hg1kqNogwn{d)-G5>|z0F)xHh8GtcAB-cy6HUP+B$`ag#datd?_7om1~1u z`PI$cA1oz$_;;^HX**P#ID}9#>JB>JQ@oaPnpCa_q3_SdK}Cs1ctliOwXz}v+pRTy zW)g&*m^{bdzp|+B$QOpgQG~9+us$@WYoHCfot;Wp7?Q%e^6$@S)ngXU)7R?gdqw7q zacGvA|J$8})EcZDaz1?b>(e>AfC`5Ode}OJlO*VGB;BIF^4zg&<|Vo{3`@yw@WVCe zFR0c3mS5Jlkp@V|kMxylWflJGUCvn$j)fJodTWJKAgg|VGpdviL5w|EUU7QMO^S?f z_`7vs4nAA$#naRiDX(By95Fiok;C6?oix?XabI?o>xwCy87w_ZNl!!VZCOtG`yyiU zA}6nFTxTtt+}RakjUT!!zGr1bKb1n!i*V&N zoM^pu;qhcqI!_`6blud^27bi z;BalqziaaV7a@1&eRBs3Iv*pY{{xTCHhwCf#))dBBQMQF*o9%senO6Zo38{noFidX z(tG(?#87Ty++ZG`n1>D#-0a@ZDmUT&x2a~djk9|XrgBQ~slaFjnG?BEgW7NfUwGB^ ze(};f-gn=_Kfqr~dQ6L`qShbmxJ*94;(}BPYR4=8#YH4t@JdQPj%ylua%v2mdIuRA z!_B3?&S+UhKW;crwVqa^R$DPqc1oYw=OWmtU)uKfNGtDw$~`V_i-HpSi!WaoIctIs z_4-NHIqT>5?qYr;yuhJ*FQ^3w6v_EoxedF@mae9lD)0CycU>e3eLfpokg=lkHEJGr z=z-%+*bzC!EQfN+L3yz0ds88QSdAr_*!+-w-+DVJ?uP@>nF+fRyv!XgseZ2Iv2K2h zteG#6lDiA>Y4!M@)xwD;*%||6G){5-`R+Lka&@la!*raj;o z_j#vpoMw|PP)?HDsFXw}rr}pK;`}fvhjaB+H@$DOnZ^EK;pll2l0a$mR|)j2 zK^ekod47aG>UA{t(BG(QF3(ryNMf3U6nO|3SY$HpZdb^6401z`ZJ%yrazV7Dr3k*E z!TecB-MJ^WyK_5#52Ql3Du7jf-$KR?D2@pp*sBBt)a- zbfE|rH@<`_uP+lg%&>=y3v+NGIr5LMKh0QiDB3ezt0x9{k zn^`LT9wi@Pv=a?83NJ?7wTR!5Vs|9AdP{5Url$F_BBSegeWo?AmF>wCL2|W^Hn(Xh z6Y;bC^;v7pKkgp}(O%9gb2}DfUcX!AEK%txA@8cI&sGQcOn405W_xY6tb9o8?$d>4 zdbY1KP@?m9R88_|Nx^O^=+rFa-GM@yI`W&=sv0^Fa|n7R{USl*7jZqznD3b&7;9_w zI41voO7_3!M^ZdYS!6cadHKPF-sFF<0N?kei&qDl1nMV5Y$5L(HnnXB+Y|5L!gIeI zoVYGYj=fx{=H3|HZ|dla@%1#I@1&Ph`+Y+H#2~kLK@+vk%&G$}cZZ)#DgmR%?2^{h zpMz#OH5Qo`0icu;sO2Y39+7pssxR5p!+lBjpsyKreiV)FyFaS_EfHn@BPK3w(z8L; z)YOAx4YsJ5k(4{Q zU_=_D!C8d-BAaLOf4a3QG2lg5jhTC%mRGkYL-%W_%dL9RZ4?i%W+18ncox z!(bED5G?RDqydIFz*Z6E)GjE<#u5uttofub2F%tv$KAg+2)%hLcTksK+TPw?2zLry zczVGbbiVqIL7IUA2}!Sb6-n*4m7Fab1gnaS>>qYc^59&m>hA82g$pE!81j(vyYZ`0 z{VG>_IwcjF{8&6|h5Kt)+EzBCHT(A7=E~sS_UkDw>9-#Np{hiIjI_2ddaeLo*19)- z2jz3I^k5&ChyUrg!#L&mmA{xlAb07z3*HS$Hts5d3*IX8CjEN^)QL;Y73LV|{8Sa4 z+!_AtMi%793jJd4KRnr5x#}kPx8n@HE){Q|^hxOd>0bIOD4aYW*J)LGb?tVDGXciS zXEwgLT%*cD?}Fx;JNvFE327ivysOu-38NqvFZKGznzAaa4|e-4{C1{4F7sg z2}8|Dk8LH6Vyy7`!u`bzR~9g^*)-6kqPWUie@@r3+y;6XgSW;m&NJ-S5K{Mu=(tii zv<}Ypt$XrK9EzNmMn6&3PYoy5`~2CUG?~75#777sR&77nA4%Q}=9Uv!tGM_{F3b+h z&RA_v`@g1+rH)oE$adD_otIu;U0{`NRo_gN8kSx^V&b_SYm z-GHAdJ;TpcdCc@SKbC)jEIaZ(LkT#K4RbKIC}Ohxa{teiu7ClgC0At0hl^nG@;)LB z9Zju7itkR&Aks4($eH%OSf7iLX z{Q|`_A<#5or}~Uo=;7;zz@5hLscQDT&jMegA)+q&WqvYbeI-xhlOk7Q|bu zn+dYXNN5%3mn%v}#=9We7*TUnNi=WBha}Y2LdXY=CJ;7L`L&L?^Q;(TOc+-1CPWHq5+ffFWX z2jHUfQ$kzHB+8Mn=r2PV!Wuq4jW5?n9v%A zfUZ%MIXA$4>t_Vh2-zh@N8{iU5kdMi`1voeFgK!Rj!sYC0i5OFv{f)4KxlY5`6MvP zKBVL|dTaLiIlHecI^Wf)z5;z_JkLVS4RKv|o-8M0SU@1HyYskBc;a8Ezgx!N?|v{5 z!6M`?n7cnW4H^S*1LgiFOSY^!90EYj%=cv0u?XleD6!|;PZf`o_9*fO)D+nU^BJaA zf<0NBomziZ_}@o1eO4w2zkTFrR^U0e_upP_&!uuC8btZ!1WFXGF&EbtyY>Lwu0w(B z!<@k5_y;Dp=-FhMdjcQ4M(+CGCVz&IeJlX8>B^k1kW2U;6#8|^xXy_*fu?vB>R7LhO+}?_c+Q{g+}sa$y+`%qXoZBzSO3( zHTIH+=Dz{WVM@<9wX;hW`Z%Bfevr(p7#W?Ln>$fuVJ4_Z5dB#*LrA?L?C!rfAH7lj z?#Q^o?tizOn^Y8z#Nl@x+0q#R_^&L43V9_m`|U5m>Y?PPkCW?5{}k$|k4ve6ZMPwT zxmM1LdXh)Fnu5i;rje&zOeaIqXM`8i|6<$H?dDSbIl>KnhFy*C!>67r(^fgWCmD|O ztLtI3<)w|UQV0$5{UdTR2VNH5{jdGJEH_Y(KEw6g;G1wXjS2F0VX}5tz(z95xA?&E zc0mFnibXguK5m)>F?|~dQXttD+V?Qx&em8#l%H+RjJ^|}t)K)dnthVLbuSF?BUHyf zYL&CGvN19^13Vj9T%TNqfKAvhQ`N2tliC3l#=t@)Mm7ro&q{Ub8h6H#vNKfJlCPrV zF;Lac7H6(*|5rAk8W$G_CaIxsqV$QOvi)EhA3GGPdDRAxqGS&q@bprbr**tvgMk?pnFqUyPTu~N0mvf zat!W~{nfwYSb4-Yv=(9}t6!Z*Y_MDkg&t-e2 ztAYpv=d)4sRO>@-RLL<1cjtOs1-e_QQO8=MenkSDxvkziKlB#E#VIq<$5?y6@lL*= zqr{*{esdM} z!D=B`KW;6-xiYxne;g(fWa+oZ4F=PRAubgnzy9jh2it(o2ot}V6Okj*r`cq|@OA=b ztS0Q)V#;Vh7mx1)gT2I{k&eRYzsHR8^v~vI`H8uC%d5%(P&D0~t1oXoTSBU*+YrO* zuzjP&neaib-hQ(0L=mzC$P$KhphBMtG+0ZAz5u!echhJ0Wo2&N4 zI4RP2x0I&9YDPNvISD&DEJ%(E*dLP^jXnh_BarH^7XyHmj>@WX-Mp~3JcjD^Er5=4 zOpTBq%7h2(ww)G&H$DK!#MzGEj#y$A@>789H@8>im|6r#18!7woU%ZcOknc{Z^V-D zh*ZHR%1(USutp-C@1EG%Z^+T1gP>Ht5O|OK@4(V~tYmVeX*D@{-0R2h$#z39BSV^e zkNle&cTyXhzyGNy7NP*xTswa~J-rRZ)CAe={A-C#AjIfMADMggn<Ba*pqY1b`!NCKw@G`*AE8IJ&D^H28AO!!wAHhPW|Ux{~PBZ!g- z5u{N?PX3H6^ECi+x3QQBzXS`l=*91^Jf37UF&G#a8(OkBM|$m@2reGh`c_SH@=X!mrny~t~+~>zAr4WSe%6kgqk?sQWPCb>MZw z-@+$AKM;a}RJDNdzc&xk1k41DukLwVeD!T|KPq|Fem3}XWuT#wEND;8d}hd0#5$}- z{r21tNCX=s^aXuICSpwfg;C3}1$qe_;sy}r6+{df``a(&`bDvGcS&YnnyPU@{Es)- zL7LOZ4TqV=ooQ$|OKeg|5vmciQChqt1d38gg3;2XAiS$s$>4yXl>7j8{n;XnB6~cx z$UXSx>a*!m1z(;rgf-2?7FX$}=LQ}9?a-NL4kwH34pMy)))E*;H;E3L6Kf<`Nf z{W^U_(8?f*nFkpL`^4Q~Jx*GVZ6T*EQ6-aAxXN~<8#(pSE->i4cj5B@)sVXtd!2WX z&N#mmY3(AM88MqU@H`vTQBL37-5m`2V_*e{nA}R7JfJO5YuwDHS_)M!nNSbdBYI1~U>2rl9!~eO@#|ecfc;vV0enZqUOLc}F8c_Hs|LKaDR7 zSXmgZ9F+Xh(W6}N>*8nE`HzLHX_$&w3Zu+jBpM0KJ2iFG7ZeCJejz5%C#?E9KE-&S zj!5Br`}5-4FA;F17I7?W1sz_%uQGBIA?5!>c(^)PEQH0(%Y48j!hG@K2DAyBz<|z_ zlX$It%P~{a-qMS9QQ7()En4HoT&41geZ>yId<5mxgZ9x>WsGnIB0*f{7-@*?&84T; z2mCqob<#`}sYYu(`|rN?PW|c z@TT5;UX`J<26{@Qvhu5&1;Qxe$k5APnF?`%81y+-4I{sdZs+^j8Si(i?jWeiCanTc zDI=w^hAf$gq8qgXH*SW8FD*{Oc;mcx926b-v2r;%fN9#P4cvFt83hrk&)5N z&3~)8)^VhaeJIg2lR6@#iy=%Lj-4z}giRAml9A{)(?Uv<4171;Pluq{+%sY|inF%Sc>gk?W{Xns@v|>U7+ss7qSGo`~59?HxZ=;ybM9Y-r761SZ+P^Q7;n@Ql7Pj+Ln6$k+*V_#I zPv|81_#t-}s!&&!y-q@n0}!dDIIip%gSyQHPHiw7$SVE%Z^WAm2T;`iEr7$|GaF;L zy;VMjhyaB*1c{4c{{GNwW8&WU%bT)(0ef4`+hWqr3s6jY9LI72-b)U14a|pAJ1P&X zq;zUBQgl8u+@v%HC!)%QuU&qX-ScnzE5_JPX^56c;=PC^HN@DRfQn?SEf(-sR1ZJ5 zf*cE9RB8^(?RxxvJ8i?d-Pj8MTiS=5RJEVGg#yX(K=rNyxX&G)a<))55Qup^1K&jd zO`}k&fi#M0bNr+hYMoka@FxuA)WmH2MVk$zjFe^`I>jQ!ut#SLdqKc_G?SOGDUN3O z^Pl_+XuAW(=uP1!{3iu6-o5sR1;~of3f{^RAy3o1TgUwV=pr+ni)J^-hZ|Ar*00Doemh0+&o9@=3-M=|`M}y41 z3r6gOtkHY-eRoffI**kIgB*K^Azc4@&Ch z^6+5N*h&oqrexc_Aaq~@xEMeHPHgSFrhIvLL#al zSGWJkgP7x26=EM4QwV4k3_9y-CKuqN(wP1o4+G2 zn6)%&4#jYhTDVBvaz!>40mqA?RZpEE_$3ISZe8;!AZiV0tp*CWU4K0;&)jLmUwm)@ z^bSkEzwDuXhX)7A0DU|Nq+<*xfVHk|-nlwmd>4M7Sp9V8=jxZxyWpWM}QiofpP)^9~HmlTd~D} zC+K7lM*RhRx!ZW~f!K2>Trcd8mCtW%FjqMNSI5&l<;16{+)tE=z$rg>4xBA^K@>Hk z7@(>AY&I-2sw`vJnL!nl-97&8Zuctapr12V19$=UfQPEC-T)*jH>RukLDSbnAnT03 z!uJWE9LXpcboM*y0ECNWqM-S0;TfP(@5#C_k#v%rULJkd5%StFV26>C|GWRO&jE|- zvMK1wFCUf7AUgBQ#Qtg{>)XX6SdO^NDV2nvTYMR7qar8wk9OPGjl+p7Ziuwq%I)RD ztX9)Ic#lh-I;^pIA=*gUT~booHRItDrO2t*W~zM z)&5AO0Kf1M{$E~9g=y|VSW2v)0ytTmVJucG>2R0@-B1=M;J#$-W{YbodoqbJiG`w) z3hSIwdYaHuZJvN{F>U zBFMj_L6_rvQGb}9V9U#Vd(Sty!q}%Eu5JKo-c$)e=A(vH0Sw|9Y!P4RjOV?4LQPA) zWp86|UpbHmmT#r4;c?6PlFCmEcuy7}*jMik-h18!zk-nF3c6-f-?ZM}c~T1jC6%4Y zmkUxsH!@HPt$`ogcK}xk>exZLtbNx>19~@?=+7ye+r&sjA_V2s?Ga-A0@xOZ+tISP zkvsDcatiV8^ur{r6N;ouQ~0r_>wN{iBhspR*svF9>< z5`iNLIxH`tf+}AGuL4k{yc*-!wNGI0ZKyCcHBQ{?(C?$fLy-5pZ*m6I#S5sC`6yMYz}Le- zbD|6Kz$u!U8*tDu)D;yK-FH=(5K?@?l6?owc*I%rti-s}IL*|-0_qd9mRDbX>u zb98jXTa^l7y5VL^evl%z+nHkciZr^Q0?1lUUUWUsm448s<9#wJW!Z+0b57x>ID8z& zr9faz4w8^eFj>cuLrXB-IkQrs$C^o^;^ILAG+jQSv95hI;-UOh=!G* ztgRZ`|tt*o2U9oRpF|NqEJ#EB&eudr{SmXDiApTv}4j0_P(moYDFQ5 zi;D}Z_VcrgM#pZ{~i5rtr45E3`tWKg_&Z*+^2V+Qq6;f&#>9qQ5EFRvTgnz>`QEwL(oz_k z0Tg%=%c3i^1u^aoQh#VK8M#y>-iL$UrQnNjZ$wPSxgOy#h(mdpgt3HJERFinCxqD; zwG!1=ifej%E087^n-+XL-zOH}g6O}NrR_7sg7R}~G9b4iG90&Xee zA|IGyL;+8Eg+$cqC*aU1rlL5j7ynL1P=(?JuxiVj_NUeu+Fn(7A~=l08jM{ERYk*e z|3fomKSo+kcyW^xsBZ~bh-inZbxjv9CQ|?ZCej&ZW*2=nfLD%6r9h6`8DTam))!J; z%ADI1)rTkkBd5Op+~{<9`AI12UM^mn!T0Ba$@WR;XGB4GfqoOn$+9ojUz19fi_($s zJ4u_+i7C;j$36_jYGX;~Px~qXKuGL8@6eg!4o-0sFB~L0MFt-mUm2Ykldm(=Sk&y? zeevQVm3!KZ7-<;s5SHjNd7Nn|aS{SRWMLwC{m0!o+aaM38)F{`*LD>aUObKOZb4kG zdA^4pM9szoBDNlAqLf)xtnEg}VbVSvBPK^ZwwtgiPs|edn-#!1vIYz1D)RsNJns0O zmv0~++gJ7AT5r#^i!~}T=LkdpYl57?N-H2Cc_al5rKyg1!4c_VMpD?j8@HfV?~BgPSJbKhbF`xGYXrURD*MON~#1 zfclEu(2s@2Z>Y3N12yGElN*_nHOXLhmFtKsYfGL{d0F@$s!qtuM~TVf0?yzZ;Cj;S zTF{TdX9cgt`>quyTw)v@6V{2{f4oq!G~p;1o%CQ;dZt+q4%)uF#pBe&dfdKc$5aRm zCJfBk$x+(#s;!kLev7ow_}&Vz_!DM;J3C!52R1D@@*?6WBXDp9idi44ae%>{VSqWF zm<%H5h6>cnE&vy$o;-pk`~m>JnnU`!$O2S)^_V8UP+GCQ9O=Cdn_~1WhxTce()^in zo{CxhLB*>KAeIj=>)*+TJe&1nBT~Wo43O6Wh}Uj;J(V46#ERozEx=N9L1f%>YQ<$h z#QX&1cZeJ~p8y$fg9;Q-(xN=z`)vGBV+u&ZDIy+8`QKlUC=5M_a#La4)EkowM`d!m zA-XRO05ZE1WZox1a&cm7A{d5sfxUo2azKeT{?IL2e1W3a5=_-)7V|L zZSlh=Xix_t^p_!M#0wt;_F$19(GR+FHi9D`{zKiz`hA33@;nskI9zuVNupIG*oYw#9yB`&&J&vO2goMTBxw}VSR4|pq+vee>;~Ym%%GzNhw0Z;s`()31-fcfnhoZG8pKv9pof|);54WN1$7n=*Vc@} zzxJl+`)HPERImWLqY+9qf#wTzcXxNej$kbiRq+vkJ>1L7hHQl?`ePLwR{6m8Xu)x` z>qUqV_U2GJtwaQlNkL9nZ`cR-M_?Ncib;p^K4I7WQj{k4m@UUCd=}jNshxv<@{?SD6NLU+Kqr)1;j-w^0VFWlb;(^y zD25yS39Y{GZSBBLr?<&KVjOT{k_E0o8{p}xHZ)How6a|HX2`*P5C_yBJ+HU^NfF3< z=v4~(!21_v9!?Y|%-s`HRD;nfxA}M{O@`&K0;8)Lpr9;k=bO4 z8UylCOnhx=RXQ?{Pv=`=FqpK0v9O0DerS-3C;=A>*=? zC9CJ!hH{5~wrjnVgn@-sBL)mwqK3Y=+7h5sKmyc=<=u9F*A(vvnQQhqwX79vQu-h! z(+4We#Y~4YnZa09(n2vjK*CX}%_Jr+Hul^}?Ayw1KQs-Xp}cx~o`m6f0h@L;XH`M} zCVU;ym_Y2oD%&V%UeSd#1N>j~V&RcrB5KZ8o5&(PeyrjvWxCbqygMP(mnrD7ml_}2 zhtjPP343(_2$7E&oMzDm`Y-#WLZxcPLEU-xqqHc%=+($&3Tm39&S?WEiQ04&h^v|T z?NR2R!W|j5n2%Bb z{k}FHAh~frw0@OG92!<8-W<~Cv>gw0GgJ&XRXkS!KY$_)$V5T7K3SrVmMdR(syZMf zlfHPi$_Piof%*!KM6k%1LY?ioGzB51wkDU&oN72O>&KlSHt|Q4JN|xwTf2a{0$qq6 zCyT#O-2vqlg5)$HBgkHr_(4(4(HlirnEW;cWX)j`h!8}P&=;XXUd$i@kI%=b4h3z7 znch^=U4@;C#Fo0T!W|P36PI&fz5<8^1#lfvz8y;zv+`u3z=RchrF|ykvIl7Zy;MB( zBRt5gUXk$}3*(ASErENGl|4dFvC4eZ-)N?Q!v5;S;`B>2sgm1DFFK{Q^m{HVb!r0l z@S3~Mx1fel_ zni#XQ>9Do*66)e9!u`52f zY0zp~?TSxt`ItAN6^_h`+$JtA6-30;PRD_9SQ`4@%A(*-0Jv9#`*I3MMSfp-Q6yC7J=j6DIZ3#(|h0H~ki88H#oS@p^@C70_6TGA;#TjvzUJNV(nyO}k zIf881XhCvSC?44)*;8^N@;PM&oDdXz3P7sAQpV_~hgcE;N&|2lW7a1RJ#W^$(W+77 zo&l?Gc1k1Y)m*&cQ0`JLAF^GX50$GZH)gb#;DTWe5K8O~QDT-p~ z&Wc=(@(O+KZP4#-@fVOv1Ai_4D1I{hV+d4u(iMs+LnbD-%6LXD-a|Rp!(mlZ8YU4c zYphMf#OwEng7a>L`Ljk7Nm>#rA-5_D8S=??&m@&_v=IHJDhX!ifBciOfzh)-&I`Y^061mp}Ex->8ePK1i6DrxKJAq0c zcHRDH6^H4K5-RdpzIYEsirBAoftMiic~A7`1Q&&ogoe@Y*mnQU)2}CfU4idGGWjJ* z^4~0g7?e^54=6>pr3iJACBqrrw_m_tb5V4%zrKZFp{(HfHc@ps0CU5n4~R%9kmqM4 z$Q(qc4Cc6=!eYod2AAw;sqV@h;k?E=J>Nx0I6$S%D*FkcX2^0#z!kaf8fS2*gh;zG zG!sY{78Yi(QaSvRKjQI(%K{+sG{ktp5`WgLEmY$f^(a9XqjAKj8xS#}gW`1$bU1OaVFinEz|YpE+2TgvLVVY_r&Z zKGfb3X4>U2KEp^@wdJdFYk(@jm4EvAOzHv9dUj4a)dI-XRvHiE&)NK$7z8Hugvu_V zf1b3EEIP9!RK3=TS>pTLWboz2Iq7Xiw=kIYv*YT$NdScs^FLDfGo)mw>O1X&VfNpb zIfnakeweUNNoqp>D4Bs-O;T_`&$ue)L3fUKGm|G*caBL&wEy3z(gX}%%d`ju>DkGQ z$>m!5WXXY`MD^gO3a)2)#OlA*Xy9`_Fh2Vn`B@VR%c&(bh`%i6x2z$V^w1%G8bQJV z^kO6&BYQM|2Lq)_sNS*dopwp!P9Z|XF-AN0}xvM1rHBP zu3&!R#=cvl-BPcoRTBsD<6OXRKsCsJjuyYiAUA5nXhnJ_Tz4ILb2?6g{W1>uGXMB7 zmplgci$5#ZzY9q`Q;3o9x}`kxWH?>J()$el6(6V^9(`!8-VA`F@Z6qMXu1bo&Cram zoJ-F`%F}7nLi6;OshZ8G41C_`FRl~YfYZ1?q=_wD&bN?(;8t%{Z=VJS+5O?RiE>-T z62J|-kepXDWCyI#d2Vj5il@7~JEFzEGb)%MYHeM1ad9CCkiF*w#7Kewg#HjcS;at! zM6~3iEcU}%P5x!zSLvs$Ya8g64CrYXPRbOf< zqmG{Jv0s9>NcHcj6oRzS;H5d$a@p7@qB~`+?D~@jZF-}hN14f^Z>vd$>FV-wQPAhc zEg0B3x&6=3+JVS~ikJ67T~$?8k{En3JBZ_3C1-a0G`qM5N<)bsHN|%XHD}#sgHR zg+811x|v>pP6>%@E$uQ?QX26GX+ct%T50nC&LNZ>0T8(}8xvDm;(wksMUpJrg|} z?&_U%yH<;f1;^q4T`cXOTj56Sw4Sy%uy~Z@hk`bk1*2;FXnb_qIESx>RLzx?OX}&& zoD#~i{;ZUEYI~sn%S*2c>$9?+-Q4x|?(nyn*6JW?f)nqK zb(UN35(c{My*0wR{rvnafY<54QsHne<-#8=I@lEp3GGmx4dgoGloS+tlT{%AWd8E3 zu_VKn7!-${m6$Scu}}jUJ=cHDH#g?Y`6RBxYx&UikKdJ$UAKzhC^;}ST5fV0zccFc zTRd~DyAlXm4Qp_O6RSQU^qvr6dI<$hVrK!nO-BKHb+&)q222j~PBA9_^UYKFgIsWP z37F}Ig!R$#17;3PiJlrU*gPC?SF#_!+?#r5AM7)p^+#i0t8uEmON<+kml2sVKFRRJ za#`u|Js4+X`8PCsiRnkBGksnAxe!)1DLJ5AYw#O;Of}|so;)M9M>7uX(_=^@;06xX z?U1;jBn1hFgbp3fyzuFS%D6@u?T(*i!Q8k>zG1G^yv^zrrGNqwnybZ`197-S%cFqP ze^}ia2~p6};G{scSe!)IYmeTPaV|K;aFkmixozOBVU--Pf#U{oBTe82c{P+;{paT; zR$rFLeL2uBOyR_N^Bd+srzlgc{LUmI{w*E6>}H%6Gvk2&P_MCTANeWd6la6_vySj= zl|vg@Cnh{hwHm8X{qn>osWO1xKu^R)B&x4kUdp~{<>uGc*^ruyr2Gn}4-h#@iYj(? z_SKCI6N_M!%s=Z-n(PfsRaF%zO^BjB?!0S_eh)o!ip|ufS#(m|vzR^02HJ`6sc**Q zPa$>9{tg>D7e>P`7-)2a%gyBeJkbv>p7N-xtlN!;Q=6SH{$3a)ECP(O`rAP01;TgX zT8E7R7@(c4e)i(g-`!0W%j*xCT?_!s-1+M2bQj*)RJ^K)Q%R^)`m|3$B^kaF_i)`FGg$y)$jkXW6Eh6hKk=Y{9ufeNxPbmy6IQ~w`WtlO9+kK{ z*BLY8lo{9M}D9L ze2xXp*9T3EU%q^KM=)X(E&-dpqr34Z6bVxww3cYG_$2&KB-w&Ulyx2PK9z^|W8;^7 z0U7%c1rN1D_EUhO^eHuIF@;MH*V)WRgGPNmej#LL|6Y)kh&5KzEQX-b<*mfJHY~qf zmH7iz%95KmCx=*Xgm$V*2LD_nIeb$u|LiY%8Vo{gYAerkRZXBTD&x7-KK{8jig6Zj ztHH#wkEhby)1+6dTv%0)rf25>gHF1T(wQz2!F+i_WQQC4Zg_b3P}-Qz6phi;`Y&c3*DXB^*VpZjkFs7XU5})$j>x@5doK5)9 znAw)#D0mFvN3`M{;gz@dR!^H3RFj_v!nUm>{r^i#&B?zp|Y z*+9Hb3BcaWrS3PC?*BfW7}4o)>GmuVpHngv9O|km5Nxob{JCUDr~}?wsF@M?74!mv=X-hHby{hn)2?ZT%aE4UR=#>%SpLoZAJ<(kI2r8%%7$DwznIFPZHD--lGw?h5V!18Zp6(jy9IO%_D ztKvHapL1YA$I3?T-^p3f|GzbhkJqsy_>e@e{!h`Oa`Sv?Fg&4MO!t}17{Yp5T-)B` zG!&~S?53dhv=))Y&%~H>PNoFnTulzIavj{}kzQ^dGWySQ(qnFBvA100or4Oo-GhD- zLPz}^J1N=qp?Qa2T0uejt>jyF$0cv`tut~;+MvV`_=!Oj*GErTH0ll2{~@Pbqz5}7 z{#XG;x+lTv1=Y?KYB8Hz=!Nl=Z%8w5m78_{xG;M$hd560Rd7lQk4A}>eJd4#gY{P% zzPkNV$YDtRO~f;O0-FFIXPc4i4qTu!`(_>h`8OGg^$Ua};I?+-q@r49#!TBbz^+@6 ztTKO0ODM`u!dw~35+Ty*F+}g8&!X&=~U(LaL zU3K#0=OG#2`3q-MI0YJ*Lg7%audXETfI7yfJACEA%RjP0@J*Lu@;a=CCIVb&2OzF|H5qlxtYqCl4m|%ID|_?=@8mJx*^*wppCYeA|XP9gU)27KgsCaI4M!uw&C9P zlJ^c63N{yKMil7TTMquMmS^phfYs?)H#Bu^rio!z=+BLW=MEYqm<<$1nrrs+1g zxFiJW&RlvP(}>h?;QNaKeSr`W4$hDLLp!IOz?=Zte-ZP-YU^AWXF+AR-rw?n`@rHZMbGbg@s?!E(54X6Bl`dqDWpNKpa-@qwCw!E!UG+N$>ix_F|Gfjoaw(FaJp zS?!==f(o=|$RZ^nSz1CWS79PRxg0LG>f&jMd0MVCvYcF|aSJM**AMp1-3z3=cj1Ra zp{W`fJX~eHVaGczY87GAszT7o)~@BvS>$`5Aee5!xu?V#{dFrle|~a`M5IwQ8tt0>ZtjzQBC-0o{!jOR`oe((gkAwV^&q3tyUl_-p z!+&N5f`o$7`~(y8m8`gnzz275vy$8CS1Gb&erDL%O?p;|ZKcs-c1zy>iY!9aLaS$v z`1J{Nw;Le%tLbKLa+nLaX>Kdq@HypbitOUJ9t~)*C6WC;2j4M3f37+S} z&R7)L{E-nF@hO7mwyNGy%c(3WJ3Cwd`gC{ton}Pz@tW?R%VgOarcWKJ!Sa3l__5Vm zUL8F+ZoR#RHIXh&N++ze)l8VGsT3aIM_A$7COjf8d1-&?)g=x+eMp`gxL+hM~1&K_}9iDJ8f&z8~B3xR8-jYv-Bd#wu z<+;wY!}Twj;hX69Z#cPW22Rq#kLe%5!O87{C61ekVYAfG-S=nxKY+8xIsv4OnS{7_ z^Nu(LxD(rjYgtw6m}V(!Gs}%d_YX8TdPH1gPJe9V8Kemw%sxK@JhmU)DzskwaC_OQ z3i17nBYSP$9fQ@9mYyKPX-!zmUN&#m<6RZ*NKc8-@NSc zG5Dn*%9M8;{~Xxu`(pw$O9@vtVU-Xs~Z_hM(ye4xmE1-8$UL@ zv2Yr>c0S~3IUnkE3787r&Pv)If@UWM7dw-s4OxXz?QZyg;erHFAo8;d4ho8V8i(}F zT0PrY_c76K(8N9HhJ!Gx^1ra>ku zNgz|LB^vKQ#1Ru^n=VYIk>_h*Ps0?akk0bS&HWllF>cBi#_+IfCY7$ib+gf+-_iKu zn6RFb<)ZNTrzVEy{Wr7xcSG|9zNO#F*`Wc|=QnFIF1u4h4XB^E{)ROEv{;~zPcRA* z?~wrnlFBIev^yvI7w6TP(B+%2hsw1UeEoP&vyFx_Uri2GBF@%%#WeHgf#6PY7eB+4 z6`Toz@eiPq&L)+v)sB4PcZJ6?=idUa*(XVbLr-1p@(!k(REt|ER0@xm9Dq$QXbU#1 zYZyl|b@uC*wmZ;teh26bgvvPhZ_IiizYNGzEFvN=9tMUTdd%4-F5~3CT7cz%B~Yq{ z=>1>jtkJa|>S`f%q$$AmG#}WWW=_62O9m%$E&%Wv&+Q3WpwS)&r}Mj-^6K@{j1CdU z=f^U#73Q_{*q*G)6ct(VR%Sd49`^T3IfnA4&b4Bs&CSiimOv2+9MjH$CkVlW9mhj+={o)cj`wV4|~b&2gu7`X4M zR7!YQY2gRgM@wb?!7K`(AojZtY*ZMXU8`|PtmR+Tvwha&W(V=Gcp06E{Rvaf`;*44 z?ikJ{&}T^dk@L;$?TnKUUv=}ESuR4 zR{wkEgr^lc(jjvYctjoGR?|Nh4g2m1B6J`A0pZ7b`HfQ{f;DB1;`SSvcMB?`w=@`M zI)bfh^L;P1BCeDAylyY_rILxg@G4p>LxFd!Cg;?0f!POZ}d2Iqne89-1{-@W3Re{vYR~GvIur4Rt>9&=~%WP`8@^ z7*#iTi5^vjiKd+h(_NcIA1MLm(jhEGgP;k4oQ6idxnCB3Hy%l80koZ#KVQI)C0boXLIXUk-Jbkn!mYw`!L!v6fTWIJI}iZo7> zSk(0UUV<~jOks|(`SnKy^&euA<^%XHC3cEP3tsOnF8$K zNlCM!0D7cw4gg8bU>;cNKO7JvCgijI2d9IDO9c=tGUJj?#bXe5=LA04{vTJaW0y*t zrDP)i)Ga)uv^F)Zb6YA+2Q!5O2jSnz)gP(6122%uV}?by(wbN~#dG8bY(%_)rShyJ zapmLHNB~;B4?*dhl<++iO(fq0g>60^nUHL!f`%m1FxVQKYvT!qvc6@vc71|7}0 zl>H=6sXFy`FS9lYopxD-=4+ES(|M-zcWaxRlE{TTrGN1|$Cn){IMo<`^zSCTPaepZ zk*Vjl$(why$;6WiGt=%*L=S#>%b-TmgqAbXCc`z`WbYrO*UH3-N=&nPC*xsKzI3a= zWDeG?fbar8LZ$6q?Fuz5JCD4YNZ-vlwfW}D zr=N3-Hc5~&<*Gas;t^e+YsV<8gu=6XmIepoq-JWZK7>HMBuh1!!B|ZFV(UI6qwo2U ziH-TW4>EHe?(RdHpe~odl!d=5hUX9KBuezqm;qEbz$jPchBC3y6NF13JTm=8E1PGq z-5gKpJ7s)01#X3mLa?=Y4zA90wPjZVIyhX`-NM4c;uLA461oTPV^Q!q`m8EWl9PwD zORdPk<|m*Ei6)7cJSC8A6NXh&Up`LgHQp-fs6JfQLt?>WB1IvgPGVGz%lh#xUN(hw zpy8L9$zo5fa)GMmC2&^9dWuH{E3!qKFPoSQK0eWiHhO?_NNeDzBbN%C{tl;e*!ahz z*VXRxH1wLyiOuH+Z1ie5HC;6BQz>>Q(hSr4ji;d8Fz+ngZeCjO{#YtS{dJQm>^_8%vTHBF$EpDA6%L215buJ zn+Pfie_{@!f}BU^rog8&~R!cHgch?xJs@SVN z4{f(Erx<^3TvTk#7Hap;3`;T=U+A^Hb^z53?yh~>9Glnh${(z$i$_0KKP$OUtg%~s z)tbhx84yt2cOUFc<(#gTVkjY76xmx#_yU}67S%qprkAhJTz_6B4zDlrAV|l3kuaGF zIqa9s(2uM4Y+Vo0-44iFg%x@pVm*$UHC0i#l z&+`n1tV#AQy9P^FQBbe%`?uulrbmyp4QEr$SLo#z$TPXVC5ja@`Pp|r--KRN6wQs& z&I&_;h{$4i*di50eTL)t6x%AN=Oe^uV&+w@`CdzkxDo5~D4{dky_WOvva!6BdoQD8 zQtYQr{)?wAo9k4X2N?qAY4Fo2cBbKK-$*Ndxnsf8i9URR4OA;`H#hLAHs2q*y4p(h zIBg%@vIZ`%Z-ri3O|Q)Qd)rrj3RLC#(f1ySGX$l_u^dN4F*OLbP%#(M+Ke~f#M83O%*g-@CGW)jt%-m1kBOgL;t}zmZD&ni6e~?A@I{^|%Qu#uB>yFY_3~I+#6`2x^dcS4#Mq)EoTCT!LS3>HQCH90} zP=xOuZq0qg4is=zo=sF`lBvYQzzao+NHH8*5BqGt7JPM>Ar+G?-Vu<>WsLZ9qwlU` zGkWlNp?3Ge=GZWiMHvn}zqidw-TSCKe>hyiz4gAJG(Amsc1p0spxZzAs@11dzXd_A zYbqn;&Gnb`;SN1kJu#OMG-TxGqYlhRww2~t#T?13H`q}-ZJOuC!*>Zqvm>bJ6}BoJ zhV7qTNZb4})e{;DpAm<*BFY8s-%LZB|mE`Ky zAHLZ?A?E77Sjk0zG#n@rj?ea&hZ5!i9w5+bQsh9fn!{LP`yWYS>f*RUWszwVfI z+hWi~GM7C42YcjgIgMumK8-7A~OsbK`In>L8iGOXb z^nU1MyDMxh()|#CJf0kL?zdb2Jx6)oMcT+LBx}C5vo(QMjhFV}`cc}aO8eVKky}fs ze4J)q+Uduam0R8+Q&K|`mu=4~$t{yhR8j9fnfoITBXc=Cj}vr1lI=yC@jk&bE!TR> zm@cU1yuzwdSc0L{$}%23?{iMPu-GVt5TX2brutsgI$Z!^axmFFLLZlDV0r+XH8^|O zzIBN-q%l}?n6XUFZgjJ}lG$ta`h9JdY1`wEBf z5tBQvZ>@3(wnpFSM4rIb6esCk~$@lfUOg$(#yF8^)7HeiX>ZklWCzQSD#TMh|tRhjr?rgMcW9m2ab9rLvUHQG# z$_<(;R>FP{RDRj0Bj=?4RmBqBJDv*U9%JV2!t3+bTPOIISCw$u`Pwzg*initEwApb zxj)~Xn;H)%zPxpyo3F2BH##EQ6M6%)S@FHSLnN62rr3>$+mS|(h`$J?ZpUQ6z^(q{ zj+OG8nfx?HjzU+-&diocK9}O})@;cil})}9@IU3$C~L3(?v)!L&X;_*5yt))r-)4H zBdZ=++q=3Jk1@Eq5~FsM>%X=I>EdQrlw zqE*oK<<&veqX;Z+%64lRd4uxfK>4`QSWxuaEI4SHF1#}Ol--#WRkuKH9 zUlj}+j1CW@Z;$0aMngrdh#R1*^-t&ehBeo2@d&}Ge&-J9(%|`i|^y-i{ zV?KTv)Mzc5&*M=psOhQ_lI6pmv-jEI6X4^sDF$7XJ3w*ie81g<`=5nJchoBS`NpNy zMD`x&Q*}ZzC?D;W<9}}TEjQ7*AFHt79TWL zDovR#w74Q9GehzNx@QiuVhxUyQdn6?+rp*-3A#K{+$eru`AD|ww~9juqyNSztg zyDoR9t5)leN7Rl`_eMxml9@ZZ+qexo4}4Yo&JM`c!Z?U$`a8(^5fhOmke=#i@rS+3 z;Li<=cs%#a>sLfBziv}!z9iS_=Fpy6=^K~Zxh=_G z{U5>0oQ0~OQP~{V=~dU=?MSKf?)g>TW1RdkC2pHIN~>U$${SWIHy%hLa=(86V{hU@V)fcI1d=2)kn2G<{whs1+C(`ZgtL(+=_pdX)Q( zA;B{bdC$(n{^x?8A0_sCgx;)-$vc0vp89#-Xki&*j)YUH&hYj&M4_}|=-o3VHEv<| zD={^Zfva$bKC89Do9N5&kaq3ez|!f%*Oy;LkMTJJc{g`fkmywH_BZ!EZ7~#o`q1v} z?cwBunj&W)5wnmdJ>8ua>5Bm87@bj8Bybi$6C$>rF+X#3Uk${4S{|R`v5OTg^RUjrkmMNDN8P z{IKqul^M0KsRCRb9fpDYQA#<6uP61cN%>bsMqwE~FSJ;QppgjqwbhmN-dIFn;yn$u zBUDqfqF(|l?l$B$DB*gzWXR0Pis?Y$GeV}XT~}HEuUK|(nworzO1_HDvq*1%+G+7FEh$R_F$V)LoGc)8p3U| z{NToMkC)(ND-5B@wd1S}`GqDAyJt@%9+zuob)u+3^hSF9^0|C^mD#Zvc4hYhwidWs zpKkVeU#-si-&(dv^!vPL)aXdo{KRH>W{u6}Vs&R)w-eyJJ9)Cj{K>4upvpPWqq4T{ z`MG}Y^0#Q4zV#c^A0-E&Hc{QF`Y8rg3DWUcUG^(qdb+~>~+okqg=C4Olw=EoJH5j`#@0hQ}?#p?NW>JV;pe1 zg@TT6BB1elzpYb84oYIPKh*;iWVGi8?=^)#SGtOeQynb%mX)A=GF7-=YCtCy3dzmY zJt5SczT0n#iKW!00qA|_H0uL;X6Dy6HYQFY(sF!|8#^{*pRYHdmOb0^oX2EX@b|Lv zgVAqn2jz4tKYq}laKxDVSGn`@@nrzW*|{IUEO^?}3C(S^t~!2)5f9c`lNg_$Pr*m< zd|L=in!FcT8$j#7&lHYs@g?o4P1hK0okw@Ox+%5i>|$&P?_PDR`tM7{&Czhp zIoZA~<@qRn?!LXSVcA$K%z%?Wx?6bIE}X#(6qd=^Rm=UqFI@>T;f@?R_d3R31^lc( zp6V>lg*I;YXpxc{f7E-jc6IhVMxD88^8yJQB~!B=$8ox>V`qQ84u)AjRkT}#zqu+R6uS%szmb8#QLRD6&+AP;BozoWfA>t4aD7BO*c1YY2U;M#b zeP@)g{JS3s$GiB=Kyu|vKmo(aypUs9z zF5%Dc?d%SfCGnXE26!^qPu3nI;+Wvcm_K_b!l+sl3oWWT!{@m1y_Gk@qdbfI9dXfR zv-*R|+z(dMAAO{viQMxhEq&R7PoEljx82a0tM4cWP0Df&vJTM3k)bO}@syJZy^g6dGIY&)77d z*}pw)5}x*(Rsr#$G_wB%T*O#Rf%o;w!l~70dRm{A5iV0##jhWwCBm9nO3}_uE+2-n z$wzfb7e65wH`eSSGYbf0HQxM45vn%LRmC;6cL?W%BwBX4TTSO2ULaXUN!(BSrydH! z>=SUQHYxJh?;;^R*oZB8Ig252Mc%P`bfBwdU!3mH;=M$q%J}OZRVP49Z23YSzH0%S zzrfW^JV;Ah`HNhG>*QGeo9!RvTL!Nf$YS0Lm9ki9)}!G>`FtV`Qf1Pc`TQ^@QzT}o z+2qGS5+0jH_>Q){G@Ibn$#b*m0#dJo&qOhq0)DtuD+$RQ>p>|O#G{i`ho|)uL`P`cF>%21h`==$HvB5tgNiq z{lLNBCig99YHC6UT9ni{;pbz{p0nnPiRHhr%WPDr7vMDe2ZPG83#}0VUph!j$aOnv8pAh?9_a=e(G9OQQkY<(D2AFXC??EHe!Pp`dys#;Ks#^6*Yv5cy!{X z@1=3l;4TaJJ{a{1y+wp}tVa^G^NK6k74(N%Ah~&KTF5RH7 zLwA&q1Vr)T1QN(eA7$&yWB>7QB*k>`M*pvM3o!f=SJ zMdz0EtOYVg9FeqWTxCC) zM-Ei)! zrT0Sy4Z31I$Me(}5e>V}{m1F6dEa!)Fmb*S1@EZIv^gsnD6uIQR)h-R@=%(c$z=(t zR%_S1NG@@^G+-qn-V`+C&5K9v^6p^G6%eU>JBDLajk9mJ~6N_*;yz2 zUIbW*WMpIyIL*Fw0fsw3xj?Q#rF1g-fj#^2L25Je{QSI#02ucb3_LQGofOK=fsWCr z{i9GTCW3E}O4_H{?S)8ekeg>bMh!Ch9jmog(@MZHXcLq)TW;!r5$1E&5}b>*hgsu0N~hG7tf$^4RHZ0R_ibkZtg^cwLTl zLR>u+`gr+4vXa4JA|rHwa{IcrYYE$9XYXYyx0!n(Vnvgek^%2iG^O{RQ~q6hIPlpEF&fcMkuM)ROgX@hQaICXh=A_(;q`K zJfk~$c^=qi=&)NG&;|tsmxN0o(NEu) zt?XqRnXIYV#l=% z6;t`HxV4ZrqCnEqZE-eADyBuLdhFcI-h{Cly9E8v z)6@R2$A-`=6wJrmCHf$1$=mBgk1k$Yu_Et_4~z586kUQOG(HU$kId(M^zA#Y>-YTgTu;|kmp}A*f8O_f?sK2>I_JDzA1eoJ zS|-eL4tydrFdn}4NPDrow=`;VtH^Y5(a2$^O|w5ojaYP#GAEDL$j!rK_WgH$mrW*Y zQl^Ne zu}u-7k*j91pV(x-Q)ZQM-+fP@bna#zA4fpM?Y0b@Q#f`GG{LL2e)`lyT@?-H9O-HMa`aKleyZz40t)vDXC3u zC|qt>xWII025^hh!*5Rb=nXEdbFns>-857n>nU#zI$OI)|HCuMb69wtHJ zBO_ODJQK8xpY=%i;An{vzCnxki`PdzQhLkG!NH*j$ixD9ZHK=U0lz`}^HxOL%}M1C z#K>z;rSTg&t+0C_P+XXT-sFj(%L+o_115J-Ce6Mg#lDi)S?l$!|zW|Z!GK7d86ae3Fb669f$0h^hRvFf3hp$ZB)WP zICRU_FvRG3#D_Pj!Iym|{TF$@;1)&dzws$Hnq0R0ymC;u?m0IX4mff8&KnGOy7Rwx zIv2UqFCK4>%g{AV!%C>+sL-FnVOTUeqU@&(7r&wTG*h0mt%Uf}m;D;+#mNrRfN{$_ zf-gO5<$7HX^KbpyjY_c|j=Qf9J{TSuZ3Ntal=bs#K7N4<)VH26<57zQ08S2jKVQ`l zb6s1DcVe`;F)Kd(eDBW2geq0M9_V;E+=C6iL$;M zlFX5OkutKaucakJHG$oJaCDxqrm@OPdt-JNhlDv*c}=kayPZ4*`vgt23(gk(RtKTu5+tlpmt;5_Ev!4AZ`A1tKudAU7~ zweE8vmWFz92YGL>$v#Fcre)pi`dWX;RF3obRK#v_lvLn8;=RQo{i_-`8mOPD4Be~s z#A&U!%60KnN-h-mOlJ^eDz%vh4xMT5nVb|BnKI42C}tk*Z=;bO)@-s)TO=L3(ogmP zOy1!pxrX8y%V#%g4cyX34emQEG7yp+Z7%fCX})(bSq9SF%ulaw^Ymsb<6pmi9Y)@y zR|VMm9zyQD-HXa6es&iI-?;2&;^4q(K6Ky62%M$I3~<@F0sQrIyo%WU*XGf5_Ck5!i!p>t~%Kq zkk2v9WF$N0!auB_eG>j~`7;|J>fR1QE+6dks!JAn3^d;)vdOzVwjM%X)pKp^TTnLh zs#8g-P2}@twAL)n_(^XgQSoz_8h~}pru3rJ1KOJGJ;QIC8&nSj$I;2+=MNsHtg0f@ zL~c}!@VnBlS#R~qAasCbYf9K-_dTjkuEzy%+o!@#=oWbuK~B~0+`K&!mMj~W#fB{k z3Qi733Jqk}UXitY{M0%cSwr8Km8n)Dzg7a*oSF@@93qh`fVjf`RqnZFfk+S2k49zd znkAl(Fv1C+J9;Y+6V77bV0)#tg# z8LRTyLtC@-p#Ki1>yj}kKV@f=F_)^exCob=RbCwWY-w3pm%W9>3mz60771YNF@uWS z(w8qP`Jlbf)!r`KayN-M$UhPSbCNe=VI<5~y1TnuAnK(swX*s(IzE2%0`{^D(!d&E z)fqZX?)5z1NQy#8A|K<+hT?-|ySiG{KOHj5PF))%c!@5}yu2Cf+{thUlmN-MD6v*3 z2b}K653LcBPzRpNbTs*Bg7L`lYW@1hYYn_v8@0aP_5bQ1NyRSogjPSufC zInLin{>=91;2U~-RG;H`t=IV^p8I~4yXd9&J22={wTH`HF~^02O?u)3V#)zp@LF8F zlVenaI$B{}JgQrNfWIBWlJ`N$pcMvTQa#)uPj)$Uxz1a zqGuGDs^$@flYI^tqzN(IIWS zb~X>lPFA?QJJ;3|-$@ptGS|pZH8&Z5C6M;>`YVJ|`KFG3ld`)A=0!cn(j-EZ?WV)4 z9(I4QYu9DC!EHV?HBXO)MTTDORJ`l(SRwrT`Ef#meM;W?{0Lt8TW`eb{h18YVn!2N z2QqKBDUj!~c!l6O$b^OkaUo&b(==ibRrTF{Xov9V^Hz8zVrVdweW-lF?U=H)>(Ymc zotlB|`C&uRM@!^Fr;|^0V;AVn4ip|tlu#`77eq(d30~Jj?5~{QjMr@wuwnEcnoe4J zsz7w`7@eH;<_KN8ad3i6JiR#v*=YEuiL-yvGVoMGTztH8(Tk|vXQ=)FFWc?0R$#i;TfFvj72HE|cw9exrnm%&{{x@h$&;w{ZMtgQBd54P(k)b%f^E z7ae!Pu3D--+|A}tuaJP-B^7R$*)ruYL7#^RoiuUuR2WL`Jh--Ox;vB;(E8T*)~*Mq z&dpsy^V7313r=jzL|V_Q+h*Et#86E=C5@M-&m+n!?|g37jqPS(U_jfWo0Jf^zOYzM z=KT8EkKU6LZwIA>lfsh@yx!6@`QUAeXKg2^^46WfocO6ilDh@Bjm_+cy%g^icisFE z5>0nG(?ZVtQ_PRL=JQ_Z<8?;_sNQ}#QybmVyl2QSc@0W{lo?$U{@$sRe=7ifX~3jr zzlu>;@@EihINOYO7j;_If;gxXC zydGJ+*6ac6C;WTVWJJMU%gT+dg&426soIESLw5>n6V8$BJ3>hHa#zPk2{GK@bBX{M z`V%%b_R?O_^AU(GkGDK0S_iMpCAU6*k{BiC_5gB9JpvWPXE|M+Sj@A816iBn)bjJ> zFHU(%0?0IWlMm6?2PT_-Nd9L(DPAgZb(%1+fqZNiJ5(nTx7$^2QoJb?HZ~O>&P069a%?C*BL5Xw! zO6TtU4y*cTVW)a^jn{J_Ec@r?=PFNLFJB^Cn#xm|C?9*il2uFi_j<@u`-T1J%bwa@ z8R22H*jTRvB1DwyNz_34b-hqG6Sk11q zcT@jR+%5kQ?bA)1O)mtqPvM*$Zdu3*=|A5p(Kj}>um0Ip8Ld?yZEI#f67MnOc|_$% z))97bq|Ynu+=0)E<(|>EpP3;KxWrDpTLWNSeXX#lPcuaw<2mp{Y)2HAoAz(6KXIUQ zji!~Vnqs^rYX&b#e%o=@8`jGDk->wkL;t{V=1=N;j-6UxCkMH%zn?etFTkBP*H!2G zHelc;%D-}ng0NHN>t*Sn*MB^&SoAqkK#+EUvTgWfl9W%xfZ0~oK>tK|w1el^6OH|% zI4fZtZjtV1Y}u+shL2`hUtXi|Xwp9eoT>fv^R=&RcU+w<(z^QSVWU>8;>?=o9#pfeuLdMj zIe*YD|C|fCu#O{n9HsgEXI3pSth^rsiQDlkR@CVxPqxJMv?prga<_1+$L(XE38-he zO*wu_in)*ycuDCjP?HgfUo-fkIHtzL&zwL)6LIDo{av}GR5XV{1sl> ztji8&3obeWmSTQ*ucwdsfrMKELd~o22dAw9%96q4tZm6JuAjv%zwrd}r;Ry`iZ74e znY3U$oF$4zy}doejCO#YVf;gAgFiX@1Ea&v)EJ_qQarQGi1;beU^;Nx^}?;n?n~`r zlPaF*DjuV*(cO+nz^7w$vulM0>H~Yw8)QM*i>65OM7*CE$h4l=NjVh7Xe$15!N8d& zkM<1+XgNm5Av3obEJ)gTERf_*NkkqdD$JLmunLFSge>`s$@;*-%zvEWpt$-7Ra`2-`7nK^(YApMK$b6tMkH9?n#lFx8^0fd93Tcu&@vUNkm65+h+0@ z&Bl)sE6ngB_J(BC)pTFcrJ}tfE|JSZA%CnBA^?6gTU*=vfF2+wpzZqo4`ZQV+rNVr zW}q|lDzua#M@A9R>$Vts7kL}yjY6kk$E z`mT}Az^zsE@=c`PW95GMP~Yz4Tc?EN9eAlH1!Z)0M&J-&}gyO`gRtlQM{wPp0#)q7dV z?{zn&j8EZibpsPRP}QT81Hryxp;j^n{pBnw))VbQavIiBYcBdVoD})L-F}3Wm|Cei z@CJ&(3V&E1=C=`?*Bs>_KlX!M$lu4saCtI{g zuE`xmU=L6(-14E!jmCtfs`9hIWz+M-!^3B==piF1t9OAOm%u&q0aH_NpHjQOy=Tm; zb5WF$^O95bUR!une5|(*P1g5zcXmJSW@0`QNhWr@)ctV%SaAh!Qosk_5WhTUERDOD zf8^Tk>hM`AgUyi9m_W-KMZts7m!%j>^Ty(1yml%NNftcuEj&@jd|-N^*3ymbAJc#A z7ZDW|B?IMxgxK%XAt5YGm(e_isAb$_`8T~^oUg#k#r3k?nQTBw9eV$0mzGss_lr*ESzBPx?J&!#w?G`&T@ef$JYUuC(T9jRAfn4@wZ7TJvM zUnVNDb~^>)>c3*H2;Ii79UVVX!EVTAgW2imq;*|4n$xJ>yKM471(V*+9h3LkFkd8Y zfo*}YiPg!5^u_Inb;N~0wBXB)w+Oh=kLH}{+PBDQ7^8ba)R2=z~&P;lgNbjC8(?pRf`T0OfR%~LwtZEP%T z;fh4i;mr;%t#55f0R4_9C{p^&IzfkHzGW66YrRq7A{Dv<4-Ze-)37k?TLHRxOp@ry zs9vaVL-ELT%X3a$S@r+9EHIdi?d*hGM@Fh#_3r+5)3o3~7>kMmX_VD~kg(Sz`q;wsG=Z&OJ=gg*CM`C`w!<*H zfBcdJ$s&sJ2FO!<&6K|+u|juRiYoWUoX(zsFW z$)s|m(nyZ(HfXT+%ghwD%;3*|f-e|A#FY8Zvs@tCR?sjLU||iqy9+bz~Nkp{DB(2-5)jM(o`?#B6(qakes zrT>wGL!uG1#C+_Cy*@VA{w#p;%y^KS*tm!WbO|BA$vol%J*>r$nwXz#MZI;u0Jzh& z?!&*<2e}vId5t+F%xV{@c&#0 zyAu}P)^gU5CjZLA&YnnszG-#yB^HV`aEfiy1C>&mdR^b$%1!Jme9j(C877{f}K@tB9d(>gwyep8t|78A?P* zBk1zj!Pz;eu1?tb&mrJcLp8fVc6@Y%0F4w@!`k5m7!-eQ#|BC0%Y=LCDKnJT>iA?W zC_3#e`cDpZw8k1l$7QFsR`~u{A^>cgI5+zq+A=v4A65i8JH0X znl0*0Xm98~fBt;FprD}4K#polDG(+P0z(}}wnB0{U~KP5#@|lkkGUexH0NdHV^phu_Uo=$^^WM6mL=b$oni_--ZeS=_wW75JR9Gm zRn$~R^zXd?>E5$=%2$-l88P|N9l=BzwnSl5yr*D-A$h$wxT(kRUmoM%KQ{71SVy_= zzGUcseLQ?4SuNC9JTlkn>i04y+9mD1gXUhT8}tABml+w2dja5y1j*okZ1A@y|LeeD zT!lst<6wW9wEy|~Z+tf{0GyRlVygVFqyFcxo!zXQ5EkL1ySK+RCx z*p2&t`wFtQeyc_7SDp8AIu>XXP*89??n>U#sF~zBXdphU&l(m9kW#1C6hUUke_vC7 z|0q^)4m?WwW22n1$=H!$%Ub29dlYW9|NSaoQpJE4a@%Nodx%A!+X5Bt{_XulQ6CX% z8XDsM!4Rb)osuiSkRA+N27XQHlNuug==Jwd=cNv)JTSr!%FN~eW1@|g7i!%$uCRcB z0t<*ytcyXX*CWWCpeBh4?EkHx%PmUDD))w|DIF~iCZ)gFAow4Axh(6;OmAsQ3shZF z0T{T?Z|bZ}HHiBA`*VU5a}(8*mAwFh2*K%6;ie$(Et@JL%x+X4(H2RS0eYyzwNIRC z#}0-=FOrEeen5s1ScJxiM1n&6)Wb})a8>6)k9q^1Vo`~Tf8rgaAuZl9-d_BwibKZQ z2wD1Mp3?X`t5|I8OjDKo0n_#v`t|K?Nw^|5K)wrk>#?lIhPA>q2SIy&m;k6XzOSk> z8Ag~`yT8+rg8sMxPwglt;6?o)h?@H zsu|L0AV_2{T(^DarxP%ulQ5~Ez%w*o_^P$;?QfWk12GGPP2y1cUH?eua~W_cdjq;u zXg64E&?bFKG&xcGgxKp~TUCU6?hqpSrBga6`h&(pp4cw511}wcHt%<&L_rS|JMncT z4LhKmQ`#{BHqFlONFmo_ybBjpH2p!$z{fsp3;GQ;zTMb+mM1&$X!-+|^D!7=Kkt<1 zRwQ?vm{yx&mg2{GktdtxJG?)Zp*=>W@}U8#j@%d#tK8|F*X2{BG(fqfiHS+CPxe4d zC22DF4^!BJoQBGvjuV2YbDvzQt0hllT8&kG)+qk73x1M>4`7YsA|r9**$pTy54qX& z&NTr$#0<2ae8Dl_zb`Eye)E-o>7vQ=52_FYmfPk!S#iPt8ck_zjgMeQ6V7TMhG$7YuwV&YMY z0p+B^?%KQ1O~p28@YL5DVGZrkVvp&Mln^-|(tTCw#y(ioTlb_QCP@9?KKY`JRP6^nI_UH5{{p`o!tOQ3HQgtd?nk zU6}F*k&|3SgSU=~{_g<4cmwYRHBq&R>||*$Hzyrk-Q1l^*A(JV6!VVWvZ$StOu}Qe z>(DSah+#BIK=T8k0`1eAt@uYTtd_1^mI^;w;2~nJ6i(tCQHN~`fdUU6QF3zYIU(UOcyW5DN@zbZe z&(#gnhQ=(RqB>N1KKo87q6@#APP|aPjn)sF6YDwnZd*8rx^FXm2C7u8%4?s-KqKR& zA?s;8HeXWMt84OPq%mHs5E*t?|LEi<)nS=nsC@|v6xeydV{_R?P);*F(1s|F&9GJn z-JT0S37ZWynHn@=3<_*6$PqC5Wfbt{2r`g3IXi2nO+tTV`VH<(HY{c!`q&@zGQUci zBtlJ2egSf-#p1gN##7nL%+Not8Bd^sm(*JeQhcPWo%7t)1S%{T76PSc;Xsk5ss8$! z#z0UCNHT7DG^K0c0Q2!op$MF+_%@-pFIB|9fH-=7LaS;PcX*nHE%ZBBT)cKO{wljG z^jex~W=VFXImO7egXm2T^IElo8a2Z(MD5oDq{zM?IGLj8wl9v);ElIRf7~rO_b#y2 z)@X8sk%|>sv$&lR(WBcvsax=mF;^DK zskntFsX}G`;Nyhyix!=wwrJ^sZ;6!hRvBVIO$YPdy?Ywy=>Y-fkz$uw)809zkAP^^ zdZ~=MR||yq=rtp_Ep!L@<5;Azdd+b~v051dZ9$kGn{zJan{pllSX6Nyp3m`)cDYq( zfg%&C*(ZrS!pu=saY@~esxB_^B62azed!jX6-7jxMaHT{F9=k`Ws>*`1m6m%9Nb9G zkVP=1<0*ylsvhrVjNNuAatU-iC${ zK;Y(!z5tvjN_2G8(j$6wv}Kj*Q(t?5^HIvMc|hxj@22_xxvRxYvCz=aB=7DspiaT; zvF6;HKx4IB#%0XT$L0pSX=px3p}sq58cQ8|p^xk)pL3Z>mwSWy`=tTAKJc82jOzZ^ z79pcrgg#y}_IpoZsq(G5N}EDg*x62v-pUe^3dxaXJk(zFK0Yv+sCLfdR>@m=9D-)n zo1#I`Nf}bj(hO}Xd1Bl!$nox)W&jbb963{3p2l^#M3$yk8rq#h=1XOPFNj>^2$+_y z%1Nav_{Ddt3OrtXQ}hf)9nSL)1`Seu-E6f_k8AAYd9xHG49o6E>fLe#o*nC@N(~m5 zAH7nVuvk%C__;Z8y9^F-Kc*dxu=KCxkQ5I?Kkb|#yK8ProYi-3CGL14&(5+=ejipH zg@QeXu}oyx?1zuTsWU4W_@4lm^MW4;2j;+Soon5ksQ&2MdaQ#gUQ#Eky5F^R7Nh#w z(HKdVS%&wqoO0rPSZJBzN?Aus=lHRzW@9D-GnbU}urfzgvNnM)aty|V2Id)wraJ^e ziRwGN-a4v^-@%$PcOpu%X4Ujm+qsT9)Ben!gNH5oo$OrZy&LKQ*J9#gl+RVV2DF0c zxVENvy+`|fj?$B~&v!9I~x` zPC@sQ>Nz;1}U86A|3wj5fGbA=2T$u!sSjaaozC)ZG4Dagl%@#nHfJdu6M^umwZK=1R5@?%q_*HNn`riR2@%OJ6?(H8}a z8wpeHJJAXy@e<8^xiN8JO@Xwf>SgyhNL{&ZP!f+u1^S_)qO!=wDc*k^a?}v$&#kF< z@vR=`{C6m}K$Dd7Y2r}F=N{!0A=SQ&Ip>jCsT3oBEnNv!zKUl)ZxxfKSr@wQb8?Nj z?NQ9$vr=zcp73tlsV%AMikdLxP)B4Mm7piBRaow(MO`CFUN|c_i9w-(l`%2m(tlqr zl>QAgPGs1r+o)e+m9xmqr3Q%xv~aZ-lv4psrk_C-TQWxnsJZ$wR!}&X-`kf~JfB1mLQ Date: Mon, 17 Jun 2024 10:59:39 -0400 Subject: [PATCH 39/53] Update to correct graph env for docker environment (#82) Since this uses the `dsnp/instant-seal-node-with-deployed-schemas` docker image, it doesn't need to deploy schemas and should default to using the `Mainnet` config for graph. - Removes `GRAPH_ENVIRONMENT_DEV_CONFIG` - Removes `GRAPH_ENVIRONMENT_TYPE` Dev option - Removes test setup that overwrites `.env` --- .env.docker.dev | 9 +-- ENVIRONMENT.md | 3 +- apps/api/test/setup/index.js | 56 ++++++------------- env.template | 38 ++----------- .../src/blockchain/blockchain.service.spec.ts | 1 - libs/common/src/config/config.service.spec.ts | 18 +----- libs/common/src/config/config.service.ts | 5 -- libs/common/src/config/env.config.ts | 16 +----- .../src/services/graph-state-manager.ts | 10 +--- package-lock.json | 14 ++--- package.json | 1 - 11 files changed, 36 insertions(+), 135 deletions(-) diff --git a/.env.docker.dev b/.env.docker.dev index 7e42ebb4..3749341f 100644 --- a/.env.docker.dev +++ b/.env.docker.dev @@ -8,13 +8,10 @@ DEBOUNCE_SECONDS=10 # Configure the amount of capacity Graph Service can use. CAPACITY_LIMIT={"type":"percentage", "value":80} -# Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. -GRAPH_ENVIRONMENT_TYPE=Dev +# Add the graph environment type. This can be 'TestnetPaseo' or 'Mainnet'. +# Mainnet is also used for dsnp/instant-seal-node-with-deployed-schemas:latest +GRAPH_ENVIRONMENT_TYPE=Mainnet -# [NOTE]: The following config is only used for Dev environments. -# Add the graph environment config in JSON format only used for Dev environments. -# Be careful to escape any inner quotes as this is in a .env file. -GRAPH_ENVIRONMENT_DEV_CONFIG={"sdkMaxStaleFriendshipDays": 100,"maxPageId": 100,"dsnpVersions": ["1.0"],"maxGraphPageSizeBytes": 100,"maxKeyPageSizeBytes": 100,"schemaMap": {"1": {"dsnpVersion": "1.0","connectionType": "follow","privacyType": "public"},"2": {"dsnpVersion": "1.0","connectionType": "follow","privacyType": "private"},"3": {"dsnpVersion": "1.0","connectionType": "friendship","privacyType": "private"}},"graphPublicKeySchemaId": 4} PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" PROVIDER_ID=1 diff --git a/ENVIRONMENT.md b/ENVIRONMENT.md index 62f96675..f73cbed1 100644 --- a/ENVIRONMENT.md +++ b/ENVIRONMENT.md @@ -8,8 +8,7 @@ This application recognizes the following environment variables: | `CAPACITY_LIMIT` | Maximum amount of provider capacity this app is allowed to use (per epoch) type: 'percentage' 'amount' value: number (may be percentage, ie '80', or absolute amount of capacity) | JSON [(example)](./env.template) | Y | | |`DEBOUNCE_SECONDS`|Number of seconds to retain pending graph updates in the Redis cache to avoid redundant fetches from the chain|>= 0||| | > 0 | | 100 | | `FREQUENCY_URL` | Blockchain node address | http(s): or ws(s): URL | Y | | -| `GRAPH_ENVIRONMENT_DEV_CONFIG` | [NOTE]: Only used for Dev environments. Add the graph environment config in JSON format only used for Dev environments. Be careful to escape any inner quotes as this is in a .env file and will be parsed by the shell. | JSON [(example)](./env.template) | Y (if 'Dev') | | -| `GRAPH_ENVIRONMENT_TYPE` | Graph environment type. | Mainnet\|TestnetPaseo\|Rococo\|Dev | Y | | +| `GRAPH_ENVIRONMENT_TYPE` | Graph environment type. | Mainnet\|TestnetPaseo | Y | | | `PROVIDER_ACCOUNT_SEED_PHRASE` | Seed phrase for provider MSA control key | string | Y | | | `PROVIDER_ID` | Provider MSA ID | integer | Y | | | `QUEUE_HIGH_WATER` | Max number of jobs allowed on the 'graphUpdateQueue' before blockchain scan will be paused to allow queue to drain | >= 100 | | 1000 | diff --git a/apps/api/test/setup/index.js b/apps/api/test/setup/index.js index bca6e5be..0e9ef962 100644 --- a/apps/api/test/setup/index.js +++ b/apps/api/test/setup/index.js @@ -3,13 +3,7 @@ import { Keyring } from '@polkadot/keyring'; import { waitReady } from '@polkadot/wasm-crypto'; import { _0n, hexToU8a, u8aToHex, u8aWrapBytes } from '@polkadot/util'; import { userPrivateConnections, userPrivateFollows, publicKey, userPublicFollows } from '@dsnp/frequency-schemas/dsnp'; -import { - DsnpVersion, - Graph, - EnvironmentType, - ConnectionType, - PrivacyType, -} from '@dsnp/graph-sdk'; +import { DsnpVersion, Graph, EnvironmentType, ConnectionType, PrivacyType } from '@dsnp/graph-sdk'; const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://127.0.0.1:9944'; @@ -22,19 +16,12 @@ const sendStatusCb = ({ status, events }) => { if (status.isInBlock || status.isFinalized) { const msaCreated = events.map(({ event }) => event).find((event) => event.method === 'MsaCreated'); - const schemaCreated = events.map(({ event }) => event).find((event) => event.method === 'SchemaCreated'); const itemizedPageUpdated = events.map(({ event }) => event).find((event) => event.method === 'ItemizedPageUpdated'); if (msaCreated) { resolve(msaCreated.data.msaId); } else { resolve(); } - if (schemaCreated) { - console.log('Schema Created: ' + schemaCreated.data); - resolve(schemaCreated.data.schemaId); - } else { - resolve(); - } if (itemizedPageUpdated) { console.log('Itemized Page Updated: ' + itemizedPageUpdated.data); resolve(itemizedPageUpdated.data); @@ -85,24 +72,6 @@ async function main() { let currentNonce = (await api.rpc.system.accountNextIndex(alice.address)).toBn().toNumber(); console.log('Current nonce: ' + currentNonce); - // Create Schemas - const txSchema1 = api.tx.schemas.createSchema(JSON.stringify(userPublicFollows), 'AvroBinary', 'Paginated'); - await new Promise((resolve) => txSchema1.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); - currentNonce++; - console.log('Public Follow Schema created'); - const txSchema2 = api.tx.schemas.createSchema(JSON.stringify(userPrivateFollows), 'AvroBinary', 'Paginated'); - await new Promise((resolve) => txSchema2.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); - currentNonce++; - console.log('Private Follow Schema created'); - const txSchema3 = api.tx.schemas.createSchema(JSON.stringify(userPrivateConnections), 'AvroBinary', 'Paginated'); - await new Promise((resolve) => txSchema3.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); - currentNonce++; - console.log('Private Friend Schema created'); - const txSchema4 = api.tx.schemas.createSchemaViaGovernance(alice.publicKey, JSON.stringify(publicKey), 'AvroBinary', 'Itemized', ['AppendOnly']); - let sudoTx = api.tx.sudo.sudo(txSchema4); - await new Promise((resolve) => sudoTx.signAndSend(alice, { nonce: currentNonce }, sendStatusCb(resolve))); - currentNonce++; - console.log('Public Key Schema created'); // Delegations const delegators = ['//Bob', '//Charlie', '//Dave', '//Eve', '//Ferdie']; const create = createViaDelegation(api, alice); @@ -111,7 +80,8 @@ async function main() { let graphPubKey = hexToU8a('0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02'); // let graphPrivKey = hexToU8a('0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5'); // Add public to users - const environment = { environmentType: EnvironmentType.Dev, config: getTestConfig(4) }; + // When using dsnp/instant-seal-node-with-deployed-schemas, the graph environment is the same as mainnet + const environment = { environmentType: EnvironmentType.Mainnet }; const graph = new Graph(environment); // eslint-disable-next-line no-restricted-syntax @@ -120,7 +90,7 @@ async function main() { { type: 'AddGraphKey', ownerDsnpUserId: msaId.toString(), - newPublicKey: graphPubKey + newPublicKey: graphPubKey, }, ]; graph.applyActions(actions); @@ -134,16 +104,22 @@ async function main() { ]; let tx = api.tx.statefulStorage.applyItemActions(msaId, 4, 0, keyActions); // eslint-disable-next-line no-await-in-loop - await new Promise((resolve) => tx.signAndSend(alice, { - nonce: currentNonce - }, sendStatusCb(resolve))); + await new Promise((resolve) => + tx.signAndSend( + alice, + { + nonce: currentNonce, + }, + sendStatusCb(resolve), + ), + ); currentNonce++; } - const capacityResult = (await api.query.capacity.capacityLedger(1)); + const capacityResult = await api.query.capacity.capacityLedger(1); const capacity = capacityResult.unwrapOr({ totalCapacityIssued: 0n }); const stakeAmount = 2000000000000000n - (typeof capacity.totalCapacityIssued === 'bigint' ? capacity.totalCapacityIssued : capacity.totalCapacityIssued.toBigInt()); await api.tx.capacity.stake(1, stakeAmount).signAndSend(alice, { nonce: currentNonce }); - + console.log('Create Provider 1 as Alice and Delegator 2, 3, 4, 5, 6'); console.log('Public keys added to delegators'); console.log('Staked capacity to provider: ' + stakeAmount); @@ -183,4 +159,4 @@ main() console.error(r); process.exit(1); }) - .finally(process.exit); \ No newline at end of file + .finally(process.exit); diff --git a/env.template b/env.template index 18fbd839..3177ee04 100644 --- a/env.template +++ b/env.template @@ -27,40 +27,10 @@ DEBOUNCE_SECONDS=10 # value: number (may be percentage, ie '80', or absolute amount of capacity) CAPACITY_LIMIT='{"type":"percentage", "value":80}' -# Graph environment type. This can be 'Dev' or 'Rococo', 'TestnetPaseo', or 'Mainnet'. -GRAPH_ENVIRONMENT_TYPE=Dev - -# [NOTE]: The following config is only used for Dev environments. -# Add the graph environment config in JSON format only used for Dev environments. -# Be careful to escape any inner quotes as this is in a .env file. -GRAPH_ENVIRONMENT_DEV_CONFIG='{ - "sdkMaxStaleFriendshipDays": 100, - "maxPageId": 100, - "dsnpVersions": [ - "1.0" - ], - "maxGraphPageSizeBytes": 100, - "maxKeyPageSizeBytes": 100, - "schemaMap": { - "1": { - "dsnpVersion": "1.0", - "connectionType": "follow", - "privacyType": "public" - }, - "2": { - "dsnpVersion": "1.0", - "connectionType": "follow", - "privacyType": "private" - }, - "3": { - "dsnpVersion": "1.0", - "connectionType": "friendship", - "privacyType": "private" - } - }, - "graphPublicKeySchemaId": 4 - } - ' +# Add the graph environment type. This can be 'TestnetPaseo' or 'Mainnet'. +# Mainnet is also used for dsnp/instant-seal-node-with-deployed-schemas:latest +GRAPH_ENVIRONMENT_TYPE=Mainnet + PROVIDER_ACCOUNT_SEED_PHRASE="//Ferdie" # Whether to instantiate/activate reconnection-service features diff --git a/libs/common/src/blockchain/blockchain.service.spec.ts b/libs/common/src/blockchain/blockchain.service.spec.ts index a6468b19..7bc849e4 100644 --- a/libs/common/src/blockchain/blockchain.service.spec.ts +++ b/libs/common/src/blockchain/blockchain.service.spec.ts @@ -25,7 +25,6 @@ describe('BlockchainService', () => { getRedisUrl: jest.fn(), getFrequencyUrl: jest.fn(), getGraphEnvironmentType: jest.fn(), - getGraphEnvironmentConfig: jest.fn(), getProviderAccountSeedPhrase: jest.fn(), redisUrl: jest.fn(), frequencyUrl: jest.fn(), diff --git a/libs/common/src/config/config.service.spec.ts b/libs/common/src/config/config.service.spec.ts index f7536986..79179d92 100644 --- a/libs/common/src/config/config.service.spec.ts +++ b/libs/common/src/config/config.service.spec.ts @@ -1,9 +1,12 @@ +import dotenv from 'dotenv'; import { Test } from '@nestjs/testing'; import { describe, it, expect, beforeAll, jest } from '@jest/globals'; import { ConfigModule } from '@nestjs/config'; import { ConfigService } from './config.service'; import { configModuleOptions } from './env.config'; +dotenv.config({ path: 'env.template', override: true }); + const setupConfigService = async (envObj: any): Promise => { jest.resetModules(); Object.keys(process.env).forEach((key) => { @@ -40,7 +43,6 @@ describe('GraphSericeConfig', () => { RECONNECTION_SERVICE_REQUIRED: undefined, BLOCKCHAIN_SCAN_INTERVAL_MINUTES: undefined, GRAPH_ENVIRONMENT_TYPE: undefined, - GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, PROVIDER_ACCOUNT_SEED_PHRASE: undefined, PROVIDER_ID: undefined, PROVIDER_BASE_URL: undefined, @@ -86,16 +88,6 @@ describe('GraphSericeConfig', () => { await expect(setupConfigService({ API_PORT: -1, ...env })).rejects.toBeDefined(); }); - it('missing graph environment dev config should fail', async () => { - const { GRAPH_ENVIRONMENT_TYPE: dummy, GRAPH_ENVIRONMENT_DEV_CONFIG: dummy2, ...env } = ALL_ENV; - await expect(setupConfigService({ GRAPH_ENVIRONMENT_TYPE: 'Dev', GRAPH_ENVIRONMENT_DEV_CONFIG: undefined, ...env })).rejects.toBeDefined(); - }); - - it('invalid graph environment dev config should fail', async () => { - const { GRAPH_ENVIRONMENT_TYPE: dummy, GRAPH_ENVIRONMENT_DEV_CONFIG: dummy2, ...env } = ALL_ENV; - await expect(setupConfigService({ GRAPH_ENVIRONMENT_TYPE: 'Dev', GRAPH_ENVIRONMENT_DEV_CONFIG: 'invalid json', ...env })).rejects.toBeDefined(); - }); - it('missing capacity limits should fail', async () => { const { CAPACITY_LIMIT: dummy, ...env } = ALL_ENV; await expect(setupConfigService({ CAPACITY_LIMIT: undefined, ...env })).rejects.toBeDefined(); @@ -148,10 +140,6 @@ describe('GraphSericeConfig', () => { expect(graphServiceConfig.getGraphEnvironmentType()).toStrictEqual(ALL_ENV.GRAPH_ENVIRONMENT_TYPE); }); - it('should get graph environment dev config', () => { - expect(graphServiceConfig.getGraphEnvironmentConfig()).toStrictEqual(ALL_ENV.GRAPH_ENVIRONMENT_DEV_CONFIG); - }); - it('should get provider account seed phrase', () => { expect(graphServiceConfig.getProviderAccountSeedPhrase()).toStrictEqual(ALL_ENV.PROVIDER_ACCOUNT_SEED_PHRASE); }); diff --git a/libs/common/src/config/config.service.ts b/libs/common/src/config/config.service.ts index 19d1c888..e8428e18 100644 --- a/libs/common/src/config/config.service.ts +++ b/libs/common/src/config/config.service.ts @@ -14,7 +14,6 @@ export interface ConfigEnvironmentVariables { API_PORT: number; DEBOUNCE_SECONDS: number; GRAPH_ENVIRONMENT_TYPE: keyof EnvironmentType; - GRAPH_ENVIRONMENT_DEV_CONFIG?: string; PROVIDER_ACCOUNT_SEED_PHRASE: string; PROVIDER_ID: string; RECONNECTION_SERVICE_REQUIRED: boolean; @@ -82,10 +81,6 @@ export class ConfigService { return this.nestConfigService.get('GRAPH_ENVIRONMENT_TYPE')!; } - public getGraphEnvironmentConfig(): string { - return this.nestConfigService.get('GRAPH_ENVIRONMENT_DEV_CONFIG')!; - } - public getProviderAccountSeedPhrase(): string { return this.nestConfigService.get('PROVIDER_ACCOUNT_SEED_PHRASE')!; } diff --git a/libs/common/src/config/env.config.ts b/libs/common/src/config/env.config.ts index 1abee137..bffc7c63 100644 --- a/libs/common/src/config/env.config.ts +++ b/libs/common/src/config/env.config.ts @@ -13,21 +13,7 @@ export const configModuleOptions: ConfigModuleOptions = { BLOCKCHAIN_SCAN_INTERVAL_MINUTES: Joi.number() .min(1) .default(3 * 60), - GRAPH_ENVIRONMENT_TYPE: Joi.string().required().valid('Mainnet', 'TestnetPaseo', 'Rococo', 'Dev'), - // GRAPH_ENVIRONMENT_DEV_CONFIG is optional, but if it is set, it must be a valid JSON string - GRAPH_ENVIRONMENT_DEV_CONFIG: Joi.string().when('GRAPH_ENVIRONMENT_TYPE', { - is: 'Dev', - then: Joi.string() - .required() - .custom((value: string, helpers) => { - try { - JSON.parse(value); - } catch (e) { - return helpers.error('any.invalid'); - } - return value; - }), - }), + GRAPH_ENVIRONMENT_TYPE: Joi.string().required().valid('Mainnet', 'TestnetPaseo'), PROVIDER_ACCOUNT_SEED_PHRASE: Joi.string().required(), PROVIDER_ID: Joi.required().custom((value: string, helpers) => { try { diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts index ec61a400..9b0dcb01 100644 --- a/libs/common/src/services/graph-state-manager.ts +++ b/libs/common/src/services/graph-state-manager.ts @@ -8,7 +8,6 @@ import { ImportBundle, Update, Config, - DevEnvironment, EnvironmentType, DsnpKeys, DsnpPublicKey, @@ -69,14 +68,7 @@ export class GraphStateManager implements OnApplicationBootstrap { private blockchainService: BlockchainService, ) { const environmentType = this.configService.getGraphEnvironmentType(); - if (environmentType === EnvironmentType.Dev.toString()) { - const configJson = this.configService.getGraphEnvironmentConfig(); - const config: Config = JSON.parse(configJson); - const devEnvironment: DevEnvironment = { environmentType: EnvironmentType.Dev, config }; - this.environment = devEnvironment; - } else { - this.environment = { environmentType: EnvironmentType[environmentType] }; - } + this.environment = { environmentType: EnvironmentType[environmentType] }; this.graphState = new Graph(this.environment); GraphStateManager.graphStateFinalizer.register(this, this.graphState); diff --git a/package-lock.json b/package-lock.json index d2ceb1da..ae38b8ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5754,11 +5754,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -7455,9 +7455,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, diff --git a/package.json b/package.json index 56ec9f11..57140c7b 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "docker-stop:dev": "docker-compose -f docker-compose.dev.yaml stop", "clean": "rm -Rf dist", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "pretest": "cp env.template .env", "test": "jest --coverage --verbose", "test:e2e": "set -a ; . .env ; jest --config ./apps/api/test/jest-e2e.json --detectOpenHandles" }, From 71f8f3f546e0df4bfe46434129756365f5b3f75b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 10:32:10 -0400 Subject: [PATCH 40/53] Bump ws from 5.2.3 to 5.2.4 in the npm_and_yarn group (#88) Bumps the npm_and_yarn group with 1 update: [ws](https://github.com/websockets/ws). Updates `ws` from 5.2.3 to 5.2.4
Release notes

Sourced from ws's releases.

5.2.4

Bug fixes

  • Backported e55e5106 to the 5.x release line (4abd8f6d).
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ws&package-manager=npm_and_yarn&previous-version=5.2.3&new-version=5.2.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/AmplicaLabs/graph-service/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae38b8ea..b947686c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12159,9 +12159,9 @@ } }, "node_modules/thrift/node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.4.tgz", + "integrity": "sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==", "dependencies": { "async-limiter": "~1.0.0" } @@ -12974,9 +12974,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, From 4a8a041029d995673548207540f045d7c7f6d694 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 10:34:32 -0400 Subject: [PATCH 41/53] Bump ws from 5.2.3 to 5.2.4 in /apps/api/test/setup in the npm_and_yarn group across 1 directory (#89) Bumps the npm_and_yarn group with 1 update in the /apps/api/test/setup directory: [ws](https://github.com/websockets/ws). Updates `ws` from 5.2.3 to 5.2.4
Release notes

Sourced from ws's releases.

5.2.4

Bug fixes

  • Backported e55e5106 to the 5.x release line (4abd8f6d).
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ws&package-manager=npm_and_yarn&previous-version=5.2.3&new-version=5.2.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/AmplicaLabs/graph-service/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Joe Caputo --- apps/api/test/setup/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/api/test/setup/package-lock.json b/apps/api/test/setup/package-lock.json index b06553d2..49a54a2c 100644 --- a/apps/api/test/setup/package-lock.json +++ b/apps/api/test/setup/package-lock.json @@ -1103,9 +1103,9 @@ } }, "node_modules/thrift/node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.4.tgz", + "integrity": "sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==", "optional": true, "dependencies": { "async-limiter": "~1.0.0" @@ -1223,9 +1223,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, From 7233329825324c847551b8832e32db52162755bb Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Thu, 27 Jun 2024 17:10:33 -0400 Subject: [PATCH 42/53] feat: first pass at bootstrapping k6 load tests (#81) # Description First pass at getting the framework for load testing with K6 setup in this repo closes #57 --- .tool-versions | 2 +- apps/api/src/api.controller.ts | 1 - apps/api/src/api.service.ts | 6 +- apps/api/src/main.ts | 4 +- apps/api/src/metadata.ts | 32 +- apps/api/test/app.e2e-spec.ts | 102 ++- apps/api/test/e2e-setup.mock.spec.ts | 30 + apps/api/test/setup/index.js | 162 ---- apps/api/test/setup/index.ts | 91 ++ apps/api/test/setup/package-lock.json | 835 +++++++++++++++--- apps/api/test/setup/package.json | 12 +- .../request.processor.service.ts | 2 +- docker-compose.yaml | 6 +- k6-test/.openapi-generator-ignore | 23 + k6-test/.openapi-generator/FILES | 2 + k6-test/.openapi-generator/VERSION | 1 + k6-test/README.md | 15 + k6-test/package-lock.json | 22 + k6-test/package.json | 15 + k6-test/script.js | 125 +++ .../src/blockchain/blockchain.service.ts | 6 +- libs/common/src/config/swagger_config.ts | 2 +- ...on.type.dto.ts => connection-type.enum.ts} | 0 libs/common/src/dtos/connection.dto.ts | 32 + libs/common/src/dtos/connections.dto.ts | 22 - .../{direction.dto.ts => direction.enum.ts} | 0 libs/common/src/dtos/dsnp-graph-edge.dto.ts | 14 + libs/common/src/dtos/dsnp.graph.edge.dto.ts | 11 - .../src/dtos/graph-change-notification.dto.ts | 37 + .../src/dtos/graph-change-response.dto.ts | 6 + libs/common/src/dtos/graph-key-pair.dto.ts | 22 + .../common/src/dtos/graph-query-params.dto.ts | 22 + .../src/dtos/graph.change.notification.dto.ts | 7 - .../dtos/graph.change.request.reference.ts | 3 - libs/common/src/dtos/graph.key.pair.dto.ts | 17 - libs/common/src/dtos/graph.query.dto.ts | 18 - .../{key.type.dto.ts => key-type.enum.ts} | 0 ...ivacy.type.dto.ts => privacy-type.enum.ts} | 0 libs/common/src/dtos/provider-graph.dto.ts | 26 + libs/common/src/dtos/provider.graph.dto.ts | 19 - libs/common/src/dtos/user-graph.dto.ts | 10 + libs/common/src/dtos/user.graph.dto.ts | 7 - libs/common/src/dtos/watch-graphs.dto.ts | 5 +- libs/common/src/index.ts | 20 +- .../provider.graph.update-job.interface.ts | 4 +- libs/common/src/services/async_debouncer.ts | 4 +- .../src/services/graph-state-manager.ts | 4 +- package-lock.json | 515 ++++++++++- package.json | 3 + test-setup/main.ts | 18 + 50 files changed, 1866 insertions(+), 476 deletions(-) create mode 100644 apps/api/test/e2e-setup.mock.spec.ts delete mode 100644 apps/api/test/setup/index.js create mode 100644 apps/api/test/setup/index.ts create mode 100644 k6-test/.openapi-generator-ignore create mode 100644 k6-test/.openapi-generator/FILES create mode 100644 k6-test/.openapi-generator/VERSION create mode 100644 k6-test/README.md create mode 100644 k6-test/package-lock.json create mode 100644 k6-test/package.json create mode 100644 k6-test/script.js rename libs/common/src/dtos/{connection.type.dto.ts => connection-type.enum.ts} (100%) create mode 100644 libs/common/src/dtos/connection.dto.ts delete mode 100644 libs/common/src/dtos/connections.dto.ts rename libs/common/src/dtos/{direction.dto.ts => direction.enum.ts} (100%) create mode 100644 libs/common/src/dtos/dsnp-graph-edge.dto.ts delete mode 100644 libs/common/src/dtos/dsnp.graph.edge.dto.ts create mode 100644 libs/common/src/dtos/graph-change-notification.dto.ts create mode 100644 libs/common/src/dtos/graph-change-response.dto.ts create mode 100644 libs/common/src/dtos/graph-key-pair.dto.ts create mode 100644 libs/common/src/dtos/graph-query-params.dto.ts delete mode 100644 libs/common/src/dtos/graph.change.notification.dto.ts delete mode 100644 libs/common/src/dtos/graph.change.request.reference.ts delete mode 100644 libs/common/src/dtos/graph.key.pair.dto.ts delete mode 100644 libs/common/src/dtos/graph.query.dto.ts rename libs/common/src/dtos/{key.type.dto.ts => key-type.enum.ts} (100%) rename libs/common/src/dtos/{privacy.type.dto.ts => privacy-type.enum.ts} (100%) create mode 100644 libs/common/src/dtos/provider-graph.dto.ts delete mode 100644 libs/common/src/dtos/provider.graph.dto.ts create mode 100644 libs/common/src/dtos/user-graph.dto.ts delete mode 100644 libs/common/src/dtos/user.graph.dto.ts create mode 100644 test-setup/main.ts diff --git a/.tool-versions b/.tool-versions index 8ead549e..958fb369 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -nodejs 18.16.0 +nodejs 20.12.2 diff --git a/apps/api/src/api.controller.ts b/apps/api/src/api.controller.ts index 757cc386..8247e582 100644 --- a/apps/api/src/api.controller.ts +++ b/apps/api/src/api.controller.ts @@ -26,7 +26,6 @@ export class ApiController { }; } - // Fetch graphs for list of `dsnpIds` at optional `blockNumber` // Fetch graphs for list of `dsnpIds` at optional `blockNumber` @Put('graphs') @HttpCode(HttpStatus.OK) diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index f9fbc0a9..6c4b167c 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -1,4 +1,4 @@ -import { Injectable, Logger, OnApplicationShutdown } from '@nestjs/common'; +import { BeforeApplicationShutdown, Injectable, Logger } from '@nestjs/common'; import { InjectRedis } from '@songkeys/nestjs-redis'; import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; @@ -20,7 +20,7 @@ import { ConfigService } from '../../../libs/common/src/config/config.service'; import { BlockchainService } from '../../../libs/common/src/blockchain/blockchain.service'; @Injectable() -export class ApiService implements OnApplicationShutdown { +export class ApiService implements BeforeApplicationShutdown { private readonly logger: Logger; private asyncDebouncerService: AsyncDebouncerService; @@ -36,7 +36,7 @@ export class ApiService implements OnApplicationShutdown { this.asyncDebouncerService = new AsyncDebouncerService(this.redis, this.configService, this.graphStateManager); } - onApplicationShutdown(signal?: string | undefined) { + beforeApplicationShutdown(signal?: string | undefined) { try { this.redis.del(QueueConstants.REDIS_WATCHER_PREFIX); this.redis.del(QueueConstants.DEBOUNCER_CACHE_KEY); diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 662e1fc5..0a33c65f 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -28,7 +28,9 @@ async function bootstrap() { app.enableShutdownHooks(); app.useGlobalPipes(new ValidationPipe()); await initSwagger(app, '/api/docs/swagger'); - await app.listen(process.env.API_PORT ?? 3000); + const port = process.env.API_PORT || 3000; + logger.log(`Listening on port ${port}`); + await app.listen(port); } catch (e) { await app.close(); logger.log('****** MAIN CATCH ********'); diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index 31bb91c0..a6a006d3 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,25 +1,25 @@ /* eslint-disable */ export default async () => { const t = { - ['../../../libs/common/src/dtos/dsnp.graph.edge.dto']: await import('../../../libs/common/src/dtos/dsnp.graph.edge.dto'), - ['../../../libs/common/src/dtos/key.type.dto']: await import('../../../libs/common/src/dtos/key.type.dto'), - ['../../../libs/common/src/dtos/privacy.type.dto']: await import('../../../libs/common/src/dtos/privacy.type.dto'), - ['../../../libs/common/src/dtos/graph.key.pair.dto']: await import('../../../libs/common/src/dtos/graph.key.pair.dto'), - ['../../../libs/common/src/dtos/direction.dto']: await import('../../../libs/common/src/dtos/direction.dto'), - ['../../../libs/common/src/dtos/connection.type.dto']: await import('../../../libs/common/src/dtos/connection.type.dto'), - ['../../../libs/common/src/dtos/connections.dto']: await import('../../../libs/common/src/dtos/connections.dto'), - ['../../../libs/common/src/dtos/user.graph.dto']: await import('../../../libs/common/src/dtos/user.graph.dto'), - ['../../../libs/common/src/dtos/graph.change.request.reference']: await import('../../../libs/common/src/dtos/graph.change.request.reference'), + ['../../../libs/common/src/dtos/dsnp.graph.edge.dto']: await import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), + ['../../../libs/common/src/dtos/key.type.dto']: await import('../../../libs/common/src/dtos/key-type.enum'), + ['../../../libs/common/src/dtos/privacy.type.dto']: await import('../../../libs/common/src/dtos/privacy-type.enum'), + ['../../../libs/common/src/dtos/graph.key.pair.dto']: await import('../../../libs/common/src/dtos/graph-key-pair.dto'), + ['../../../libs/common/src/dtos/direction.dto']: await import('../../../libs/common/src/dtos/direction.enum'), + ['../../../libs/common/src/dtos/connection.type.dto']: await import('../../../libs/common/src/dtos/connection-type.enum'), + ['../../../libs/common/src/dtos/connections.dto']: await import('../../../libs/common/src/dtos/connection.dto'), + ['../../../libs/common/src/dtos/user.graph.dto']: await import('../../../libs/common/src/dtos/user-graph.dto'), + ['../../../libs/common/src/dtos/graph.change.request.reference']: await import('../../../libs/common/src/dtos/graph-change-response.dto'), }; return { '@nestjs/swagger': { models: [ [ - import('../../../libs/common/src/dtos/dsnp.graph.edge.dto'), + import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), { DsnpGraphEdge: { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }, ], [ - import('../../../libs/common/src/dtos/user.graph.dto'), + import('../../../libs/common/src/dtos/user-graph.dto'), { UserGraphDto: { dsnpId: { required: true, type: () => String }, @@ -28,7 +28,7 @@ export default async () => { }, ], [ - import('../../../libs/common/src/dtos/graph.key.pair.dto'), + import('../../../libs/common/src/dtos/graph-key-pair.dto'), { GraphKeyPairDto: { publicKey: { required: true, type: () => String }, @@ -38,7 +38,7 @@ export default async () => { }, ], [ - import('../../../libs/common/src/dtos/graph.query.dto'), + import('../../../libs/common/src/dtos/graph-query-params.dto'), { GraphsQueryParamsDto: { dsnpIds: { required: true, type: () => [String] }, @@ -48,7 +48,7 @@ export default async () => { }, ], [ - import('../../../libs/common/src/dtos/connections.dto'), + import('../../../libs/common/src/dtos/connection.dto'), { ConnectionDto: { dsnpId: { required: true, type: () => String }, @@ -59,7 +59,7 @@ export default async () => { }, ], [ - import('../../../libs/common/src/dtos/provider.graph.dto'), + import('../../../libs/common/src/dtos/provider-graph.dto'), { ProviderGraphDto: { dsnpId: { required: true, type: () => String }, @@ -73,7 +73,7 @@ export default async () => { { WatchGraphsDto: { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }, ], [ - import('../../../libs/common/src/dtos/graph.change.notification.dto'), + import('../../../libs/common/src/dtos/graph-change-notification.dto'), { GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }, ], ], diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 78237483..47d2ed3e 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -5,21 +5,26 @@ import request from 'supertest'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { ApiModule } from '../src/api.module'; import { ConnectionDto, GraphKeyPairDto, GraphsQueryParamsDto, KeyType, PrivacyType, ProviderGraphDto } from '../../../libs/common/src'; -import { Direction } from '../../../libs/common/src/dtos/direction.dto'; -import { ConnectionType } from '../../../libs/common/src/dtos/connection.type.dto'; +import { Direction } from '../../../libs/common/src/dtos/direction.enum'; +import { ConnectionType } from '../../../libs/common/src/dtos/connection-type.enum'; +import { ChainUser, ExtrinsicHelper } from '@amplica-labs/frequency-scenario-template'; +import { setupProviderAndUsers } from './e2e-setup.mock.spec'; +import { u8aToHex } from '@polkadot/util'; -describe('Graph Service E2E request verification!', () => { let app: INestApplication; - let module: TestingModule; - // eslint-disable-next-line no-promise-executor-return - const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); - beforeEach(async () => { - module = await Test.createTestingModule({ + let testModule: TestingModule; + let users: ChainUser[]; + let eventEmitter: EventEmitter2; + +describe('Graph Service E2E request verification!', () => { + beforeAll(async () => { + ({ users } = await setupProviderAndUsers()); + testModule = await Test.createTestingModule({ imports: [ApiModule], }).compile(); - app = module.createNestApplication(); - const eventEmitter = app.get(EventEmitter2); + app = testModule.createNestApplication(); + eventEmitter = app.get(EventEmitter2); eventEmitter.on('shutdown', async () => { await app.close(); }); @@ -28,16 +33,21 @@ describe('Graph Service E2E request verification!', () => { await app.init(); }); + afterAll(async () => { + await app.close(); + await ExtrinsicHelper.disconnect(); + }); + it('(GET) /api/health', () => request(app.getHttpServer()).get('/api/health').expect(200).expect({ status: 200, message: 'Service is healthy' })); describe('(POST) /api/update-graph', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), connections: { data: [ { - dsnpId: '4', + dsnpId: users[1].msaId!.toString(), privacyType: PrivacyType.Public, direction: Direction.ConnectionTo, connectionType: ConnectionType.Follow, @@ -56,11 +66,11 @@ describe('Graph Service E2E request verification!', () => { it('Two Valid public graph update requests should work', async () => { const validGraphChangeRequests: ProviderGraphDto[] = [ { - dsnpId: '4', + dsnpId: users[1].msaId!.toString(), connections: { data: [ { - dsnpId: '5', + dsnpId: users[2].msaId!.toString(), privacyType: PrivacyType.Public, direction: Direction.ConnectionTo, connectionType: ConnectionType.Follow, @@ -69,11 +79,11 @@ describe('Graph Service E2E request verification!', () => { }, }, { - dsnpId: '6', + dsnpId: users[2].msaId!.toString(), connections: { data: [ { - dsnpId: '3', + dsnpId: users[0].msaId!.toString(), privacyType: PrivacyType.Public, direction: Direction.ConnectionTo, connectionType: ConnectionType.Follow, @@ -97,11 +107,11 @@ describe('Graph Service E2E request verification!', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), connections: { data: [ { - dsnpId: '4', + dsnpId: users[1].msaId!.toString(), privacyType: PrivacyType.Private, direction: Direction.ConnectionTo, connectionType: ConnectionType.Follow, @@ -111,8 +121,8 @@ describe('Graph Service E2E request verification!', () => { graphKeyPairs: [ { keyType: KeyType.X25519, - publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', - privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), } as GraphKeyPairDto, ], }; @@ -126,7 +136,7 @@ describe('Graph Service E2E request verification!', () => { it('Get graph request should work', async () => { const userGraphGet: GraphsQueryParamsDto = { - dsnpIds: ['2'], + dsnpIds: [users[0].msaId!.toString()], privacyType: PrivacyType.Public, } as GraphsQueryParamsDto; @@ -134,18 +144,18 @@ describe('Graph Service E2E request verification!', () => { .put(`/api/graphs`) .send(userGraphGet) .expect(200) - .expect((res) => expect(res.body[0].dsnpId).toBe('2')); + .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); }); it('Get graph request should work with private graph', async () => { const userGraphGet: GraphsQueryParamsDto = { - dsnpIds: ['2'], + dsnpIds: [users[0].msaId!.toString()], privacyType: PrivacyType.Private, graphKeyPairs: [ { keyType: KeyType.X25519, - publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', - privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), } as GraphKeyPairDto, ], } as GraphsQueryParamsDto; @@ -154,18 +164,18 @@ describe('Graph Service E2E request verification!', () => { .put(`/api/graphs`) .send(userGraphGet) .expect(200) - .expect((res) => expect(res.body[0].dsnpId).toBe('2')); + .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); }); }); describe('(POST) /api/update-graph with public disconnect', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), connections: { data: [ { - dsnpId: '4', + dsnpId: users[1].msaId!.toString(), privacyType: PrivacyType.Public, direction: Direction.Disconnect, connectionType: ConnectionType.Follow, @@ -185,11 +195,11 @@ describe('Graph Service E2E request verification!', () => { describe('(POST) /api/update-graph with private disconnect', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), connections: { data: [ { - dsnpId: '4', + dsnpId: users[1].msaId!.toString(), privacyType: PrivacyType.Private, direction: Direction.Disconnect, connectionType: ConnectionType.Follow, @@ -199,8 +209,8 @@ describe('Graph Service E2E request verification!', () => { graphKeyPairs: [ { keyType: KeyType.X25519, - publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', - privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), } as GraphKeyPairDto, ], }; @@ -213,14 +223,14 @@ describe('Graph Service E2E request verification!', () => { }); }); - describe('(POST) /api/update-graph with private friend request from 2', () => { + describe('(POST) /api/update-graph with private friend request user A -> B', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), connections: { data: [ { - dsnpId: '3', + dsnpId: users[1].msaId!.toString(), privacyType: PrivacyType.Private, direction: Direction.ConnectionTo, connectionType: ConnectionType.Friendship, @@ -230,8 +240,8 @@ describe('Graph Service E2E request verification!', () => { graphKeyPairs: [ { keyType: KeyType.X25519, - publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', - privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), } as GraphKeyPairDto, ], }; @@ -244,14 +254,14 @@ describe('Graph Service E2E request verification!', () => { }); }); - describe('(POST) /api/update-graph with private friend request from 3', () => { + describe('(POST) /api/update-graph with private friend request from user B -> A', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '3', + dsnpId: users[1].msaId!.toString(), connections: { data: [ { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), privacyType: PrivacyType.Private, direction: Direction.ConnectionTo, connectionType: ConnectionType.Friendship, @@ -261,8 +271,8 @@ describe('Graph Service E2E request verification!', () => { graphKeyPairs: [ { keyType: KeyType.X25519, - publicKey: '0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02', - privateKey: '0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5', + publicKey: u8aToHex(users[1].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[1].graphKeyPair?.secretKey), } as GraphKeyPairDto, ], }; @@ -277,11 +287,11 @@ describe('Graph Service E2E request verification!', () => { describe('(POST) /api/update-graph with bi-directional connection', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: '2', + dsnpId: users[0].msaId!.toString(), connections: { data: [ { - dsnpId: '5', + dsnpId: users[1].msaId!.toString(), privacyType: PrivacyType.Public, direction: Direction.Bidirectional, connectionType: ConnectionType.Follow, @@ -297,8 +307,4 @@ describe('Graph Service E2E request verification!', () => { .expect((res) => expect(res.text).toContain('referenceId')); }); }); - - afterEach(async () => { - await app.close(); - }); }); diff --git a/apps/api/test/e2e-setup.mock.spec.ts b/apps/api/test/e2e-setup.mock.spec.ts new file mode 100644 index 00000000..9f2d6900 --- /dev/null +++ b/apps/api/test/e2e-setup.mock.spec.ts @@ -0,0 +1,30 @@ +/* eslint-disable no-await-in-loop */ +/* eslint-disable no-restricted-syntax */ +import { + initialize, + getCurrentBlockNumber, + provisionProvider, + initializeLocalUsers, + ExtrinsicHelper, +} from '@amplica-labs/frequency-scenario-template'; +import { cryptoWaitReady } from '@polkadot/util-crypto'; +import log from 'loglevel'; + +export const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://0.0.0.0:9944'; +export const BASE_SEED_PHRASE = process.env.SEED_PHRASE || '//Alice'; + +export async function setupProviderAndUsers() { + await cryptoWaitReady(); + await initialize(FREQUENCY_URL); + log.setLevel('trace'); + + const currentBlockNumber = await getCurrentBlockNumber(); + + // Get keys and MSA IDs for users provisioned in setup + const provider = await provisionProvider(BASE_SEED_PHRASE, 'Alice'); + const users = await initializeLocalUsers(`${BASE_SEED_PHRASE}//users`, 4); + + const maxMsaId = (await ExtrinsicHelper.apiPromise.query.msa.currentMsaIdentifierMaximum()).toString(); + + return { provider, users, currentBlockNumber, maxMsaId }; +} diff --git a/apps/api/test/setup/index.js b/apps/api/test/setup/index.js deleted file mode 100644 index 0e9ef962..00000000 --- a/apps/api/test/setup/index.js +++ /dev/null @@ -1,162 +0,0 @@ -import { ApiPromise, WsProvider } from '@polkadot/api'; -import { Keyring } from '@polkadot/keyring'; -import { waitReady } from '@polkadot/wasm-crypto'; -import { _0n, hexToU8a, u8aToHex, u8aWrapBytes } from '@polkadot/util'; -import { userPrivateConnections, userPrivateFollows, publicKey, userPublicFollows } from '@dsnp/frequency-schemas/dsnp'; -import { DsnpVersion, Graph, EnvironmentType, ConnectionType, PrivacyType } from '@dsnp/graph-sdk'; - -const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://127.0.0.1:9944'; - -function signPayloadWithKeyring(signingAccount, payload) { - return { Sr25519: u8aToHex(signingAccount.sign(u8aWrapBytes(payload.toU8a()))) }; -} - -const sendStatusCb = - (resolve) => - ({ status, events }) => { - if (status.isInBlock || status.isFinalized) { - const msaCreated = events.map(({ event }) => event).find((event) => event.method === 'MsaCreated'); - const itemizedPageUpdated = events.map(({ event }) => event).find((event) => event.method === 'ItemizedPageUpdated'); - if (msaCreated) { - resolve(msaCreated.data.msaId); - } else { - resolve(); - } - if (itemizedPageUpdated) { - console.log('Itemized Page Updated: ' + itemizedPageUpdated.data); - resolve(itemizedPageUpdated.data); - } else { - resolve(); - } - } - }; - -const createViaDelegation = (api, provider) => async (keyUri, baseNonce) => { - // Create delegate - const keyring = new Keyring({ type: 'sr25519' }); - const delegator = keyring.addFromUri(keyUri); - const rawPayload = { authorizedMsaId: 1, expiration: 100, schemaIds: [1, 2, 3, 4] }; - const addProviderPayload = api.registry.createType('PalletMsaAddProvider', rawPayload); - const proof = signPayloadWithKeyring(delegator, addProviderPayload); - - const tx = api.tx.msa.createSponsoredAccountWithDelegation(delegator.address, proof, addProviderPayload.toU8a()); - await new Promise((resolve) => tx.signAndSend(provider, { nonce: baseNonce }, sendStatusCb(resolve))); - - const msaId = await api.query.msa.publicKeyToMsaId(delegator.address); - if (msaId.isNone) throw new Error('Failed to create MSA'); - const msaIdStr = msaId.value.toString(); - - console.log(keyUri + ' should have MSA Id ' + msaIdStr); -}; - -async function main() { - await waitReady(); - const provider = new WsProvider(FREQUENCY_URL, 500, {}, 3_000); - // Connect to the API - const api = await ApiPromise.create({ - provider, - // throwOnConnect: true, - }); - await Promise.race([api.isReady, new Promise((_, reject) => setTimeout(() => reject(new Error('WS Connection Timeout')), 30_000))]); - - console.log('API Connected'); - const keyring = new Keyring({ type: 'sr25519' }); - const alice = keyring.addFromUri('//Alice'); - - // Create Alice MSA - await new Promise((resolve) => api.tx.msa.create().signAndSend(alice, sendStatusCb(resolve))); - console.log('Alice should have MSA Id 1'); - // Create Alice Provider - await new Promise((resolve) => api.tx.msa.createProvider('Alice').signAndSend(alice, sendStatusCb(resolve))); - console.log('Alice (MSA Id 1) should be a provider now'); - - let currentNonce = (await api.rpc.system.accountNextIndex(alice.address)).toBn().toNumber(); - console.log('Current nonce: ' + currentNonce); - // Delegations - const delegators = ['//Bob', '//Charlie', '//Dave', '//Eve', '//Ferdie']; - const create = createViaDelegation(api, alice); - await Promise.all(delegators.map((delegator, i) => create(delegator, currentNonce++))); - let msaUsers1to6 = ['2', '3', '4', '5', '6']; - let graphPubKey = hexToU8a('0x993052b57e8695d9124964f69f624fcc2080be7525c65b1acd089dff235a0e02'); - // let graphPrivKey = hexToU8a('0xf74d39829ac4a814048cbda6b35ee1c3c16fbd2b88f97d552aa344bffb5207a5'); - // Add public to users - // When using dsnp/instant-seal-node-with-deployed-schemas, the graph environment is the same as mainnet - const environment = { environmentType: EnvironmentType.Mainnet }; - const graph = new Graph(environment); - - // eslint-disable-next-line no-restricted-syntax - for (const msaId of msaUsers1to6) { - const actions = [ - { - type: 'AddGraphKey', - ownerDsnpUserId: msaId.toString(), - newPublicKey: graphPubKey, - }, - ]; - graph.applyActions(actions); - const keyExport = graph.exportUserGraphUpdates(msaId.toString()); - const keyActions = [ - { - Add: { - data: Array.from(keyExport[0].payload), - }, - }, - ]; - let tx = api.tx.statefulStorage.applyItemActions(msaId, 4, 0, keyActions); - // eslint-disable-next-line no-await-in-loop - await new Promise((resolve) => - tx.signAndSend( - alice, - { - nonce: currentNonce, - }, - sendStatusCb(resolve), - ), - ); - currentNonce++; - } - const capacityResult = await api.query.capacity.capacityLedger(1); - const capacity = capacityResult.unwrapOr({ totalCapacityIssued: 0n }); - const stakeAmount = 2000000000000000n - (typeof capacity.totalCapacityIssued === 'bigint' ? capacity.totalCapacityIssued : capacity.totalCapacityIssued.toBigInt()); - await api.tx.capacity.stake(1, stakeAmount).signAndSend(alice, { nonce: currentNonce }); - - console.log('Create Provider 1 as Alice and Delegator 2, 3, 4, 5, 6'); - console.log('Public keys added to delegators'); - console.log('Staked capacity to provider: ' + stakeAmount); - console.log('Setup complete'); -} - -function getTestConfig(keySchemaId) { - const config = {}; - config.sdkMaxStaleFriendshipDays = 100; - config.maxPageId = 100; - config.dsnpVersions = [DsnpVersion.Version1_0]; - config.maxGraphPageSizeBytes = 100; - config.maxKeyPageSizeBytes = 100; - const schemaMap = {}; - schemaMap[1] = { - dsnpVersion: DsnpVersion.Version1_0, - connectionType: ConnectionType.Follow, - privacyType: PrivacyType.Public, - }; - schemaMap[2] = { - dsnpVersion: DsnpVersion.Version1_0, - connectionType: ConnectionType.Follow, - privacyType: PrivacyType.Private, - }; - schemaMap[3] = { - dsnpVersion: DsnpVersion.Version1_0, - connectionType: ConnectionType.Friendship, - privacyType: PrivacyType.Private, - }; - config.schemaMap = schemaMap; - config.graphPublicKeySchemaId = keySchemaId; - return config; -} - -main() - .catch((r) => { - console.error(r); - process.exit(1); - }) - .finally(process.exit); diff --git a/apps/api/test/setup/index.ts b/apps/api/test/setup/index.ts new file mode 100644 index 00000000..4f7c8e3e --- /dev/null +++ b/apps/api/test/setup/index.ts @@ -0,0 +1,91 @@ +import log from 'loglevel'; +import { + initialize, + provisionProvider, + ensureProviderStake, + ChainUser, + initializeLocalUsers, + SchemaBuilder, + provisionLocalUserCreationExtrinsics, + provisionUserGraphResets, + provisionUserGraphEncryptionKeys, + ChainEventHandler, + ExtrinsicHelper, + provisionUsersOnChain, +} from '@amplica-labs/frequency-scenario-template'; +import { cryptoWaitReady } from '@polkadot/util-crypto'; + +const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://127.0.0.1:9944'; + +const CAPACITY_AMOUNT_TO_STAKE = 2000000000000000n; + +const BASE_SEED_PHRASE = process.env.SEED_PHRASE || '//Alice'; + +async function main() { + await cryptoWaitReady(); + console.log('Connecting...'); + await initialize(FREQUENCY_URL); + log.setLevel('trace'); + + // Create provider + console.log('Creating/resolving provider...'); + const provider = await provisionProvider(`${BASE_SEED_PHRASE}`, 'Alice'); + console.log(`Provider ID is: ${provider.msaId!.toString()}`); + + // Ensure provider is staked + await ensureProviderStake(provider.keypair, CAPACITY_AMOUNT_TO_STAKE, provider.msaId!); + + // Delegations + const delegators: ChainUser[] = await initializeLocalUsers(`${BASE_SEED_PHRASE}//users`, 256); + + const builder = new SchemaBuilder().withAutoDetectExistingSchema(); + const updateSchema = await builder.withName('dsnp', 'update').resolve(); + const publicKeySchema = await builder.withName('dsnp', 'public-key-key-agreement').resolve(); + const publicFollowsSchema = await builder.withName('dsnp', 'public-follows').resolve(); + const privateFollowsSchema = await builder.withName('dsnp', 'private-follows').resolve(); + const privateConnectionsSchema = await builder.withName('dsnp', 'private-connections').resolve(); + + const schemaIds = [ + updateSchema!.id.toNumber(), + publicKeySchema!.id.toNumber(), + publicFollowsSchema!.id.toNumber(), + privateFollowsSchema!.id.toNumber(), + privateConnectionsSchema!.id.toNumber(), + ]; + + // Create followers + await provisionLocalUserCreationExtrinsics(provider, [...delegators.values()], { schemaIds, allocateHandle: false }); + await provisionUserGraphResets([...delegators.values()]); + await provisionUserGraphEncryptionKeys([...delegators.values()], true); + const eventHandler: ChainEventHandler = (events) => { + events.forEach((eventRecord) => { + const { event } = eventRecord; + if (event && ExtrinsicHelper.apiPromise.events.msa.MsaCreated.is(event)) { + const { msaId, key } = event.data; + const address = key.toString(); + const delegator = delegators.find((d) => d.keypair.address === address); + if (delegator) { + delegator.msaId = msaId; + } else { + console.error('Cannot find delegator ', address); + } + } + }); + }; + + await provisionUsersOnChain(provider.keypair, [...delegators.values()], [eventHandler]); + + console.log(`Created Provider ${provider.msaId?.toString()} as Alice`); + console.log( + 'Created delegated MSAs: ', + delegators.map((d) => d.msaId!.toString()), + ); + console.log('Setup complete'); +} + +main() + .catch((r) => { + console.error(r); + process.exit(1); + }) + .finally(process.exit); diff --git a/apps/api/test/setup/package-lock.json b/apps/api/test/setup/package-lock.json index 49a54a2c..86900c05 100644 --- a/apps/api/test/setup/package-lock.json +++ b/apps/api/test/setup/package-lock.json @@ -9,13 +9,42 @@ "version": "1.0.0", "license": "UNLICENSED", "dependencies": { + "@amplica-labs/frequency-scenario-template": "^1.1.4", "@dsnp/frequency-schemas": "^1.1.0", "@dsnp/graph-sdk": "^1.0.1", "@frequency-chain/api-augment": "^1.10.0", "@polkadot/api": "^10.9.1", "@polkadot/keyring": "^12.4.2", "@polkadot/types": "^10.11.2", - "@polkadot/util": "^12.4.2" + "@polkadot/util": "^12.4.2", + "@polkadot/util-crypto": "^12.6.2", + "loglevel": "^1.9.1" + }, + "devDependencies": { + "tsx": "^4.15.7" + } + }, + "node_modules/@amplica-labs/frequency-scenario-template": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@amplica-labs/frequency-scenario-template/-/frequency-scenario-template-1.1.4.tgz", + "integrity": "sha512-EF9LwMM2WvATUOwWfG6ETpwrvlxImUanuy3A5O/k/IgjFjsBgqW9qNa+z1oGdsKX6FqbcHtc00ijSo+kBClNig==", + "dependencies": { + "@dsnp/frequency-schemas": "^1.1.0", + "@dsnp/graph-sdk": "^1.1.3", + "@frequency-chain/api-augment": "~1.11.1", + "@polkadot/api": "^10.13.1", + "@polkadot/keyring": "^12.6.2", + "@polkadot/types": "^10.13.1", + "@polkadot/types-codec": "^10.13.1", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "@types/minimist": "^1.2.5", + "@types/node": "^20.14.2", + "avsc": "^5.7.7", + "loglevel": "^1.9.1", + "minimist": "^1.2.8", + "rxjs": "^7.8.1", + "unique-names-generator": "^4.7.1" } }, "node_modules/@cspotcode/source-map-support": { @@ -45,9 +74,9 @@ } }, "node_modules/@dsnp/graph-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.0.1.tgz", - "integrity": "sha512-kzrk0OpCLRzcIpqrKiC4Ij+qyxYEp9wDmHgp70eIBRd+gQup2nZHNesHppi4Ua7HdENd20a6k+KCaRIqvcVAOw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.1.3.tgz", + "integrity": "sha512-t/hhGo738BQIYPkfAOWq87tzE2/6Rk/eVdRxWJ5URgLdB8FowNCNWui105Uds5E3dkkjOre/geJbY+McX9caIA==", "engines": { "node": "^14.0.0 || ^16.0.0 || >=17.0.0" } @@ -76,10 +105,378 @@ "node": ">=18.18.2" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@frequency-chain/api-augment": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.10.0.tgz", - "integrity": "sha512-AnjE4N78YQo1VRHoR0uqwfS0/RS1HBm6HSsoEUt40bZcie1BRP44EQ5/bm/xSg4+F7EQZyn8RRH1yM4SNfdQ3g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@frequency-chain/api-augment/-/api-augment-1.11.1.tgz", + "integrity": "sha512-CzVjeGrWl8tbTavygZLUICrncjCC54hM5ioJU1Og2OPoX2P4GYf8xoks8MIyj1yOrYX++mzM6Uf0+nCh77QyFw==", "dependencies": { "@polkadot/api": "^10.9.1", "@polkadot/rpc-provider": "^10.9.1", @@ -130,23 +527,84 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@polkadot-api/client": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/client/-/client-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-0fqK6pUKcGHSG2pBvY+gfSS+1mMdjd/qRygAcKI5d05tKsnZLRnmhb9laDguKmGEIB0Bz9vQqNK3gIN/cfvVwg==", + "optional": true, + "dependencies": { + "@polkadot-api/metadata-builders": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/substrate-bindings": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/substrate-client": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/utils": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" + }, + "peerDependencies": { + "rxjs": ">=7.8.0" + } + }, + "node_modules/@polkadot-api/json-rpc-provider": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-EaUS9Fc3wsiUr6ZS43PQqaRScW7kM6DYbuM/ou0aYjm8N9MBqgDbGm2oL6RE1vAVmOfEuHcXZuZkhzWtyvQUtA==", + "optional": true + }, + "node_modules/@polkadot-api/json-rpc-provider-proxy": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-0hZ8vtjcsyCX8AyqP2sqUHa1TFFfxGWmlXJkit0Nqp9b32MwZqn5eaUAiV2rNuEpoglKOdKnkGtUF8t5MoodKw==", + "optional": true + }, + "node_modules/@polkadot-api/metadata-builders": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/metadata-builders/-/metadata-builders-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-BD7rruxChL1VXt0icC2gD45OtT9ofJlql0qIllHSRYgama1CR2Owt+ApInQxB+lWqM+xNOznZRpj8CXNDvKIMg==", + "optional": true, + "dependencies": { + "@polkadot-api/substrate-bindings": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/utils": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" + } + }, + "node_modules/@polkadot-api/substrate-bindings": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-bindings/-/substrate-bindings-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-N4vdrZopbsw8k57uG58ofO7nLXM4Ai7835XqakN27MkjXMp5H830A1KJE0L9sGQR7ukOCDEIHHcwXVrzmJ/PBg==", + "optional": true, + "dependencies": { + "@noble/hashes": "^1.3.1", + "@polkadot-api/utils": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@scure/base": "^1.1.1", + "scale-ts": "^1.6.0" + } + }, + "node_modules/@polkadot-api/substrate-client": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-client/-/substrate-client-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-lcdvd2ssUmB1CPzF8s2dnNOqbrDa+nxaaGbuts+Vo8yjgSKwds2Lo7Oq+imZN4VKW7t9+uaVcKFLMF7PdH0RWw==", + "optional": true + }, + "node_modules/@polkadot-api/utils": { + "version": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/utils/-/utils-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz", + "integrity": "sha512-0CYaCjfLQJTCRCiYvZ81OncHXEKPzAexCMoVloR+v2nl/O2JRya/361MtPkeNLC6XBoaEgLAG9pWQpH3WePzsw==", + "optional": true + }, "node_modules/@polkadot/api": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.11.2.tgz", - "integrity": "sha512-AorCZxCWCoTtdbl4DPUZh+ACe/pbLIS1BkdQY0AFJuZllm0x/yWzjgampcPd5jQAA/O3iKShRBkZqj6Mk9yG/A==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.13.1.tgz", + "integrity": "sha512-YrKWR4TQR5CDyGkF0mloEUo7OsUA+bdtENpJGOtNavzOQUDEbxFE0PVzokzZfVfHhHX2CojPVmtzmmLxztyJkg==", "dependencies": { - "@polkadot/api-augment": "10.11.2", - "@polkadot/api-base": "10.11.2", - "@polkadot/api-derive": "10.11.2", + "@polkadot/api-augment": "10.13.1", + "@polkadot/api-base": "10.13.1", + "@polkadot/api-derive": "10.13.1", "@polkadot/keyring": "^12.6.2", - "@polkadot/rpc-augment": "10.11.2", - "@polkadot/rpc-core": "10.11.2", - "@polkadot/rpc-provider": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-augment": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/types-create": "10.11.2", - "@polkadot/types-known": "10.11.2", + "@polkadot/rpc-augment": "10.13.1", + "@polkadot/rpc-core": "10.13.1", + "@polkadot/rpc-provider": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-augment": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/types-create": "10.13.1", + "@polkadot/types-known": "10.13.1", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", "eventemitter3": "^5.0.1", @@ -158,15 +616,15 @@ } }, "node_modules/@polkadot/api-augment": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.11.2.tgz", - "integrity": "sha512-PTpnqpezc75qBqUtgrc0GYB8h9UHjfbHSRZamAbecIVAJ2/zc6CqtnldeaBlIu1IKTgBzi3FFtTyYu+ZGbNT2Q==", - "dependencies": { - "@polkadot/api-base": "10.11.2", - "@polkadot/rpc-augment": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-augment": "10.11.2", - "@polkadot/types-codec": "10.11.2", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.13.1.tgz", + "integrity": "sha512-IAKaCp19QxgOG4HKk9RAgUgC/VNVqymZ2GXfMNOZWImZhxRIbrK+raH5vN2MbWwtVHpjxyXvGsd1RRhnohI33A==", + "dependencies": { + "@polkadot/api-base": "10.13.1", + "@polkadot/rpc-augment": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-augment": "10.13.1", + "@polkadot/types-codec": "10.13.1", "@polkadot/util": "^12.6.2", "tslib": "^2.6.2" }, @@ -175,12 +633,12 @@ } }, "node_modules/@polkadot/api-base": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.11.2.tgz", - "integrity": "sha512-4LIjaUfO9nOzilxo7XqzYKCNMtmUypdk8oHPdrRnSjKEsnK7vDsNi+979z2KXNXd2KFSCFHENmI523fYnMnReg==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.13.1.tgz", + "integrity": "sha512-Okrw5hjtEjqSMOG08J6qqEwlUQujTVClvY1/eZkzKwNzPelWrtV6vqfyJklB7zVhenlxfxqhZKKcY7zWSW/q5Q==", "dependencies": { - "@polkadot/rpc-core": "10.11.2", - "@polkadot/types": "10.11.2", + "@polkadot/rpc-core": "10.13.1", + "@polkadot/types": "10.13.1", "@polkadot/util": "^12.6.2", "rxjs": "^7.8.1", "tslib": "^2.6.2" @@ -190,16 +648,16 @@ } }, "node_modules/@polkadot/api-derive": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.11.2.tgz", - "integrity": "sha512-m3BQbPionkd1iSlknddxnL2hDtolPIsT+aRyrtn4zgMRPoLjHFmTmovvg8RaUyYofJtZeYrnjMw0mdxiSXx7eA==", - "dependencies": { - "@polkadot/api": "10.11.2", - "@polkadot/api-augment": "10.11.2", - "@polkadot/api-base": "10.11.2", - "@polkadot/rpc-core": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.13.1.tgz", + "integrity": "sha512-ef0H0GeCZ4q5Om+c61eLLLL29UxFC2/u/k8V1K2JOIU+2wD5LF7sjAoV09CBMKKHfkLenRckVk2ukm4rBqFRpg==", + "dependencies": { + "@polkadot/api": "10.13.1", + "@polkadot/api-augment": "10.13.1", + "@polkadot/api-base": "10.13.1", + "@polkadot/rpc-core": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", "rxjs": "^7.8.1", @@ -240,13 +698,13 @@ } }, "node_modules/@polkadot/rpc-augment": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.11.2.tgz", - "integrity": "sha512-9AhT0WW81/8jYbRcAC6PRmuxXqNhJje8OYiulBQHbG1DTCcjAfz+6VQBke9BwTStzPq7d526+yyBKD17O3zlAA==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.13.1.tgz", + "integrity": "sha512-iLsWUW4Jcx3DOdVrSHtN0biwxlHuTs4QN2hjJV0gd0jo7W08SXhWabZIf9mDmvUJIbR7Vk+9amzvegjRyIf5+A==", "dependencies": { - "@polkadot/rpc-core": "10.11.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", + "@polkadot/rpc-core": "10.13.1", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", "@polkadot/util": "^12.6.2", "tslib": "^2.6.2" }, @@ -255,13 +713,13 @@ } }, "node_modules/@polkadot/rpc-core": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.11.2.tgz", - "integrity": "sha512-Ot0CFLWx8sZhLZog20WDuniPA01Bk2StNDsdAQgcFKPwZw6ShPaZQCHuKLQK6I6DodOrem9FXX7c1hvoKJP5Ww==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.13.1.tgz", + "integrity": "sha512-eoejSHa+/tzHm0vwic62/aptTGbph8vaBpbvLIK7gd00+rT813ROz5ckB1CqQBFB23nHRLuzzX/toY8ID3xrKw==", "dependencies": { - "@polkadot/rpc-augment": "10.11.2", - "@polkadot/rpc-provider": "10.11.2", - "@polkadot/types": "10.11.2", + "@polkadot/rpc-augment": "10.13.1", + "@polkadot/rpc-provider": "10.13.1", + "@polkadot/types": "10.13.1", "@polkadot/util": "^12.6.2", "rxjs": "^7.8.1", "tslib": "^2.6.2" @@ -271,13 +729,13 @@ } }, "node_modules/@polkadot/rpc-provider": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.11.2.tgz", - "integrity": "sha512-he5jWMpDJp7e+vUzTZDzpkB7ps3H8psRally+/ZvZZScPvFEjfczT7I1WWY9h58s8+ImeVP/lkXjL9h/gUOt3Q==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.13.1.tgz", + "integrity": "sha512-oJ7tatVXYJ0L7NpNiGd69D558HG5y5ZDmH2Bp9Dd4kFTQIiV8A39SlWwWUPCjSsen9lqSvvprNLnG/VHTpenbw==", "dependencies": { "@polkadot/keyring": "^12.6.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-support": "10.11.2", + "@polkadot/types": "10.13.1", + "@polkadot/types-support": "10.13.1", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", "@polkadot/x-fetch": "^12.6.2", @@ -285,25 +743,25 @@ "@polkadot/x-ws": "^12.6.2", "eventemitter3": "^5.0.1", "mock-socket": "^9.3.1", - "nock": "^13.4.0", + "nock": "^13.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18" }, "optionalDependencies": { - "@substrate/connect": "0.7.35" + "@substrate/connect": "0.8.8" } }, "node_modules/@polkadot/types": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.11.2.tgz", - "integrity": "sha512-d52j3xXni+C8GdYZVTSfu8ROAnzXFMlyRvXtor0PudUc8UQHOaC4+mYAkTBGA2gKdmL8MHSfRSbhcxHhsikY6Q==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.13.1.tgz", + "integrity": "sha512-Hfvg1ZgJlYyzGSAVrDIpp3vullgxrjOlh/CSThd/PI4TTN1qHoPSFm2hs77k3mKkOzg+LrWsLE0P/LP2XddYcw==", "dependencies": { "@polkadot/keyring": "^12.6.2", - "@polkadot/types-augment": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/types-create": "10.11.2", + "@polkadot/types-augment": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/types-create": "10.13.1", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", "rxjs": "^7.8.1", @@ -314,12 +772,12 @@ } }, "node_modules/@polkadot/types-augment": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.11.2.tgz", - "integrity": "sha512-8eB8ew04wZiE5GnmFvEFW1euJWmF62SGxb1O+8wL3zoUtB9Xgo1vB6w6xbTrd+HLV6jNSeXXnbbF1BEUvi9cNg==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.13.1.tgz", + "integrity": "sha512-TcrLhf95FNFin61qmVgOgayzQB/RqVsSg9thAso1Fh6pX4HSbvI35aGPBAn3SkA6R+9/TmtECirpSNLtIGFn0g==", "dependencies": { - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", "@polkadot/util": "^12.6.2", "tslib": "^2.6.2" }, @@ -328,9 +786,9 @@ } }, "node_modules/@polkadot/types-codec": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.11.2.tgz", - "integrity": "sha512-3xjOQL+LOOMzYqlgP9ROL0FQnzU8lGflgYewzau7AsDlFziSEtb49a9BpYo6zil4koC+QB8zQ9OHGFumG08T8w==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.13.1.tgz", + "integrity": "sha512-AiQ2Vv2lbZVxEdRCN8XSERiWlOWa2cTDLnpAId78EnCtx4HLKYQSd+Jk9Y4BgO35R79mchK4iG+w6gZ+ukG2bg==", "dependencies": { "@polkadot/util": "^12.6.2", "@polkadot/x-bigint": "^12.6.2", @@ -341,11 +799,11 @@ } }, "node_modules/@polkadot/types-create": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.11.2.tgz", - "integrity": "sha512-SJt23NxYvefRxVZZm6mT9ed1pR6FDoIGQ3xUpbjhTLfU2wuhpKjekMVorYQ6z/gK2JLMu2kV92Ardsz+6GX5XQ==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.13.1.tgz", + "integrity": "sha512-Usn1jqrz35SXgCDAqSXy7mnD6j4RvB4wyzTAZipFA6DGmhwyxxIgOzlWQWDb+1PtPKo9vtMzen5IJ+7w5chIeA==", "dependencies": { - "@polkadot/types-codec": "10.11.2", + "@polkadot/types-codec": "10.13.1", "@polkadot/util": "^12.6.2", "tslib": "^2.6.2" }, @@ -354,14 +812,14 @@ } }, "node_modules/@polkadot/types-known": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.11.2.tgz", - "integrity": "sha512-kbEIX7NUQFxpDB0FFGNyXX/odY7jbp56RGD+Z4A731fW2xh/DgAQrI994xTzuh0c0EqPE26oQm3kATSpseqo9w==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.13.1.tgz", + "integrity": "sha512-uHjDW05EavOT5JeU8RbiFWTgPilZ+odsCcuEYIJGmK+es3lk/Qsdns9Zb7U7NJl7eJ6OWmRtyrWsLs+bU+jjIQ==", "dependencies": { "@polkadot/networks": "^12.6.2", - "@polkadot/types": "10.11.2", - "@polkadot/types-codec": "10.11.2", - "@polkadot/types-create": "10.11.2", + "@polkadot/types": "10.13.1", + "@polkadot/types-codec": "10.13.1", + "@polkadot/types-create": "10.13.1", "@polkadot/util": "^12.6.2", "tslib": "^2.6.2" }, @@ -370,9 +828,9 @@ } }, "node_modules/@polkadot/types-support": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.11.2.tgz", - "integrity": "sha512-X11hoykFYv/3efg4coZy2hUOUc97JhjQMJLzDhHniFwGLlYU8MeLnPdCVGkXx0xDDjTo4/ptS1XpZ5HYcg+gRw==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.13.1.tgz", + "integrity": "sha512-4gEPfz36XRQIY7inKq0HXNVVhR6HvXtm7yrEmuBuhM86LE0lQQBkISUSgR358bdn2OFSLMxMoRNoh3kcDvdGDQ==", "dependencies": { "@polkadot/util": "^12.6.2", "tslib": "^2.6.2" @@ -617,22 +1075,48 @@ } }, "node_modules/@substrate/connect": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.35.tgz", - "integrity": "sha512-Io8vkalbwaye+7yXfG1Nj52tOOoJln2bMlc7Q9Yy3vEWqZEVkgKmcPVzbwV0CWL3QD+KMPDA2Dnw/X7EdwgoLw==", - "hasInstallScript": true, + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.8.8.tgz", + "integrity": "sha512-zwaxuNEVI9bGt0rT8PEJiXOyebLIo6QN1SyiAHRPBOl6g3Sy0KKdSN8Jmyn++oXhVRD8aIe75/V8ZkS81T+BPQ==", + "deprecated": "versions below 1.x are no longer maintained", "optional": true, "dependencies": { - "@substrate/connect-extension-protocol": "^1.0.1", - "smoldot": "2.0.7" + "@substrate/connect-extension-protocol": "^2.0.0", + "@substrate/connect-known-chains": "^1.1.1", + "@substrate/light-client-extension-helpers": "^0.0.4", + "smoldot": "2.0.22" } }, "node_modules/@substrate/connect-extension-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz", - "integrity": "sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.0.0.tgz", + "integrity": "sha512-nKu8pDrE3LNCEgJjZe1iGXzaD6OSIDD4Xzz/yo4KO9mQ6LBvf49BVrt4qxBFGL6++NneLiWUZGoh+VSd4PyVIg==", + "optional": true + }, + "node_modules/@substrate/connect-known-chains": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.1.6.tgz", + "integrity": "sha512-JwtdGbnK3ZqrY1qp3Ifr/p648sp9hG0Q715h4nRghnqZJnMQIiLKaFkcLnvrAiYQD3zNTYDztHidy5Q/u0TcbQ==", "optional": true }, + "node_modules/@substrate/light-client-extension-helpers": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-0.0.4.tgz", + "integrity": "sha512-vfKcigzL0SpiK+u9sX6dq2lQSDtuFLOxIJx2CKPouPEHIs8C+fpsufn52r19GQn+qDhU8POMPHOVoqLktj8UEA==", + "optional": true, + "dependencies": { + "@polkadot-api/client": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/json-rpc-provider": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/json-rpc-provider-proxy": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@polkadot-api/substrate-client": "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0", + "@substrate/connect-extension-protocol": "^2.0.0", + "@substrate/connect-known-chains": "^1.1.1", + "rxjs": "^7.8.1" + }, + "peerDependencies": { + "smoldot": "2.x" + } + }, "node_modules/@substrate/ss58-registry": { "version": "1.46.0", "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.46.0.tgz", @@ -672,10 +1156,15 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "optional": true }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, "node_modules/@types/node": { - "version": "20.11.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", - "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", + "version": "20.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", + "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -736,6 +1225,14 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "optional": true }, + "node_modules/avsc": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.7.tgz", + "integrity": "sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==", + "engines": { + "node": ">=0.11" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -878,6 +1375,44 @@ "node": ">=0.3.1" } }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -916,6 +1451,32 @@ "node": ">=12.20.0" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -961,6 +1522,18 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -972,6 +1545,14 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mock-socket": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", @@ -1063,6 +1644,15 @@ "teleport": ">=0.2.0" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -1071,10 +1661,16 @@ "tslib": "^2.1.0" } }, + "node_modules/scale-ts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/scale-ts/-/scale-ts-1.6.0.tgz", + "integrity": "sha512-Ja5VCjNZR8TGKhUumy9clVVxcDpM+YFjAnkMuwQy68Hixio3VRRvWdE3g8T/yC+HXA0ZDQl2TGyUmtmbcVl40Q==", + "optional": true + }, "node_modules/smoldot": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.7.tgz", - "integrity": "sha512-VAOBqEen6vises36/zgrmAT1GWk2qE3X8AGnO7lmQFdskbKx8EovnwS22rtPAG+Y1Rk23/S22kDJUdPANyPkBA==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.22.tgz", + "integrity": "sha512-B50vRgTY6v3baYH6uCgL15tfaag5tcS2o/P5q1OiXcKGv1axZDfz2dzzMuIkVpyMR2ug11F6EAtQlmYBQd292g==", "optional": true, "dependencies": { "ws": "^8.8.1" @@ -1164,6 +1760,25 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tsx": { + "version": "4.15.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.7.tgz", + "integrity": "sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==", + "dev": true, + "dependencies": { + "esbuild": "~0.21.4", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -1181,6 +1796,14 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/unique-names-generator": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", + "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", + "engines": { + "node": ">=8" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", diff --git a/apps/api/test/setup/package.json b/apps/api/test/setup/package.json index 98aa960a..c3cff7a0 100644 --- a/apps/api/test/setup/package.json +++ b/apps/api/test/setup/package.json @@ -2,21 +2,27 @@ "name": "setup", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "index.ts", "scripts": { - "main": "node index.js", + "main": "tsx index.ts", "test": "echo \"Error: no test specified\" && exit 1" }, "type": "module", "author": "", "license": "UNLICENSED", "dependencies": { + "@amplica-labs/frequency-scenario-template": "^1.1.4", "@dsnp/frequency-schemas": "^1.1.0", "@dsnp/graph-sdk": "^1.0.1", "@frequency-chain/api-augment": "^1.10.0", "@polkadot/api": "^10.9.1", "@polkadot/keyring": "^12.4.2", "@polkadot/types": "^10.11.2", - "@polkadot/util": "^12.4.2" + "@polkadot/util": "^12.4.2", + "@polkadot/util-crypto": "^12.6.2", + "loglevel": "^1.9.1" + }, + "devDependencies": { + "tsx": "^4.15.7" } } diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index dd4f2a5b..7fdb186c 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -12,7 +12,7 @@ import { BaseConsumer } from '../BaseConsumer'; import { ConnectionDto, GraphStateManager, GraphUpdateJob, PrivacyType, ProviderGraphUpdateJob, SkipTransitiveGraphs, createReconnectionJob } from '../../../../libs/common/src'; import * as QueueConstants from '../../../../libs/common/src/utils/queues'; import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; -import { Direction } from '../../../../libs/common/src/dtos/direction.dto'; +import { Direction } from '../../../../libs/common/src/dtos/direction.enum'; import { SECONDS_PER_BLOCK } from '../graph_publisher/graph.publisher.processor.service'; import fs from 'fs'; @Injectable() diff --git a/docker-compose.yaml b/docker-compose.yaml index f1eb6080..b4e9d151 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,9 +15,9 @@ services: platform: linux/amd64 # Uncomment SEALING_MODE and SEALING_INTERVAL if you want to use interval sealing. # Other options you may want to add depending on your test scenario. - # environment: - # - SEALING_MODE=interval - # - SEALING_INTERVAL=3 + environment: + - SEALING_MODE=interval + - SEALING_INTERVAL=1 # - CREATE_EMPTY_BLOCKS=true # Uncomment below if you want to let the chain run and keep all of the historical blocks # command: --state-pruning=archive diff --git a/k6-test/.openapi-generator-ignore b/k6-test/.openapi-generator-ignore new file mode 100644 index 00000000..7484ee59 --- /dev/null +++ b/k6-test/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/k6-test/.openapi-generator/FILES b/k6-test/.openapi-generator/FILES new file mode 100644 index 00000000..343cd1bd --- /dev/null +++ b/k6-test/.openapi-generator/FILES @@ -0,0 +1,2 @@ +README.md +script.js diff --git a/k6-test/.openapi-generator/VERSION b/k6-test/.openapi-generator/VERSION new file mode 100644 index 00000000..7e7b8b9b --- /dev/null +++ b/k6-test/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.7.0-SNAPSHOT diff --git a/k6-test/README.md b/k6-test/README.md new file mode 100644 index 00000000..64a75216 --- /dev/null +++ b/k6-test/README.md @@ -0,0 +1,15 @@ +# Generated k6 script + +The `script.js` file contains most of the Swagger/OpenAPI specification and you can customize it to your needs. + +Global header variables are defined at the top of the file, like `api_key`. Each path in the specification is converted into a [group](https://docs.k6.io/docs/tags-and-groups) in k6 and each group contains all the request methods related to that path. Path and query parameters are extracted from the specification and put at the start of the group. The URL is constructed from the base URL plus path and query. + +If the Swagger/OpenAPI specification used as the input spec contains examples at parameter level, those will be extracted and utilized as parameter values. The `handleParamValue` custom Mustache lambda registered for use in the K6 `script.mustache` template handles the conditional checks, formatting, and outputting of parameter values. If a given parameter has value specified – either in `example` or `examples` field, defined at the parameter level – that value will be used. For list (`examples`), entire list will be output in the generated script and the first element from that list will be assigned as parameter value. If a given parameter does not have an example defined, a placeholder value with `TODO_EDIT_THE_` prefix will be generated for that parameter, and you will have to assign a value before you can run the script. In other words, you can now generate K6 test scripts which are ready to run, provided the Swagger/OpenAPI specification used as the input spec contains examples for all of the path/query parameters; see `modules/openapi-generator/src/test/resources/3_0/examples.yaml` for an example of such specification, and https://swagger.io/docs/specification/adding-examples/ for more information about adding examples. + +k6 specific parameters are in the [`params`](https://docs.k6.io/docs/params-k6http) object, and `body` contains the [request](https://docs.k6.io/docs/http-requests) body which is in the form of `identifier: type`, which the `type` should be substituted by a proper value. Then goes the request and the check. + +[Check](https://docs.k6.io/docs/checks) are like asserts but differ in that they don't halt execution, instead they just store the result of the check, pass or fail, and let the script execution continue. + +Each request is always followed by a 0.1 second [sleep](https://docs.k6.io/docs/sleep-t-1) to prevent the script execution from flooding the system with too many requests simultaneously. + +Note that the default iteration count and VU count is 1. So each request in each group will be executed once. For more information, see the [k6 options](https://docs.k6.io/docs/options). diff --git a/k6-test/package-lock.json b/k6-test/package-lock.json new file mode 100644 index 00000000..c41fefa7 --- /dev/null +++ b/k6-test/package-lock.json @@ -0,0 +1,22 @@ +{ + "name": "k6-scripts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "k6-scripts", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@types/k6": "^0.51.0" + } + }, + "node_modules/@types/k6": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@types/k6/-/k6-0.51.0.tgz", + "integrity": "sha512-xelcvFGPI4VYrV5ozADmRuFQBKmDqDRzxfHVuCDD1/firZiSQvTP0pntxHuYUSkRyL8I83kvABXUlnLYNT2VuA==", + "dev": true + } + } +} diff --git a/k6-test/package.json b/k6-test/package.json new file mode 100644 index 00000000..cc6985a3 --- /dev/null +++ b/k6-test/package.json @@ -0,0 +1,15 @@ +{ + "name": "k6-scripts", + "version": "1.0.0", + "description": "The `script.js` file contains most of the Swagger/OpenAPI specification and you can customize it to your needs.", + "main": "account-service-load.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/k6": "^0.51.0" + } +} diff --git a/k6-test/script.js b/k6-test/script.js new file mode 100644 index 00000000..e601838c --- /dev/null +++ b/k6-test/script.js @@ -0,0 +1,125 @@ +/* + * Graph Service + * Graph Service API + * + * OpenAPI spec version: 1.0 + * + * NOTE: This class is auto generated by OpenAPI Generator. + * https://github.com/OpenAPITools/openapi-generator + * + * Generator version: 7.7.0-SNAPSHOT + */ + + +import http from "k6/http"; +import { group, check } from "k6"; + +export const options = { + vus: 100, + duration: '10s', + thresholds: { + checks: ['rate>=0.995'], + http_req_duration: ['avg<100', 'p(95)<200'], + http_req_failed: ['rate<0.005'], + http_reqs: ['rate>=256'] + }, + noConnectionReuse: true, +}; + +const BASE_URL = "http://localhost:3000"; +// Sleep duration between successive requests. +// You might want to edit the value of this variable or remove calls to the sleep function on the script. +const SLEEP_DURATION = 0.1; +// Global variables should be initialized. + +export default function() { + group("/api/update-graph", () => { + + // Request No. 1: ApiController_updateGraph + { + let url = BASE_URL + `/api/update-graph`; + let body = {"dsnpId": "2", "connections": {"data": [ + { + "dsnpId": "3", + "privacyType": "public", + "direction": "connectionTo", + "connectionType": "follow" + } + ]}, "graphKeyPairs": []}; + let params = {headers: {"Content-Type": "application/json", "Accept": "application/json"}}; + let request = http.post(url, JSON.stringify(body), params); + + check(request, { + "Got 201 response": (r) => r.status === 201, + "Repsonse contains referenceId": ({ body: bodyStr }) => { + try { + const body = JSON.parse(bodyStr); + return Object.keys(body).includes("referenceId"); + } catch (e) { + return false; + } + } + }); + } + }); + + group("/api/graphs", () => { + const msaIds = ["2", "3", "4"]; + + // Request No. 1: ApiController_getGraphs + { + let url = BASE_URL + `/api/graphs`; + let body = {"dsnpIds": msaIds, "privacyType": "public", "graphKeyPairs": []}; + let params = {headers: {"Content-Type": "application/json", "Accept": "application/json"}}; + let request = http.put(url, JSON.stringify(body), params); + + check(request, { + "Got 200 response": (r) => r.status === 200, + "Response contained requested graphs": ({ body: bodyStr }) => { + try { + const body = JSON.parse(bodyStr); + for (const msaId of msaIds) { + if (!body.some((userGraph) =>userGraph.dsnpId === msaId)) { + return false; + } + } + + return true; + } catch (e) { + return false; + } + } + }); + } + }); + + group("/api/health", () => { + + // Request No. 1: ApiController_health + { + let url = BASE_URL + `/api/health`; + let request = http.get(url); + + check(request, { + "Service is healthy": (r) => r.status === 200 + }); + } + }); + + group("/api/watch-graphs", () => { + + // Request No. 1: ApiController_watchGraphs + { + let url = BASE_URL + `/api/watch-graphs`; + let body = {"dsnpIds": ["2"], "webhookEndpoint": "http://localhost:3000/webhook"}; + let params = {headers: {"Content-Type": "application/json", "Accept": "application/json"}}; + let request = http.put(url, JSON.stringify(body), params); + + check(request, { + "Got 200 response": (r) => r.status === 200, + "Response body is correct": ({ body }) => body === JSON.stringify({ status: 200, data: "Successfully started watching graphs" }), + }); + } + }); + +} diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts index 4a4c6de7..4cd0e7a6 100644 --- a/libs/common/src/blockchain/blockchain.service.ts +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -1,5 +1,5 @@ /* eslint-disable no-underscore-dangle */ -import { Injectable, Logger, OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common'; +import { Injectable, Logger, OnApplicationBootstrap, BeforeApplicationShutdown } from '@nestjs/common'; import { ApiPromise, ApiRx, HttpProvider, WsProvider } from '@polkadot/api'; import { firstValueFrom, from } from 'rxjs'; import { options } from '@frequency-chain/api-augment'; @@ -13,7 +13,7 @@ import { ConfigService } from '../config/config.service'; import { Extrinsic } from './extrinsic'; @Injectable() -export class BlockchainService implements OnApplicationBootstrap, OnApplicationShutdown { +export class BlockchainService implements OnApplicationBootstrap, BeforeApplicationShutdown { public api: ApiRx; public apiPromise: ApiPromise; @@ -44,7 +44,7 @@ export class BlockchainService implements OnApplicationBootstrap, OnApplicationS return true; } - public async onApplicationShutdown(signal?: string | undefined) { + public async beforeApplicationShutdown(signal?: string | undefined) { const promises: Promise[] = []; if (this.api) { promises.push(this.api.disconnect()); diff --git a/libs/common/src/config/swagger_config.ts b/libs/common/src/config/swagger_config.ts index 02a9e4c8..67170565 100644 --- a/libs/common/src/config/swagger_config.ts +++ b/libs/common/src/config/swagger_config.ts @@ -21,6 +21,6 @@ export const initSwagger = async (app: INestApplication, apiPath: string) => { }); // write swagger.json to disk - // fs.writeFileSync('./swagger.json', JSON.stringify(document)); + // fs.writeFileSync('./swagger.json', JSON.stringify(document, (_, v) => v, 2)); SwaggerModule.setup(apiPath, app, document); }; diff --git a/libs/common/src/dtos/connection.type.dto.ts b/libs/common/src/dtos/connection-type.enum.ts similarity index 100% rename from libs/common/src/dtos/connection.type.dto.ts rename to libs/common/src/dtos/connection-type.enum.ts diff --git a/libs/common/src/dtos/connection.dto.ts b/libs/common/src/dtos/connection.dto.ts new file mode 100644 index 00000000..3f3da852 --- /dev/null +++ b/libs/common/src/dtos/connection.dto.ts @@ -0,0 +1,32 @@ +import { IsNotEmpty, IsString, IsEnum } from 'class-validator'; +import { ConnectionType } from './connection-type.enum'; +import { Direction } from './direction.enum'; +import { PrivacyType } from './privacy-type.enum'; +import { ApiProperty } from '@nestjs/swagger'; + +export class ConnectionDto { + @IsNotEmpty() + @IsString() + @ApiProperty({ description: 'MSA ID representing the target of this connection', type: String, example: '3' }) + dsnpId: string; + + @IsNotEmpty() + @IsEnum(PrivacyType) + @ApiProperty({ description: 'Indicator connection type (public or private)', enum: PrivacyType, example: 'public' }) + privacyType: PrivacyType; + + @IsNotEmpty() + @IsEnum(Direction) + @ApiProperty({ description: 'Indicator of the direction of this connection', enum: Direction, example: 'connectionTo' }) + direction: Direction; + + @IsNotEmpty() + @IsEnum(ConnectionType) + @ApiProperty({ description: 'Indicator of the type of connection (follow or friendship)', enum: ConnectionType, example: 'follow' }) + connectionType: ConnectionType; +} + +export class ConnectionDtoWrapper { + @ApiProperty({ description: 'Wrapper object for array of connections', type: [ConnectionDto] }) + data: ConnectionDto[]; +} diff --git a/libs/common/src/dtos/connections.dto.ts b/libs/common/src/dtos/connections.dto.ts deleted file mode 100644 index 1d0aae45..00000000 --- a/libs/common/src/dtos/connections.dto.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IsNotEmpty, IsString, IsEnum } from 'class-validator'; -import { ConnectionType } from './connection.type.dto'; -import { Direction } from './direction.dto'; -import { PrivacyType } from './privacy.type.dto'; - -export class ConnectionDto { - @IsNotEmpty() - @IsString() - dsnpId: string; - - @IsNotEmpty() - @IsEnum(PrivacyType) - privacyType: PrivacyType; - - @IsNotEmpty() - @IsEnum(Direction) - direction: Direction; - - @IsNotEmpty() - @IsEnum(ConnectionType) - connectionType: ConnectionType; -} diff --git a/libs/common/src/dtos/direction.dto.ts b/libs/common/src/dtos/direction.enum.ts similarity index 100% rename from libs/common/src/dtos/direction.dto.ts rename to libs/common/src/dtos/direction.enum.ts diff --git a/libs/common/src/dtos/dsnp-graph-edge.dto.ts b/libs/common/src/dtos/dsnp-graph-edge.dto.ts new file mode 100644 index 00000000..7acf4b61 --- /dev/null +++ b/libs/common/src/dtos/dsnp-graph-edge.dto.ts @@ -0,0 +1,14 @@ +import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; + +export class DsnpGraphEdge { + @IsNotEmpty() + @IsString() + @ApiProperty({ description: 'MSA ID of the user represented by this graph edge', type: String, example: '3' }) + userId: string; + + @IsNotEmpty() + @IsNumber() + @ApiProperty({ description: 'Block number when connection represented by this graph edge was created', type: Number, example: 12 }) + since: number; +} diff --git a/libs/common/src/dtos/dsnp.graph.edge.dto.ts b/libs/common/src/dtos/dsnp.graph.edge.dto.ts deleted file mode 100644 index 52118b87..00000000 --- a/libs/common/src/dtos/dsnp.graph.edge.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; - -export class DsnpGraphEdge { - @IsNotEmpty() - @IsString() - userId: string; - - @IsNotEmpty() - @IsNumber() - since: number; -} diff --git a/libs/common/src/dtos/graph-change-notification.dto.ts b/libs/common/src/dtos/graph-change-notification.dto.ts new file mode 100644 index 00000000..f71c09ad --- /dev/null +++ b/libs/common/src/dtos/graph-change-notification.dto.ts @@ -0,0 +1,37 @@ +import { AddKeyUpdate, DeletePageUpdate, PersistPageUpdate, Update } from '@dsnp/graph-sdk'; +import { ApiProperty } from '@nestjs/swagger'; + +export class PersistPageUpdateDto implements PersistPageUpdate { + type: "PersistPage"; + ownerDsnpUserId: string; + schemaId: number; + pageId: number; + prevHash: number; + payload: Uint8Array; +} +export class DeletePageUpdateDto implements DeletePageUpdate { + type: "DeletePage"; + ownerDsnpUserId: string; + schemaId: number; + pageId: number; + prevHash: number; +} +export class AddKeyUpdateDto implements AddKeyUpdate { + type: "AddKey"; + ownerDsnpUserId: string; + prevHash: number; + payload: Uint8Array; +} + + +export class GraphChangeNotificationDto { + @ApiProperty({ description: 'MSA ID for which this notification is being sent', type: String, example: '2' }) + dsnpId: string; + + @ApiProperty({ description: 'The payload of the specific update. Content depends on the type of update (Add, Delete, Persist)', oneOf: [ + { type: 'PersistPageUpdateDto' }, + { type: 'DeletePageUpdateDto' }, + { type: 'AddKeyUpdateDto' } + ]}) + update: Update; +} diff --git a/libs/common/src/dtos/graph-change-response.dto.ts b/libs/common/src/dtos/graph-change-response.dto.ts new file mode 100644 index 00000000..7adfbeb5 --- /dev/null +++ b/libs/common/src/dtos/graph-change-response.dto.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from "@nestjs/swagger"; + +export class GraphChangeRepsonseDto { + @ApiProperty({ description: 'Reference ID by which the results/status of a submitted GraphChangeRequest may be retrieved', type: String }) + referenceId: string; +} diff --git a/libs/common/src/dtos/graph-key-pair.dto.ts b/libs/common/src/dtos/graph-key-pair.dto.ts new file mode 100644 index 00000000..5be6e79b --- /dev/null +++ b/libs/common/src/dtos/graph-key-pair.dto.ts @@ -0,0 +1,22 @@ +import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; +import { KeyType } from './key-type.enum'; +import { HexString } from '@polkadot/util/types'; +import { ApiProperty } from '@nestjs/swagger'; + +// DTO for the graph key pair +export class GraphKeyPairDto { + @IsNotEmpty() + @IsString() + @ApiProperty({ description: 'Public graph encryption key as a hex string (prefixed with "0x")', type: String }) + publicKey: HexString; + + @IsNotEmpty() + @IsString() + @ApiProperty({ description: 'Private graph encryption key as a hex string (prefixed with "0x")', type: String }) + privateKey: string; + + @IsNotEmpty() + @IsEnum(KeyType) + @ApiProperty({ description: 'Key type of graph encryption keypair (currently only X25519 supported)', enum: KeyType, example: 'X25519' }) + keyType: KeyType; +} diff --git a/libs/common/src/dtos/graph-query-params.dto.ts b/libs/common/src/dtos/graph-query-params.dto.ts new file mode 100644 index 00000000..3fb0e6fd --- /dev/null +++ b/libs/common/src/dtos/graph-query-params.dto.ts @@ -0,0 +1,22 @@ +import { ArrayNotEmpty, ArrayUnique, IsArray, IsEnum, IsOptional, IsString } from 'class-validator'; +import { GraphKeyPairDto } from './graph-key-pair.dto'; +import { PrivacyType } from './privacy-type.enum'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class GraphsQueryParamsDto { + @IsArray() + @ArrayNotEmpty() + @ArrayUnique() + @IsString({ each: true }) + @ApiProperty({ description: 'Array of MSA IDs for which to query graphs', example: [2, 3, 4, 5], type: [String] }) + dsnpIds: string[]; + + @IsEnum(PrivacyType) + @ApiProperty({ description: 'Graph type to query (public or private)', enum: PrivacyType, example: 'public' }) + privacyType: PrivacyType; + + @IsOptional() + @IsArray() + @ApiPropertyOptional({ description: 'Graph encryption keypairs for the users requested in `dsnpIds`. (Only for `privacyType` === "private"', type: [GraphKeyPairDto] }) + graphKeyPairs?: GraphKeyPairDto[]; +} diff --git a/libs/common/src/dtos/graph.change.notification.dto.ts b/libs/common/src/dtos/graph.change.notification.dto.ts deleted file mode 100644 index 8d1bd447..00000000 --- a/libs/common/src/dtos/graph.change.notification.dto.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Update } from '@dsnp/graph-sdk'; - -export class GraphChangeNotificationDto { - dsnpId: string; - - update: Update; -} diff --git a/libs/common/src/dtos/graph.change.request.reference.ts b/libs/common/src/dtos/graph.change.request.reference.ts deleted file mode 100644 index fd89bd3b..00000000 --- a/libs/common/src/dtos/graph.change.request.reference.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class GraphChangeRepsonseDto { - referenceId: string; -} diff --git a/libs/common/src/dtos/graph.key.pair.dto.ts b/libs/common/src/dtos/graph.key.pair.dto.ts deleted file mode 100644 index 6594571d..00000000 --- a/libs/common/src/dtos/graph.key.pair.dto.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; -import { KeyType } from './key.type.dto'; - -// DTO for the graph key pair -export class GraphKeyPairDto { - @IsNotEmpty() - @IsString() - publicKey: string; - - @IsNotEmpty() - @IsString() - privateKey: string; - - @IsNotEmpty() - @IsEnum(KeyType) - keyType: KeyType; -} diff --git a/libs/common/src/dtos/graph.query.dto.ts b/libs/common/src/dtos/graph.query.dto.ts deleted file mode 100644 index cb53ebf8..00000000 --- a/libs/common/src/dtos/graph.query.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ArrayNotEmpty, ArrayUnique, IsArray, IsEnum, IsOptional, IsString } from 'class-validator'; -import { GraphKeyPairDto } from './graph.key.pair.dto'; -import { PrivacyType } from './privacy.type.dto'; - -export class GraphsQueryParamsDto { - @IsArray() - @ArrayNotEmpty() - @ArrayUnique() - @IsString({ each: true }) - dsnpIds: string[]; - - @IsEnum(PrivacyType) - privacyType: PrivacyType; - - @IsOptional() - @IsArray() - graphKeyPairs: GraphKeyPairDto[]; -} diff --git a/libs/common/src/dtos/key.type.dto.ts b/libs/common/src/dtos/key-type.enum.ts similarity index 100% rename from libs/common/src/dtos/key.type.dto.ts rename to libs/common/src/dtos/key-type.enum.ts diff --git a/libs/common/src/dtos/privacy.type.dto.ts b/libs/common/src/dtos/privacy-type.enum.ts similarity index 100% rename from libs/common/src/dtos/privacy.type.dto.ts rename to libs/common/src/dtos/privacy-type.enum.ts diff --git a/libs/common/src/dtos/provider-graph.dto.ts b/libs/common/src/dtos/provider-graph.dto.ts new file mode 100644 index 00000000..f4e283e4 --- /dev/null +++ b/libs/common/src/dtos/provider-graph.dto.ts @@ -0,0 +1,26 @@ +import { IsArray, IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { Type } from 'class-transformer'; +import { GraphKeyPairDto } from './graph-key-pair.dto'; +import { ConnectionDto, ConnectionDtoWrapper } from './connection.dto'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export type ConnectionsDtoWrapper = { + data: ConnectionDto[]; +} + +export class ProviderGraphDto { + @IsNotEmpty() + @IsString() + @ApiProperty({ description: 'MSA ID that owns the connections represented in this object', example: 2, type: String }) + dsnpId: string; + + @IsNotEmpty() + @Type(() => ConnectionDto) + @ApiProperty({ description: 'Array of connections known to the Provider for ths MSA referenced in this object', type: ConnectionDtoWrapper }) + connections: { data: ConnectionDto[] }; + + @IsArray() + @IsOptional() + @ApiPropertyOptional({ description: 'Optional array of graph encryption keypairs decrypting/encrypting the above-referenced users private graph', type: [GraphKeyPairDto] }) + graphKeyPairs?: GraphKeyPairDto[]; +} diff --git a/libs/common/src/dtos/provider.graph.dto.ts b/libs/common/src/dtos/provider.graph.dto.ts deleted file mode 100644 index b99a0ff1..00000000 --- a/libs/common/src/dtos/provider.graph.dto.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator'; -import { Type } from 'class-transformer'; -import { PrivacyType } from './privacy.type.dto'; -import { GraphKeyPairDto } from './graph.key.pair.dto'; -import { ConnectionDto } from './connections.dto'; - -export class ProviderGraphDto { - @IsNotEmpty() - @IsString() - dsnpId: string; - - @IsNotEmpty() - @Type(() => ConnectionDto) - connections: { data: ConnectionDto[] }; - - @IsArray() - @IsOptional() - graphKeyPairs?: GraphKeyPairDto[]; -} diff --git a/libs/common/src/dtos/user-graph.dto.ts b/libs/common/src/dtos/user-graph.dto.ts new file mode 100644 index 00000000..e576e43c --- /dev/null +++ b/libs/common/src/dtos/user-graph.dto.ts @@ -0,0 +1,10 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { DsnpGraphEdge } from './dsnp-graph-edge.dto'; + +export class UserGraphDto { + @ApiProperty({ description: 'MSA ID that is the owner of the graph represented by the graph edges in this object', type: String, example: '2' }) + dsnpId: string; + + @ApiPropertyOptional({ description: 'Optional array of graph edges in the specific user graph represented by this object', type: [DsnpGraphEdge] }) + dsnpGraphEdges?: DsnpGraphEdge[]; +} diff --git a/libs/common/src/dtos/user.graph.dto.ts b/libs/common/src/dtos/user.graph.dto.ts deleted file mode 100644 index f094efe0..00000000 --- a/libs/common/src/dtos/user.graph.dto.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { DsnpGraphEdge } from './dsnp.graph.edge.dto'; - -export class UserGraphDto { - dsnpId: string; - - dsnpGraphEdges?: DsnpGraphEdge[]; -} diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/libs/common/src/dtos/watch-graphs.dto.ts index aa54352d..f98c85db 100644 --- a/libs/common/src/dtos/watch-graphs.dto.ts +++ b/libs/common/src/dtos/watch-graphs.dto.ts @@ -1,12 +1,15 @@ +import { ApiProperty } from '@nestjs/swagger'; import { IsArray, IsNotEmpty, IsString, IsUrl } from 'class-validator'; export class WatchGraphsDto { @IsArray() @IsNotEmpty() + @ApiProperty({ description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5']}) dsnpIds: string[]; @IsNotEmpty() @IsString() - @IsUrl() + @IsUrl({ require_tld: false }) + @ApiProperty({ description: 'Webhook URL to call when graph changes for the referenced MSAs are detected', type: String, example: 'http://localhost/webhook' }) webhookEndpoint: string; } diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 9d68b5c0..f0875efc 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -1,17 +1,17 @@ export * from './utils/processing'; export * from './utils/redis'; export * from './utils/base-consumer'; -export * from './dtos/user.graph.dto'; -export * from './dtos/graph.query.dto'; -export * from './dtos/provider.graph.dto'; -export * from './dtos/privacy.type.dto'; -export * from './dtos/key.type.dto'; -export * from './dtos/graph.key.pair.dto'; -export * from './dtos/connections.dto'; +export * from './dtos/user-graph.dto'; +export * from './dtos/graph-query-params.dto'; +export * from './dtos/provider-graph.dto'; +export * from './dtos/privacy-type.enum'; +export * from './dtos/key-type.enum'; +export * from './dtos/graph-key-pair.dto'; +export * from './dtos/connection.dto'; export * from './dtos/watch-graphs.dto'; -export * from './dtos/dsnp.graph.edge.dto'; -export * from './dtos/graph.change.notification.dto'; -export * from './dtos/graph.change.request.reference'; +export * from './dtos/dsnp-graph-edge.dto'; +export * from './dtos/graph-change-notification.dto'; +export * from './dtos/graph-change-response.dto'; export * from './dtos/graph.update.job'; export * from './interfaces/graph-update-job.interface'; export * from './interfaces/provider.graph.update-job.interface'; diff --git a/libs/common/src/interfaces/provider.graph.update-job.interface.ts b/libs/common/src/interfaces/provider.graph.update-job.interface.ts index 1f68c30e..aab4ca19 100644 --- a/libs/common/src/interfaces/provider.graph.update-job.interface.ts +++ b/libs/common/src/interfaces/provider.graph.update-job.interface.ts @@ -1,5 +1,5 @@ -import { ConnectionDto } from '../dtos/connections.dto'; -import { GraphKeyPairDto } from '../dtos/graph.key.pair.dto'; +import { ConnectionDto } from '../dtos/connection.dto'; +import { GraphKeyPairDto } from '../dtos/graph-key-pair.dto'; export class ProviderGraphUpdateJob { referenceId: string; diff --git a/libs/common/src/services/async_debouncer.ts b/libs/common/src/services/async_debouncer.ts index 44b6c738..8a4b10c8 100644 --- a/libs/common/src/services/async_debouncer.ts +++ b/libs/common/src/services/async_debouncer.ts @@ -3,10 +3,10 @@ import Redis from 'ioredis'; import { PrivacyType } from '@dsnp/graph-sdk'; import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; import * as QueueConstants from '../utils/queues'; -import { DsnpGraphEdge } from '../dtos/dsnp.graph.edge.dto'; +import { DsnpGraphEdge } from '../dtos/dsnp-graph-edge.dto'; import { ConfigService } from '../config/config.service'; import { GraphStateManager } from './graph-state-manager'; -import { GraphKeyPairDto } from '../dtos/graph.key.pair.dto'; +import { GraphKeyPairDto } from '../dtos/graph-key-pair.dto'; @Injectable() export class AsyncDebouncerService { diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts index 9b0dcb01..780ae153 100644 --- a/libs/common/src/services/graph-state-manager.ts +++ b/libs/common/src/services/graph-state-manager.ts @@ -21,8 +21,8 @@ import { ItemizedStoragePageResponse, MessageSourceId, PaginatedStorageResponse import { hexToU8a } from '@polkadot/util'; import { AnyNumber } from '@polkadot/types/types'; import { ConfigService } from '../config/config.service'; -import { GraphKeyPairDto } from '../dtos/graph.key.pair.dto'; -import { KeyType } from '../dtos/key.type.dto'; +import { GraphKeyPairDto } from '../dtos/graph-key-pair.dto'; +import { KeyType } from '../dtos/key-type.enum'; import { BlockchainService } from '../blockchain/blockchain.service'; @Injectable() diff --git a/package-lock.json b/package-lock.json index b947686c..8b888d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "time-constants": "^1.0.3" }, "devDependencies": { + "@amplica-labs/frequency-scenario-template": "^1.1.4", "@jest/globals": "^29.7.0", "@nestjs/testing": "^10.3.8", "@types/express": "^4.17.21", @@ -67,10 +68,35 @@ "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "tsconfig-paths": "^4.2.0", + "tsx": "^4.15.7", "typescript": "^5.4.5", "typescript-eslint": "^7.8.0" } }, + "node_modules/@amplica-labs/frequency-scenario-template": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@amplica-labs/frequency-scenario-template/-/frequency-scenario-template-1.1.4.tgz", + "integrity": "sha512-EF9LwMM2WvATUOwWfG6ETpwrvlxImUanuy3A5O/k/IgjFjsBgqW9qNa+z1oGdsKX6FqbcHtc00ijSo+kBClNig==", + "dev": true, + "dependencies": { + "@dsnp/frequency-schemas": "^1.1.0", + "@dsnp/graph-sdk": "^1.1.3", + "@frequency-chain/api-augment": "~1.11.1", + "@polkadot/api": "^10.13.1", + "@polkadot/keyring": "^12.6.2", + "@polkadot/types": "^10.13.1", + "@polkadot/types-codec": "^10.13.1", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "@types/minimist": "^1.2.5", + "@types/node": "^20.14.2", + "avsc": "^5.7.7", + "loglevel": "^1.9.1", + "minimist": "^1.2.8", + "rxjs": "^7.8.1", + "unique-names-generator": "^4.7.1" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -1759,9 +1785,9 @@ } }, "node_modules/@dsnp/graph-sdk": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.1.2.tgz", - "integrity": "sha512-B8gOuq4CojsuRhZHsk8oROZ8KBaJ17gd2E3NOHnLr9Ak0wPQs4b1dSHtO9slG8CN/GB6qGhxkb2OgKvdNKx7lw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@dsnp/graph-sdk/-/graph-sdk-1.1.3.tgz", + "integrity": "sha512-t/hhGo738BQIYPkfAOWq87tzE2/6Rk/eVdRxWJ5URgLdB8FowNCNWui105Uds5E3dkkjOre/geJbY+McX9caIA==", "engines": { "node": "^14.0.0 || ^16.0.0 || >=17.0.0" } @@ -1790,6 +1816,374 @@ "node": ">=18.18.2" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -4738,9 +5132,9 @@ } }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "20.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", + "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -5512,6 +5906,15 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/avsc": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.7.tgz", + "integrity": "sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==", + "dev": true, + "engines": { + "node": ">=0.11" + } + }, "node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", @@ -6877,6 +7280,44 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -7787,6 +8228,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -9601,6 +10054,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -11222,6 +11688,15 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -12506,6 +12981,25 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tsx": { + "version": "4.15.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.7.tgz", + "integrity": "sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==", + "dev": true, + "dependencies": { + "esbuild": "~0.21.4", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12618,6 +13112,15 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/unique-names-generator": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", + "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index 57140c7b..1b9bf55f 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "docker-run": " build -t graph-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-deploy", "docker-run:dev": "docker-compose -f docker-compose.dev.yaml up -d ; docker-compose -f docker-compose.dev.yaml logs", "docker-stop:dev": "docker-compose -f docker-compose.dev.yaml stop", + "chain-setup": "tsx ./test-setup/main.ts", "clean": "rm -Rf dist", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest --coverage --verbose", @@ -78,6 +79,7 @@ "time-constants": "^1.0.3" }, "devDependencies": { + "@amplica-labs/frequency-scenario-template": "^1.1.4", "@jest/globals": "^29.7.0", "@nestjs/testing": "^10.3.8", "@types/express": "^4.17.21", @@ -98,6 +100,7 @@ "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "tsconfig-paths": "^4.2.0", + "tsx": "^4.15.7", "typescript": "^5.4.5", "typescript-eslint": "^7.8.0" }, diff --git a/test-setup/main.ts b/test-setup/main.ts new file mode 100644 index 00000000..cd547ff2 --- /dev/null +++ b/test-setup/main.ts @@ -0,0 +1,18 @@ +import { cryptoWaitReady } from '@polkadot/util-crypto'; +import { initialize, provisionProvider, initializeLocalUsers, ExtrinsicHelper } from '@amplica-labs/frequency-scenario-template'; + +const BASE_SEED_PHRASE = process.env.PROVIDER_SEED_PHRASE || '//Alice'; +const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://0.0.0.0:9944'; + +async function setup() { + await cryptoWaitReady(); + await initialize(FREQUENCY_URL); + + // Get keys and MSA IDs for users provisioned in setup + await provisionProvider(BASE_SEED_PHRASE, 'Alice'); + await initializeLocalUsers(`${BASE_SEED_PHRASE}//users`, 4); + + await ExtrinsicHelper.disconnect(); +} + +setup().catch((err) => console.log(err)); From f3f636c1e38527410928975f9ed0a54aaa9bca38 Mon Sep 17 00:00:00 2001 From: Wil Wade Date: Thu, 27 Jun 2024 17:26:52 -0400 Subject: [PATCH 43/53] Standardizing API (#95) - Generate swagger command - Update controllers to the new standard - Update graph-sdk - Remove the api path --- README.md | 5 +- apps/api/src/api.module.ts | 5 +- apps/api/src/build-openapi.ts | 40 +++ ...{api.controller.ts => graph.controller.ts} | 19 +- apps/api/src/health.controller.ts | 45 +++ apps/api/src/main.ts | 3 +- apps/api/src/metadata.ts | 71 ++-- apps/api/test/app.e2e-spec.ts | 46 +-- apps/api/test/e2e-setup.mock.spec.ts | 8 +- apps/api/test/setup/package-lock.json | 2 +- apps/api/test/setup/package.json | 2 +- env.template | 2 +- libs/common/src/config/swagger_config.ts | 14 +- .../src/dtos/graph-change-notification.dto.ts | 40 +-- .../src/dtos/graph-change-response.dto.ts | 2 +- libs/common/src/dtos/provider-graph.dto.ts | 2 +- libs/common/src/dtos/watch-graphs.dto.ts | 2 +- package-lock.json | 2 +- package.json | 7 +- swagger.json | 339 ++++++++++++++++++ swagger.yaml | 207 ----------- 21 files changed, 547 insertions(+), 316 deletions(-) create mode 100644 apps/api/src/build-openapi.ts rename apps/api/src/{api.controller.ts => graph.controller.ts} (85%) create mode 100644 apps/api/src/health.controller.ts create mode 100644 swagger.json delete mode 100644 swagger.yaml diff --git a/README.md b/README.md index 657531d1..fe5651ea 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,6 @@ Environment files are documented [here](./ENVIRONMENT.md), and a sample environm 1. Copy the template values into the .env files. ```sh cp env.template .env - cp env.template .env.dev cp env.template .env.docker.dev ``` 2. Replace template values with values appropriate to your environment. @@ -230,7 +229,7 @@ This will run the tests in `apps/api/test` folder. #### Check e2e test file for more details on the test. ### Swagger UI -Check out the Swagger UI hosted on the app instance at [\/api/docs/swagger](http://localhost:3000/api/docs/swagger) to view the API documentation and submit requests to the service. +Check out the Swagger UI hosted on the app instance at [\/docs/swagger](http://localhost:3000/docs/swagger) to view the API documentation and submit requests to the service. ### Queue Management You may also view and manage the application's queue at [\/queues](http://localhost:3000/queues). @@ -282,4 +281,4 @@ If you would like to explore contributing bug fixes or enhancements, issues with This project is [Apache 2.0](./LICENSE) licensed. -

(back to top)

\ No newline at end of file +

(back to top)

diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index bfe9e980..333182dd 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -6,7 +6,8 @@ import { RedisModule } from '@songkeys/nestjs-redis'; import { BullBoardModule } from '@bull-board/nestjs'; import { BullMQAdapter } from '@bull-board/api/bullMQAdapter'; import { ExpressAdapter } from '@bull-board/express'; -import { ApiController } from './api.controller'; +import { GraphController } from './graph.controller'; +import { HealthController } from './health.controller'; import { ApiService } from './api.service'; import { ConfigModule } from '../../../libs/common/src/config/config.module'; import { ConfigService } from '../../../libs/common/src/config/config.service'; @@ -127,7 +128,7 @@ import * as QueueConstants from '../../../libs/common/src/utils/queues'; ScheduleModule.forRoot(), ], providers: [ApiService, GraphStateManager, ConfigService], - controllers: [ApiController], + controllers: [GraphController, HealthController], exports: [], }) export class ApiModule {} diff --git a/apps/api/src/build-openapi.ts b/apps/api/src/build-openapi.ts new file mode 100644 index 00000000..0379c79f --- /dev/null +++ b/apps/api/src/build-openapi.ts @@ -0,0 +1,40 @@ +// This is a very hack way to generate the swagger +// without needing any of the service dependencies. +// At some point we should find a better way, but +// there might not be one. + +import '@frequency-chain/api-augment'; +import * as fs from 'fs'; +import { NestFactory } from '@nestjs/core'; + +// Mock out required env vars before the module loads +process.env.REDIS_URL = 'http://127.0.0.1'; +process.env.FREQUENCY_URL = 'http://127.0.0.1'; +process.env.FREQUENCY_HTTP_URL = 'http://127.0.0.1'; +process.env.PROVIDER_ACCOUNT_SEED_PHRASE = 'offer debate skin describe light badge fish turtle actual inject struggle border'; +process.env.PROVIDER_ID = '0'; +process.env.PROVIDER_BASE_URL = 'http://127.0.0.1'; +process.env.CAPACITY_LIMIT = '{"type":"amount","value":0}'; + +// eslint-disable-next-line +import { ApiModule } from './api.module'; +// eslint-disable-next-line +import { generateSwaggerDoc } from '../../../libs/common/src/config/swagger_config'; + +async function bootstrap() { + const app = await NestFactory.create(ApiModule, { + logger: process.env.DEBUG ? ['error', 'warn', 'log', 'verbose', 'debug'] : ['error'], + }); + + const document = await generateSwaggerDoc(app); + // write swagger.json to disk + fs.writeFileSync( + './swagger.json', + JSON.stringify(document, (_, v) => v, 2), + ); + console.log('OpenAPI written to ./swagger.json'); + // Do NOT call await app.close() as that requires a connection to Redis + process.exit(0); +} + +bootstrap(); diff --git a/apps/api/src/api.controller.ts b/apps/api/src/graph.controller.ts similarity index 85% rename from apps/api/src/api.controller.ts rename to apps/api/src/graph.controller.ts index 8247e582..b6f83986 100644 --- a/apps/api/src/api.controller.ts +++ b/apps/api/src/graph.controller.ts @@ -4,28 +4,15 @@ import { ApiService } from './api.service'; import { GraphChangeRepsonseDto, GraphsQueryParamsDto, ProviderGraphDto, UserGraphDto } from '../../../libs/common/src'; import { WatchGraphsDto } from '../../../libs/common/src/dtos/watch-graphs.dto'; -@Controller('api') -@ApiTags('graph-service') -export class ApiController { +@Controller('v1') +@ApiTags('v1/graph') +export class GraphController { private readonly logger: Logger; constructor(private apiService: ApiService) { this.logger = new Logger(this.constructor.name); } - // Health endpoint - // eslint-disable-next-line class-methods-use-this - @Get('health') - @HttpCode(HttpStatus.OK) - @ApiOperation({ summary: 'Check the health status of the service' }) - @ApiOkResponse({ description: 'Service is healthy' }) - health() { - return { - status: HttpStatus.OK, - message: 'Service is healthy', - }; - } - // Fetch graphs for list of `dsnpIds` at optional `blockNumber` @Put('graphs') @HttpCode(HttpStatus.OK) diff --git a/apps/api/src/health.controller.ts b/apps/api/src/health.controller.ts new file mode 100644 index 00000000..73349c4c --- /dev/null +++ b/apps/api/src/health.controller.ts @@ -0,0 +1,45 @@ +import { Controller, Get, HttpCode, HttpStatus } from '@nestjs/common'; +import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; + +@Controller() +@ApiTags('health') +export class HealthController { + // Health endpoint + // eslint-disable-next-line class-methods-use-this + @Get('healthz') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Check the health status of the service' }) + @ApiOkResponse({ description: 'Service is healthy' }) + healthz() { + return { + status: HttpStatus.OK, + message: 'Service is healthy', + }; + } + + // Live endpoint + // eslint-disable-next-line class-methods-use-this + @Get('livez') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Check the live status of the service' }) + @ApiOkResponse({ description: 'Service is live' }) + livez() { + return { + status: HttpStatus.OK, + message: 'Service is live', + }; + } + + // Ready endpoint + // eslint-disable-next-line class-methods-use-this + @Get('readyz') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Check the ready status of the service' }) + @ApiOkResponse({ description: 'Service is ready' }) + readyz() { + return { + status: HttpStatus.OK, + message: 'Service is ready', + }; + } +} diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 0a33c65f..0051b535 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -27,7 +27,8 @@ async function bootstrap() { try { app.enableShutdownHooks(); app.useGlobalPipes(new ValidationPipe()); - await initSwagger(app, '/api/docs/swagger'); + + await initSwagger(app, '/docs/swagger'); const port = process.env.API_PORT || 3000; logger.log(`Listening on port ${port}`); await app.listen(port); diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index a6a006d3..a69e2f6e 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,15 +1,15 @@ /* eslint-disable */ export default async () => { const t = { - ['../../../libs/common/src/dtos/dsnp.graph.edge.dto']: await import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), - ['../../../libs/common/src/dtos/key.type.dto']: await import('../../../libs/common/src/dtos/key-type.enum'), - ['../../../libs/common/src/dtos/privacy.type.dto']: await import('../../../libs/common/src/dtos/privacy-type.enum'), - ['../../../libs/common/src/dtos/graph.key.pair.dto']: await import('../../../libs/common/src/dtos/graph-key-pair.dto'), - ['../../../libs/common/src/dtos/direction.dto']: await import('../../../libs/common/src/dtos/direction.enum'), - ['../../../libs/common/src/dtos/connection.type.dto']: await import('../../../libs/common/src/dtos/connection-type.enum'), - ['../../../libs/common/src/dtos/connections.dto']: await import('../../../libs/common/src/dtos/connection.dto'), - ['../../../libs/common/src/dtos/user.graph.dto']: await import('../../../libs/common/src/dtos/user-graph.dto'), - ['../../../libs/common/src/dtos/graph.change.request.reference']: await import('../../../libs/common/src/dtos/graph-change-response.dto'), + ['../../../libs/common/src/dtos/dsnp-graph-edge.dto']: await import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), + ['../../../libs/common/src/dtos/key-type.enum']: await import('../../../libs/common/src/dtos/key-type.enum'), + ['../../../libs/common/src/dtos/privacy-type.enum']: await import('../../../libs/common/src/dtos/privacy-type.enum'), + ['../../../libs/common/src/dtos/graph-key-pair.dto']: await import('../../../libs/common/src/dtos/graph-key-pair.dto'), + ['../../../libs/common/src/dtos/direction.enum']: await import('../../../libs/common/src/dtos/direction.enum'), + ['../../../libs/common/src/dtos/connection-type.enum']: await import('../../../libs/common/src/dtos/connection-type.enum'), + ['../../../libs/common/src/dtos/connection.dto']: await import('../../../libs/common/src/dtos/connection.dto'), + ['../../../libs/common/src/dtos/user-graph.dto']: await import('../../../libs/common/src/dtos/user-graph.dto'), + ['../../../libs/common/src/dtos/graph-change-response.dto']: await import('../../../libs/common/src/dtos/graph-change-response.dto'), }; return { '@nestjs/swagger': { @@ -23,7 +23,7 @@ export default async () => { { UserGraphDto: { dsnpId: { required: true, type: () => String }, - dsnpGraphEdges: { required: false, type: () => [t['../../../libs/common/src/dtos/dsnp.graph.edge.dto'].DsnpGraphEdge] }, + dsnpGraphEdges: { required: false, type: () => [t['../../../libs/common/src/dtos/dsnp-graph-edge.dto'].DsnpGraphEdge] }, }, }, ], @@ -33,7 +33,7 @@ export default async () => { GraphKeyPairDto: { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, - keyType: { required: true, type: () => String, enum: t['../../../libs/common/src/dtos/key.type.dto'].KeyType }, + keyType: { required: true, type: () => String, enum: t['../../../libs/common/src/dtos/key-type.enum'].KeyType }, }, }, ], @@ -42,8 +42,8 @@ export default async () => { { GraphsQueryParamsDto: { dsnpIds: { required: true, type: () => [String] }, - privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy.type.dto'].PrivacyType }, - graphKeyPairs: { required: true, type: () => [t['../../../libs/common/src/dtos/graph.key.pair.dto'].GraphKeyPairDto] }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, + graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, }, }, ], @@ -52,10 +52,11 @@ export default async () => { { ConnectionDto: { dsnpId: { required: true, type: () => String }, - privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy.type.dto'].PrivacyType }, - direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.dto'].Direction }, - connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection.type.dto'].ConnectionType }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, + direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.enum'].Direction }, + connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection-type.enum'].ConnectionType }, }, + ConnectionDtoWrapper: { data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }, }, ], [ @@ -63,8 +64,8 @@ export default async () => { { ProviderGraphDto: { dsnpId: { required: true, type: () => String }, - connections: { required: true, type: () => ({ data: { required: true, type: () => [t['../../../libs/common/src/dtos/connections.dto'].ConnectionDto] } }) }, - graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph.key.pair.dto'].GraphKeyPairDto] }, + connections: { required: true, type: () => ({ data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }) }, + graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, }, }, ], @@ -74,21 +75,43 @@ export default async () => { ], [ import('../../../libs/common/src/dtos/graph-change-notification.dto'), - { GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }, + { + PersistPageUpdateDto: { + type: { required: true, type: () => String }, + ownerDsnpUserId: { required: true, type: () => String }, + schemaId: { required: true, type: () => Number }, + pageId: { required: true, type: () => Number }, + prevHash: { required: true, type: () => Number }, + }, + DeletePageUpdateDto: { + type: { required: true, type: () => String }, + ownerDsnpUserId: { required: true, type: () => String }, + schemaId: { required: true, type: () => Number }, + pageId: { required: true, type: () => Number }, + prevHash: { required: true, type: () => Number }, + }, + AddKeyUpdateDto: { + type: { required: true, type: () => String }, + ownerDsnpUserId: { required: true, type: () => String }, + prevHash: { required: true, type: () => Number }, + }, + GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } }, + }, ], + [import('../../../libs/common/src/dtos/graph-change-response.dto'), { GraphChangeRepsonseDto: { referenceId: { required: true, type: () => String } } }], ], controllers: [ [ - import('./api.controller'), + import('./graph.controller'), { - ApiController: { - health: {}, - getGraphs: { type: [t['../../../libs/common/src/dtos/user.graph.dto'].UserGraphDto] }, - updateGraph: { type: t['../../../libs/common/src/dtos/graph.change.request.reference'].GraphChangeRepsonseDto }, + GraphController: { + getGraphs: { type: [t['../../../libs/common/src/dtos/user-graph.dto'].UserGraphDto] }, + updateGraph: { type: t['../../../libs/common/src/dtos/graph-change-response.dto'].GraphChangeRepsonseDto }, watchGraphs: {}, }, }, ], + [import('./health.controller'), { HealthController: { healthz: {}, livez: {}, readyz: {} } }], ], }, }; diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 47d2ed3e..8e638e6e 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -11,10 +11,10 @@ import { ChainUser, ExtrinsicHelper } from '@amplica-labs/frequency-scenario-tem import { setupProviderAndUsers } from './e2e-setup.mock.spec'; import { u8aToHex } from '@polkadot/util'; - let app: INestApplication; - let testModule: TestingModule; - let users: ChainUser[]; - let eventEmitter: EventEmitter2; +let app: INestApplication; +let testModule: TestingModule; +let users: ChainUser[]; +let eventEmitter: EventEmitter2; describe('Graph Service E2E request verification!', () => { beforeAll(async () => { @@ -38,9 +38,13 @@ describe('Graph Service E2E request verification!', () => { await ExtrinsicHelper.disconnect(); }); - it('(GET) /api/health', () => request(app.getHttpServer()).get('/api/health').expect(200).expect({ status: 200, message: 'Service is healthy' })); + it('(GET) /healthz', () => request(app.getHttpServer()).get('/healthz').expect(200).expect({ status: 200, message: 'Service is healthy' })); - describe('(POST) /api/update-graph', () => { + it('(GET) /livez', () => request(app.getHttpServer()).get('/livez').expect(200).expect({ status: 200, message: 'Service is live' })); + + it('(GET) /readyz', () => request(app.getHttpServer()).get('/readyz').expect(200).expect({ status: 200, message: 'Service is ready' })); + + describe('(POST) /v1/update-graph', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[0].msaId!.toString(), @@ -57,7 +61,7 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); @@ -96,7 +100,7 @@ describe('Graph Service E2E request verification!', () => { const requests = validGraphChangeRequests.map((requestPayload) => { console.log(`requestPayload.dsnpId: ${requestPayload.dsnpId}`); return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(requestPayload) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); @@ -128,7 +132,7 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); @@ -141,7 +145,7 @@ describe('Graph Service E2E request verification!', () => { } as GraphsQueryParamsDto; await request(app.getHttpServer()) - .put(`/api/graphs`) + .put(`/v1/graphs`) .send(userGraphGet) .expect(200) .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); @@ -161,14 +165,14 @@ describe('Graph Service E2E request verification!', () => { } as GraphsQueryParamsDto; await request(app.getHttpServer()) - .put(`/api/graphs`) + .put(`/v1/graphs`) .send(userGraphGet) .expect(200) .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); }); }); - describe('(POST) /api/update-graph with public disconnect', () => { + describe('(POST) /v1/update-graph with public disconnect', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[0].msaId!.toString(), @@ -185,14 +189,14 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); }); }); - describe('(POST) /api/update-graph with private disconnect', () => { + describe('(POST) /v1/update-graph with private disconnect', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[0].msaId!.toString(), @@ -216,14 +220,14 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); }); }); - describe('(POST) /api/update-graph with private friend request user A -> B', () => { + describe('(POST) /v1/update-graph with private friend request user A -> B', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[0].msaId!.toString(), @@ -247,14 +251,14 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); }); }); - describe('(POST) /api/update-graph with private friend request from user B -> A', () => { + describe('(POST) /v1/update-graph with private friend request from user B -> A', () => { it('Valid private graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[1].msaId!.toString(), @@ -278,13 +282,13 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); }); }); - describe('(POST) /api/update-graph with bi-directional connection', () => { + describe('(POST) /v1/update-graph with bi-directional connection', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[0].msaId!.toString(), @@ -301,7 +305,7 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/api/update-graph`) + .post(`/v1/update-graph`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); diff --git a/apps/api/test/e2e-setup.mock.spec.ts b/apps/api/test/e2e-setup.mock.spec.ts index 9f2d6900..8ab233a6 100644 --- a/apps/api/test/e2e-setup.mock.spec.ts +++ b/apps/api/test/e2e-setup.mock.spec.ts @@ -1,12 +1,6 @@ /* eslint-disable no-await-in-loop */ /* eslint-disable no-restricted-syntax */ -import { - initialize, - getCurrentBlockNumber, - provisionProvider, - initializeLocalUsers, - ExtrinsicHelper, -} from '@amplica-labs/frequency-scenario-template'; +import { initialize, getCurrentBlockNumber, provisionProvider, initializeLocalUsers, ExtrinsicHelper } from '@amplica-labs/frequency-scenario-template'; import { cryptoWaitReady } from '@polkadot/util-crypto'; import log from 'loglevel'; diff --git a/apps/api/test/setup/package-lock.json b/apps/api/test/setup/package-lock.json index 86900c05..c512409f 100644 --- a/apps/api/test/setup/package-lock.json +++ b/apps/api/test/setup/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@amplica-labs/frequency-scenario-template": "^1.1.4", "@dsnp/frequency-schemas": "^1.1.0", - "@dsnp/graph-sdk": "^1.0.1", + "@dsnp/graph-sdk": "^1.1.3", "@frequency-chain/api-augment": "^1.10.0", "@polkadot/api": "^10.9.1", "@polkadot/keyring": "^12.4.2", diff --git a/apps/api/test/setup/package.json b/apps/api/test/setup/package.json index c3cff7a0..68bab964 100644 --- a/apps/api/test/setup/package.json +++ b/apps/api/test/setup/package.json @@ -13,7 +13,7 @@ "dependencies": { "@amplica-labs/frequency-scenario-template": "^1.1.4", "@dsnp/frequency-schemas": "^1.1.0", - "@dsnp/graph-sdk": "^1.0.1", + "@dsnp/graph-sdk": "^1.1.3", "@frequency-chain/api-augment": "^1.10.0", "@polkadot/api": "^10.9.1", "@polkadot/keyring": "^12.4.2", diff --git a/env.template b/env.template index 3177ee04..d2699444 100644 --- a/env.template +++ b/env.template @@ -1,4 +1,4 @@ -# Copy this file to ".env.dev" and ".env", and then tweak values for local development +# Copy this file to ".env", and then tweak values for local development # Port that the application REST endpoints listen on API_PORT=3000 diff --git a/libs/common/src/config/swagger_config.ts b/libs/common/src/config/swagger_config.ts index 67170565..9054691d 100644 --- a/libs/common/src/config/swagger_config.ts +++ b/libs/common/src/config/swagger_config.ts @@ -3,7 +3,7 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import * as fs from 'fs'; import metadata from '../../../../apps/api/src/metadata'; -export const initSwagger = async (app: INestApplication, apiPath: string) => { +export const generateSwaggerDoc = async (app: INestApplication) => { const options = new DocumentBuilder() .setTitle('Graph Service') .setDescription('Graph Service API') @@ -16,11 +16,17 @@ export const initSwagger = async (app: INestApplication, apiPath: string) => { .build(); await SwaggerModule.loadPluginMetadata(metadata); - const document = SwaggerModule.createDocument(app, options, { + return SwaggerModule.createDocument(app, options, { extraModels: [], }); +}; + +export const initSwagger = async (app: INestApplication, apiPath: string) => { + const document = await generateSwaggerDoc(app); - // write swagger.json to disk - // fs.writeFileSync('./swagger.json', JSON.stringify(document, (_, v) => v, 2)); + fs.writeFileSync( + './swagger.json', + JSON.stringify(document, (_, v) => v, 2), + ); SwaggerModule.setup(apiPath, app, document); }; diff --git a/libs/common/src/dtos/graph-change-notification.dto.ts b/libs/common/src/dtos/graph-change-notification.dto.ts index f71c09ad..292317ab 100644 --- a/libs/common/src/dtos/graph-change-notification.dto.ts +++ b/libs/common/src/dtos/graph-change-notification.dto.ts @@ -2,36 +2,34 @@ import { AddKeyUpdate, DeletePageUpdate, PersistPageUpdate, Update } from '@dsnp import { ApiProperty } from '@nestjs/swagger'; export class PersistPageUpdateDto implements PersistPageUpdate { - type: "PersistPage"; - ownerDsnpUserId: string; - schemaId: number; - pageId: number; - prevHash: number; - payload: Uint8Array; + type: 'PersistPage'; + ownerDsnpUserId: string; + schemaId: number; + pageId: number; + prevHash: number; + payload: Uint8Array; } export class DeletePageUpdateDto implements DeletePageUpdate { - type: "DeletePage"; - ownerDsnpUserId: string; - schemaId: number; - pageId: number; - prevHash: number; + type: 'DeletePage'; + ownerDsnpUserId: string; + schemaId: number; + pageId: number; + prevHash: number; } export class AddKeyUpdateDto implements AddKeyUpdate { - type: "AddKey"; - ownerDsnpUserId: string; - prevHash: number; - payload: Uint8Array; + type: 'AddKey'; + ownerDsnpUserId: string; + prevHash: number; + payload: Uint8Array; } - export class GraphChangeNotificationDto { @ApiProperty({ description: 'MSA ID for which this notification is being sent', type: String, example: '2' }) dsnpId: string; - @ApiProperty({ description: 'The payload of the specific update. Content depends on the type of update (Add, Delete, Persist)', oneOf: [ - { type: 'PersistPageUpdateDto' }, - { type: 'DeletePageUpdateDto' }, - { type: 'AddKeyUpdateDto' } - ]}) + @ApiProperty({ + description: 'The payload of the specific update. Content depends on the type of update (Add, Delete, Persist)', + oneOf: [{ type: 'PersistPageUpdateDto' }, { type: 'DeletePageUpdateDto' }, { type: 'AddKeyUpdateDto' }], + }) update: Update; } diff --git a/libs/common/src/dtos/graph-change-response.dto.ts b/libs/common/src/dtos/graph-change-response.dto.ts index 7adfbeb5..1f30fde2 100644 --- a/libs/common/src/dtos/graph-change-response.dto.ts +++ b/libs/common/src/dtos/graph-change-response.dto.ts @@ -1,4 +1,4 @@ -import { ApiProperty } from "@nestjs/swagger"; +import { ApiProperty } from '@nestjs/swagger'; export class GraphChangeRepsonseDto { @ApiProperty({ description: 'Reference ID by which the results/status of a submitted GraphChangeRequest may be retrieved', type: String }) diff --git a/libs/common/src/dtos/provider-graph.dto.ts b/libs/common/src/dtos/provider-graph.dto.ts index f4e283e4..d883c101 100644 --- a/libs/common/src/dtos/provider-graph.dto.ts +++ b/libs/common/src/dtos/provider-graph.dto.ts @@ -6,7 +6,7 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export type ConnectionsDtoWrapper = { data: ConnectionDto[]; -} +}; export class ProviderGraphDto { @IsNotEmpty() diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/libs/common/src/dtos/watch-graphs.dto.ts index f98c85db..eb8def6e 100644 --- a/libs/common/src/dtos/watch-graphs.dto.ts +++ b/libs/common/src/dtos/watch-graphs.dto.ts @@ -4,7 +4,7 @@ import { IsArray, IsNotEmpty, IsString, IsUrl } from 'class-validator'; export class WatchGraphsDto { @IsArray() @IsNotEmpty() - @ApiProperty({ description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5']}) + @ApiProperty({ description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5'] }) dsnpIds: string[]; @IsNotEmpty() diff --git a/package-lock.json b/package-lock.json index 8b888d20..27e83d30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@bull-board/nestjs": "^5.17.1", "@bull-board/ui": "^5.17.1", "@dsnp/frequency-schemas": "^1.1.0", - "@dsnp/graph-sdk": "^1.1.2", + "@dsnp/graph-sdk": "^1.1.3", "@dsnp/parquetjs": "^1.6.2", "@frequency-chain/api-augment": "1.11.1", "@multiformats/blake2": "^1.0.13", diff --git a/package.json b/package.json index 1b9bf55f..c76465e5 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,9 @@ "main": "dist/apps/api/main.js", "scripts": { "build": "nest build api && nest build worker", - "build:swagger": "npx ts-node apps/api/src/generate-metadata.ts", - "generate-swagger-ui": "npx --yes @redocly/cli build-docs swagger.yaml --output=./docs/index.html", + "build:swagger": "npx ts-node -r tsconfig-paths/register apps/api/src/build-openapi.ts", + "build:metadata": "npx ts-node apps/api/src/generate-metadata.ts", + "generate-swagger-ui": "npx --yes @redocly/cli build-docs swagger.json --output=./docs/index.html", "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start:api": "nest start api", "start:api:watch": "nest start api --watch", @@ -46,7 +47,7 @@ "@bull-board/nestjs": "^5.17.1", "@bull-board/ui": "^5.17.1", "@dsnp/frequency-schemas": "^1.1.0", - "@dsnp/graph-sdk": "^1.1.2", + "@dsnp/graph-sdk": "^1.1.3", "@dsnp/parquetjs": "^1.6.2", "@frequency-chain/api-augment": "1.11.1", "@multiformats/blake2": "^1.0.13", diff --git a/swagger.json b/swagger.json new file mode 100644 index 00000000..d8b3d804 --- /dev/null +++ b/swagger.json @@ -0,0 +1,339 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/graphs": { + "put": { + "operationId": "GraphController_getGraphs", + "summary": "Post a request to fetch graphs for specified dsnpIds and blockNumber", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphsQueryParamsDto" + } + } + } + }, + "responses": { + "200": { + "description": "Graphs retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserGraphDto" + } + } + } + } + } + }, + "tags": [ + "v1/graph" + ] + } + }, + "/v1/update-graph": { + "post": { + "operationId": "GraphController_updateGraph", + "summary": "Request an update to given users graph", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProviderGraphDto" + } + } + } + }, + "responses": { + "201": { + "description": "Graph update request created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphChangeRepsonseDto" + } + } + } + } + }, + "tags": [ + "v1/graph" + ] + } + }, + "/v1/watch-graphs": { + "put": { + "operationId": "GraphController_watchGraphs", + "summary": "Watch graphs for specified dsnpIds and receive updates", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WatchGraphsDto" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully started watching graphs" + } + }, + "tags": [ + "v1/graph" + ] + } + }, + "/healthz": { + "get": { + "operationId": "HealthController_healthz", + "summary": "Check the health status of the service", + "parameters": [], + "responses": { + "200": { + "description": "Service is healthy" + } + }, + "tags": [ + "health" + ] + } + }, + "/livez": { + "get": { + "operationId": "HealthController_livez", + "summary": "Check the live status of the service", + "parameters": [], + "responses": { + "200": { + "description": "Service is live" + } + }, + "tags": [ + "health" + ] + } + }, + "/readyz": { + "get": { + "operationId": "HealthController_readyz", + "summary": "Check the ready status of the service", + "parameters": [], + "responses": { + "200": { + "description": "Service is ready" + } + }, + "tags": [ + "health" + ] + } + } + }, + "info": { + "title": "Graph Service", + "description": "Graph Service API", + "version": "1.0", + "contact": {} + }, + "tags": [], + "servers": [], + "components": { + "securitySchemes": { + "bearer": { + "scheme": "bearer", + "bearerFormat": "JWT", + "type": "http", + "description": "Enter JWT token" + }, + "cookie": { + "type": "apiKey", + "in": "cookie", + "name": "SESSION" + } + }, + "schemas": { + "GraphKeyPairDto": { + "type": "object", + "properties": { + "publicKey": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "keyType": { + "type": "string", + "enum": [ + "X25519" + ] + } + }, + "required": [ + "publicKey", + "privateKey", + "keyType" + ] + }, + "GraphsQueryParamsDto": { + "type": "object", + "properties": { + "dsnpIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "privacyType": { + "type": "string", + "enum": [ + "private", + "public" + ] + }, + "graphKeyPairs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GraphKeyPairDto" + } + } + }, + "required": [ + "dsnpIds", + "privacyType", + "graphKeyPairs" + ] + }, + "DsnpGraphEdge": { + "type": "object", + "properties": { + "userId": { + "type": "string" + }, + "since": { + "type": "number" + } + }, + "required": [ + "userId", + "since" + ] + }, + "UserGraphDto": { + "type": "object", + "properties": { + "dsnpId": { + "type": "string" + }, + "dsnpGraphEdges": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DsnpGraphEdge" + } + } + }, + "required": [ + "dsnpId" + ] + }, + "ConnectionDto": { + "type": "object", + "properties": { + "dsnpId": { + "type": "string" + }, + "privacyType": { + "type": "string", + "enum": [ + "private", + "public" + ] + }, + "direction": { + "type": "string", + "enum": [ + "connectionTo", + "connectionFrom", + "bidirectional", + "disconnect" + ] + }, + "connectionType": { + "type": "string", + "enum": [ + "follow", + "friendship" + ] + } + }, + "required": [ + "dsnpId", + "privacyType", + "direction", + "connectionType" + ] + }, + "ProviderGraphDto": { + "type": "object", + "properties": { + "dsnpId": { + "type": "string" + }, + "connections": { + "type": "object", + "properties": { + "data": { + "required": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectionDto" + } + } + } + }, + "graphKeyPairs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GraphKeyPairDto" + } + } + }, + "required": [ + "dsnpId", + "connections" + ] + }, + "GraphChangeRepsonseDto": { + "type": "object", + "properties": {} + }, + "WatchGraphsDto": { + "type": "object", + "properties": { + "dsnpIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "webhookEndpoint": { + "type": "string" + } + }, + "required": [ + "dsnpIds", + "webhookEndpoint" + ] + } + } + } +} \ No newline at end of file diff --git a/swagger.yaml b/swagger.yaml deleted file mode 100644 index eba329be..00000000 --- a/swagger.yaml +++ /dev/null @@ -1,207 +0,0 @@ -openapi: 3.0.0 -paths: - /api/health: - get: - operationId: ApiController_health - summary: Check the health status of the service - parameters: [] - responses: - '200': - description: Service is healthy - tags: - - graph-service - /api/graphs: - put: - operationId: ApiController_getGraphs - summary: Post a request to fetch graphs for specified dsnpIds and blockNumber - parameters: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/GraphsQueryParamsDto' - responses: - '200': - description: Graphs retrieved successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UserGraphDto' - tags: - - graph-service - /api/update-graph: - post: - operationId: ApiController_updateGraph - summary: Request an update to given users graph - parameters: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ProviderGraphDto' - responses: - '201': - description: Graph update request created successfully - content: - application/json: - schema: - $ref: '#/components/schemas/GraphChangeRepsonseDto' - tags: - - graph-service - /api/watch-graphs: - put: - operationId: ApiController_watchGraphs - summary: Watch graphs for specified dsnpIds and receive updates - parameters: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WatchGraphsDto' - responses: - '200': - description: Successfully started watching graphs - tags: - - graph-service -info: - title: Graph Service - description: Graph Service API - version: '1.0' - contact: {} -tags: [] -servers: [] -components: - securitySchemes: - bearer: - scheme: bearer - bearerFormat: JWT - type: http - description: Enter JWT token - cookie: - type: apiKey - in: cookie - name: SESSION - schemas: - GraphKeyPairDto: - type: object - properties: - publicKey: - type: string - privateKey: - type: string - keyType: - type: string - enum: - - X25519 - required: - - publicKey - - privateKey - - keyType - GraphsQueryParamsDto: - type: object - properties: - dsnpIds: - type: array - items: - type: string - privacyType: - type: string - enum: - - private - - public - graphKeyPairs: - type: array - items: - $ref: '#/components/schemas/GraphKeyPairDto' - required: - - dsnpIds - - privacyType - - graphKeyPairs - DsnpGraphEdge: - type: object - properties: - userId: - type: string - since: - type: number - required: - - userId - - since - UserGraphDto: - type: object - properties: - dsnpId: - type: string - dsnpGraphEdges: - type: array - items: - $ref: '#/components/schemas/DsnpGraphEdge' - required: - - dsnpId - ConnectionDto: - type: object - properties: - dsnpId: - type: string - privacyType: - type: string - enum: - - private - - public - direction: - type: string - enum: - - connectionTo - - connectionFrom - - bidirectional - - disconnect - connectionType: - type: string - enum: - - follow - - friendship - required: - - dsnpId - - privacyType - - direction - - connectionType - ProviderGraphDto: - type: object - properties: - dsnpId: - type: string - connections: - type: object - properties: - data: - required: true - type: array - items: - $ref: '#/components/schemas/ConnectionDto' - graphKeyPairs: - type: array - items: - $ref: '#/components/schemas/GraphKeyPairDto' - required: - - dsnpId - - connections - GraphChangeRepsonseDto: - type: object - properties: {} - WatchGraphsDto: - type: object - properties: - dsnpIds: - type: array - items: - type: string - webhookEndpoint: - type: string - required: - - dsnpIds - - webhookEndpoint From 8a9c352730dfce9ec9c8dba8797beda8254d107c Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Fri, 28 Jun 2024 13:55:08 -0400 Subject: [PATCH 44/53] Import updates and lint (#99) - Restructure imports to use path aliases instead of relative paths - Lint fixes - Refactor controller files into `controllers/v1/...` directory structure, add `V1` to class names for controllers (except health controller) --------- Co-authored-by: Wil Wade --- apps/api/src/api.module.ts | 13 +- apps/api/src/api.service.ts | 17 +-- .../{ => controllers}/health.controller.ts | 0 .../v1/graph-v1.controller.ts} | 9 +- apps/api/src/main.ts | 2 +- apps/api/src/metadata.ts | 129 ++---------------- apps/api/test/app.e2e-spec.ts | 7 +- apps/worker/src/BaseConsumer.ts | 7 +- .../graph.monitor.processor.module.ts | 12 +- .../graph.monitor.processor.service.ts | 12 +- .../graph.publisher.processor.module.ts | 7 +- .../graph.publisher.processor.service.ts | 18 +-- .../graph.reconnection.processor.module.ts | 9 +- .../graph.reconnection.processor.service.ts | 15 +- .../request.processor.module.ts | 7 +- .../request.processor.service.ts | 12 +- apps/worker/src/worker.module.ts | 16 +-- libs/common/src/blockchain/index.ts | 6 + libs/common/src/config/index.ts | 4 + libs/common/src/dtos/index.ts | 15 ++ libs/common/src/index.ts | 28 +--- libs/common/src/interfaces/index.ts | 3 + libs/common/src/services/index.ts | 5 + libs/common/src/utils/index.ts | 4 + package.json | 13 +- swagger.json | 123 ++++++++++++----- tsconfig.json | 57 +++++++- 27 files changed, 264 insertions(+), 286 deletions(-) rename apps/api/src/{ => controllers}/health.controller.ts (100%) rename apps/api/src/{graph.controller.ts => controllers/v1/graph-v1.controller.ts} (84%) create mode 100644 libs/common/src/blockchain/index.ts create mode 100644 libs/common/src/config/index.ts create mode 100644 libs/common/src/dtos/index.ts create mode 100644 libs/common/src/interfaces/index.ts create mode 100644 libs/common/src/services/index.ts create mode 100644 libs/common/src/utils/index.ts diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index 333182dd..e8961fb7 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -6,14 +6,11 @@ import { RedisModule } from '@songkeys/nestjs-redis'; import { BullBoardModule } from '@bull-board/nestjs'; import { BullMQAdapter } from '@bull-board/api/bullMQAdapter'; import { ExpressAdapter } from '@bull-board/express'; -import { GraphController } from './graph.controller'; -import { HealthController } from './health.controller'; +import { GraphControllerV1 } from './controllers/v1/graph-v1.controller'; +import { HealthController } from './controllers/health.controller'; import { ApiService } from './api.service'; -import { ConfigModule } from '../../../libs/common/src/config/config.module'; -import { ConfigService } from '../../../libs/common/src/config/config.service'; -import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; -import { GraphStateManager } from '../../../libs/common/src'; -import * as QueueConstants from '../../../libs/common/src/utils/queues'; +import { BlockchainModule, ConfigModule, ConfigService, GraphStateManager } from '#lib'; +import * as QueueConstants from '#lib/utils/queues' @Module({ imports: [ @@ -128,7 +125,7 @@ import * as QueueConstants from '../../../libs/common/src/utils/queues'; ScheduleModule.forRoot(), ], providers: [ApiService, GraphStateManager, ConfigService], - controllers: [GraphController, HealthController], + controllers: [GraphControllerV1, HealthController], exports: [], }) export class ApiModule {} diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 6c4b167c..ff6dffed 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -5,19 +5,8 @@ import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { createHash } from 'crypto'; import { MessageSourceId } from '@frequency-chain/api-augment/interfaces'; -import { - AsyncDebouncerService, - GraphChangeRepsonseDto, - GraphStateManager, - GraphsQueryParamsDto, - ProviderGraphDto, - ProviderGraphUpdateJob, - UserGraphDto, - WatchGraphsDto, -} from '../../../libs/common/src'; -import * as QueueConstants from '../../../libs/common/src/utils/queues'; -import { ConfigService } from '../../../libs/common/src/config/config.service'; -import { BlockchainService } from '../../../libs/common/src/blockchain/blockchain.service'; +import * as QueueConstants from '#lib/utils/queues'; +import { AsyncDebouncerService, BlockchainService, ConfigService, GraphChangeRepsonseDto, GraphStateManager, GraphsQueryParamsDto, ProviderGraphDto, ProviderGraphUpdateJob, UserGraphDto, WatchGraphsDto } from '#lib'; @Injectable() export class ApiService implements BeforeApplicationShutdown { @@ -36,7 +25,7 @@ export class ApiService implements BeforeApplicationShutdown { this.asyncDebouncerService = new AsyncDebouncerService(this.redis, this.configService, this.graphStateManager); } - beforeApplicationShutdown(signal?: string | undefined) { + beforeApplicationShutdown(_signal?: string | undefined) { try { this.redis.del(QueueConstants.REDIS_WATCHER_PREFIX); this.redis.del(QueueConstants.DEBOUNCER_CACHE_KEY); diff --git a/apps/api/src/health.controller.ts b/apps/api/src/controllers/health.controller.ts similarity index 100% rename from apps/api/src/health.controller.ts rename to apps/api/src/controllers/health.controller.ts diff --git a/apps/api/src/graph.controller.ts b/apps/api/src/controllers/v1/graph-v1.controller.ts similarity index 84% rename from apps/api/src/graph.controller.ts rename to apps/api/src/controllers/v1/graph-v1.controller.ts index b6f83986..7302b268 100644 --- a/apps/api/src/graph.controller.ts +++ b/apps/api/src/controllers/v1/graph-v1.controller.ts @@ -1,12 +1,11 @@ -import { Controller, Get, Post, HttpCode, HttpStatus, Logger, Query, Body, Put } from '@nestjs/common'; +import { ApiService } from '#api/api.service'; +import { UserGraphDto, GraphsQueryParamsDto, GraphChangeRepsonseDto, ProviderGraphDto, WatchGraphsDto } from '#lib'; +import { Controller, Post, HttpCode, HttpStatus, Logger, Body, Put } from '@nestjs/common'; import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; -import { ApiService } from './api.service'; -import { GraphChangeRepsonseDto, GraphsQueryParamsDto, ProviderGraphDto, UserGraphDto } from '../../../libs/common/src'; -import { WatchGraphsDto } from '../../../libs/common/src/dtos/watch-graphs.dto'; @Controller('v1') @ApiTags('v1/graph') -export class GraphController { +export class GraphControllerV1 { private readonly logger: Logger; constructor(private apiService: ApiService) { diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 0051b535..f960541e 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -2,7 +2,7 @@ import { NestFactory } from '@nestjs/core'; import { Logger, ValidationPipe } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { ApiModule } from './api.module'; -import { initSwagger } from '../../../libs/common/src/config/swagger_config'; +import { initSwagger } from '#lib/config/swagger_config'; const logger = new Logger('main'); diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index a69e2f6e..cf4cb38b 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,118 +1,15 @@ /* eslint-disable */ export default async () => { - const t = { - ['../../../libs/common/src/dtos/dsnp-graph-edge.dto']: await import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), - ['../../../libs/common/src/dtos/key-type.enum']: await import('../../../libs/common/src/dtos/key-type.enum'), - ['../../../libs/common/src/dtos/privacy-type.enum']: await import('../../../libs/common/src/dtos/privacy-type.enum'), - ['../../../libs/common/src/dtos/graph-key-pair.dto']: await import('../../../libs/common/src/dtos/graph-key-pair.dto'), - ['../../../libs/common/src/dtos/direction.enum']: await import('../../../libs/common/src/dtos/direction.enum'), - ['../../../libs/common/src/dtos/connection-type.enum']: await import('../../../libs/common/src/dtos/connection-type.enum'), - ['../../../libs/common/src/dtos/connection.dto']: await import('../../../libs/common/src/dtos/connection.dto'), - ['../../../libs/common/src/dtos/user-graph.dto']: await import('../../../libs/common/src/dtos/user-graph.dto'), - ['../../../libs/common/src/dtos/graph-change-response.dto']: await import('../../../libs/common/src/dtos/graph-change-response.dto'), - }; - return { - '@nestjs/swagger': { - models: [ - [ - import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), - { DsnpGraphEdge: { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }, - ], - [ - import('../../../libs/common/src/dtos/user-graph.dto'), - { - UserGraphDto: { - dsnpId: { required: true, type: () => String }, - dsnpGraphEdges: { required: false, type: () => [t['../../../libs/common/src/dtos/dsnp-graph-edge.dto'].DsnpGraphEdge] }, - }, - }, - ], - [ - import('../../../libs/common/src/dtos/graph-key-pair.dto'), - { - GraphKeyPairDto: { - publicKey: { required: true, type: () => String }, - privateKey: { required: true, type: () => String }, - keyType: { required: true, type: () => String, enum: t['../../../libs/common/src/dtos/key-type.enum'].KeyType }, - }, - }, - ], - [ - import('../../../libs/common/src/dtos/graph-query-params.dto'), - { - GraphsQueryParamsDto: { - dsnpIds: { required: true, type: () => [String] }, - privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, - graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, - }, - }, - ], - [ - import('../../../libs/common/src/dtos/connection.dto'), - { - ConnectionDto: { - dsnpId: { required: true, type: () => String }, - privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, - direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.enum'].Direction }, - connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection-type.enum'].ConnectionType }, - }, - ConnectionDtoWrapper: { data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }, - }, - ], - [ - import('../../../libs/common/src/dtos/provider-graph.dto'), - { - ProviderGraphDto: { - dsnpId: { required: true, type: () => String }, - connections: { required: true, type: () => ({ data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }) }, - graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, - }, - }, - ], - [ - import('../../../libs/common/src/dtos/watch-graphs.dto'), - { WatchGraphsDto: { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }, - ], - [ - import('../../../libs/common/src/dtos/graph-change-notification.dto'), - { - PersistPageUpdateDto: { - type: { required: true, type: () => String }, - ownerDsnpUserId: { required: true, type: () => String }, - schemaId: { required: true, type: () => Number }, - pageId: { required: true, type: () => Number }, - prevHash: { required: true, type: () => Number }, - }, - DeletePageUpdateDto: { - type: { required: true, type: () => String }, - ownerDsnpUserId: { required: true, type: () => String }, - schemaId: { required: true, type: () => Number }, - pageId: { required: true, type: () => Number }, - prevHash: { required: true, type: () => Number }, - }, - AddKeyUpdateDto: { - type: { required: true, type: () => String }, - ownerDsnpUserId: { required: true, type: () => String }, - prevHash: { required: true, type: () => Number }, - }, - GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } }, - }, - ], - [import('../../../libs/common/src/dtos/graph-change-response.dto'), { GraphChangeRepsonseDto: { referenceId: { required: true, type: () => String } } }], - ], - controllers: [ - [ - import('./graph.controller'), - { - GraphController: { - getGraphs: { type: [t['../../../libs/common/src/dtos/user-graph.dto'].UserGraphDto] }, - updateGraph: { type: t['../../../libs/common/src/dtos/graph-change-response.dto'].GraphChangeRepsonseDto }, - watchGraphs: {}, - }, - }, - ], - [import('./health.controller'), { HealthController: { healthz: {}, livez: {}, readyz: {} } }], - ], - }, - }; -}; + const t = { + ["../../../libs/common/src/dtos/key-type.enum"]: await import("../../../libs/common/src/dtos/key-type.enum"), + ["../../../libs/common/src/dtos/privacy-type.enum"]: await import("../../../libs/common/src/dtos/privacy-type.enum"), + ["../../../libs/common/src/dtos/direction.enum"]: await import("../../../libs/common/src/dtos/direction.enum"), + ["../../../libs/common/src/dtos/connection-type.enum"]: await import("../../../libs/common/src/dtos/connection-type.enum"), + ["../../../libs/common/src/dtos/connection.dto"]: await import("../../../libs/common/src/dtos/connection.dto"), + ["../../../libs/common/src/dtos/dsnp-graph-edge.dto"]: await import("../../../libs/common/src/dtos/dsnp-graph-edge.dto"), + ["../../../libs/common/src/dtos/graph-key-pair.dto"]: await import("../../../libs/common/src/dtos/graph-key-pair.dto"), + ["../../../libs/common/src/dtos/user-graph.dto"]: await import("../../../libs/common/src/dtos/user-graph.dto"), + ["../../../libs/common/src/dtos/graph-change-response.dto"]: await import("../../../libs/common/src/dtos/graph-change-response.dto") + }; + return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp-graph-edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/graph-key-pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key-type.enum"].KeyType } } }], [import("../../../libs/common/src/dtos/connection.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy-type.enum"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.enum"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection-type.enum"].ConnectionType } }, "ConnectionDtoWrapper": { data: { required: true, type: () => [t["../../../libs/common/src/dtos/connection.dto"].ConnectionDto] } } }], [import("../../../libs/common/src/dtos/user-graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdges: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp-graph-edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph-change-response.dto"), { "GraphChangeRepsonseDto": { referenceId: { required: true, type: () => String } } }], [import("../../../libs/common/src/dtos/graph-query-params.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy-type.enum"].PrivacyType }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph-key-pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/provider-graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connection.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph-key-pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }], [import("../../../libs/common/src/dtos/graph-change-notification.dto"), { "PersistPageUpdateDto": { type: { required: true, type: () => String }, ownerDsnpUserId: { required: true, type: () => String }, schemaId: { required: true, type: () => Number }, pageId: { required: true, type: () => Number }, prevHash: { required: true, type: () => Number } }, "DeletePageUpdateDto": { type: { required: true, type: () => String }, ownerDsnpUserId: { required: true, type: () => String }, schemaId: { required: true, type: () => Number }, pageId: { required: true, type: () => Number }, prevHash: { required: true, type: () => Number } }, "AddKeyUpdateDto": { type: { required: true, type: () => String }, ownerDsnpUserId: { required: true, type: () => String }, prevHash: { required: true, type: () => Number } }, "GraphChangeNotificationDto": { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }]], "controllers": [[import("./controllers/health.controller"), { "HealthController": { "healthz": {}, "livez": {}, "readyz": {} } }], [import("./controllers/v1/graph-v1.controller"), { "GraphControllerV1": { "getGraphs": { type: [t["../../../libs/common/src/dtos/user-graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph-change-response.dto"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; +}; \ No newline at end of file diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 8e638e6e..422b2931 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -3,13 +3,12 @@ import { INestApplication, ValidationPipe } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import request from 'supertest'; import { EventEmitter2 } from '@nestjs/event-emitter'; -import { ApiModule } from '../src/api.module'; -import { ConnectionDto, GraphKeyPairDto, GraphsQueryParamsDto, KeyType, PrivacyType, ProviderGraphDto } from '../../../libs/common/src'; -import { Direction } from '../../../libs/common/src/dtos/direction.enum'; -import { ConnectionType } from '../../../libs/common/src/dtos/connection-type.enum'; import { ChainUser, ExtrinsicHelper } from '@amplica-labs/frequency-scenario-template'; import { setupProviderAndUsers } from './e2e-setup.mock.spec'; import { u8aToHex } from '@polkadot/util'; +import { ApiModule } from '#api/api.module'; +import { ProviderGraphDto, ConnectionDto, KeyType, GraphKeyPairDto, GraphsQueryParamsDto, Direction } from '#lib/dtos'; +import { PrivacyType, ConnectionType } from '@dsnp/graph-sdk'; let app: INestApplication; let testModule: TestingModule; diff --git a/apps/worker/src/BaseConsumer.ts b/apps/worker/src/BaseConsumer.ts index 43bd402b..6314cb2f 100644 --- a/apps/worker/src/BaseConsumer.ts +++ b/apps/worker/src/BaseConsumer.ts @@ -1,7 +1,7 @@ import { OnWorkerEvent, WorkerHost } from '@nestjs/bullmq'; import { Logger, OnModuleDestroy } from '@nestjs/common'; import { Job, Worker } from 'bullmq'; -import * as ProcessingUtils from '../../../libs/common/src/utils/processing'; +import * as ProcessingUtils from '#lib/utils/processing'; export abstract class BaseConsumer extends WorkerHost implements OnModuleDestroy { protected logger: Logger; @@ -22,7 +22,7 @@ export abstract class BaseConsumer extends WorkerHost this.actives.delete(jobId); } - async onModuleDestroy(): Promise { + async onModuleDestroy(): Promise { await this.worker?.close(false); let maxWaitMs = ProcessingUtils.MAX_WAIT_FOR_GRACE_FULL_SHUTDOWN_MS; while (this.actives.size > 0 && maxWaitMs > 0) { @@ -37,6 +37,7 @@ export abstract class BaseConsumer extends WorkerHost */ @OnWorkerEvent('active') onActive(job: Job) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.trackJob(job.id!); } @@ -45,6 +46,7 @@ export abstract class BaseConsumer extends WorkerHost */ @OnWorkerEvent('completed') onCompleted(job: Job) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.unTrackJob(job.id!); } @@ -53,6 +55,7 @@ export abstract class BaseConsumer extends WorkerHost */ @OnWorkerEvent('failed') onFailed(job: Job) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.unTrackJob(job.id!); } } diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index c7a3c53e..e1fbff3e 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -1,17 +1,9 @@ -/* -https://docs.nestjs.com/modules -*/ - +import { BlockchainModule, BlockchainService, ConfigModule, ConfigService, GraphStateManager } from '#lib'; import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; import { RedisModule } from '@songkeys/nestjs-redis'; -import { ConfigModule } from '../../../../libs/common/src/config/config.module'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { GraphStateManager } from '../../../../libs/common/src'; import { GraphNotifierService } from './graph.monitor.processor.service'; -import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; -import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; +import * as QueueConstants from '#lib/utils/queues'; @Module({ imports: [ diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 24dacb74..316900c6 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -7,13 +7,9 @@ import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { RegistryError } from '@polkadot/types/types'; import axios from 'axios'; import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { AsyncDebouncerService, GraphChangeNotificationDto, GraphStateManager, ProviderGraphUpdateJob, SECONDS_PER_BLOCK } from '../../../../libs/common/src'; -import { BaseConsumer } from '../BaseConsumer'; -import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; -import * as BlockchainConstants from '../../../../libs/common/src/blockchain/blockchain-constants'; -import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; +import { BaseConsumer, AsyncDebouncerService, BlockchainService, GraphStateManager, ITxMonitorJob, ProviderGraphUpdateJob, GraphChangeNotificationDto, SECONDS_PER_BLOCK, ConfigService } from '#lib'; +import * as QueueConstants from '#lib/utils/queues'; +import * as BlockchainConstants from '#lib/blockchain/blockchain-constants'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) @@ -32,7 +28,7 @@ export class GraphNotifierService extends BaseConsumer { this.asyncDebouncerService = new AsyncDebouncerService(this.cacheManager, this.configService, this.graphStateManager); } - async process(job: Job): Promise { + async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { const numberBlocksToParse = BlockchainConstants.NUMBER_BLOCKS_TO_CRAWL; diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts index 21ba6652..4a4fcd13 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts @@ -5,12 +5,9 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; import { RedisModule } from '@songkeys/nestjs-redis'; -import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; -import { ConfigModule } from '../../../../libs/common/src/config/config.module'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { NonceService } from '../../../../libs/common/src'; +import * as QueueConstants from '#lib/utils/queues'; +import { BlockchainModule, ConfigModule, ConfigService, NonceService } from '#lib'; import { GraphUpdatePublisherService } from './graph.publisher.processor.service'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; @Module({ imports: [ diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index e7ffd556..bd6ca4d7 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -9,14 +9,8 @@ import { SubmittableExtrinsic } from '@polkadot/api-base/types'; import { ISubmittableResult } from '@polkadot/types/types'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { SchedulerRegistry } from '@nestjs/schedule'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { NonceService } from '../../../../libs/common/src'; -import { BaseConsumer } from '../BaseConsumer'; -import { GraphUpdateJob } from '../../../../libs/common/src/dtos/graph.update.job'; -import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; -import { createKeys } from '../../../../libs/common/src/blockchain/create-keys'; -import { ITxMonitorJob } from '../../../../libs/common/src/dtos/graph.notifier.job'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; +import * as QueueConstants from '#lib/utils/queues'; +import { BaseConsumer, BlockchainService, ConfigService, GraphUpdateJob, ITxMonitorJob, NonceService, createKeys } from '#lib'; export const SECONDS_PER_BLOCK = 12; const CAPACITY_EPOCH_TIMEOUT_NAME = 'capacity_check'; @@ -31,7 +25,7 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli await this.checkCapacity(); } - public async onApplicationShutdown(signal?: string | undefined): Promise { + public async onApplicationShutdown(_signal?: string | undefined): Promise { try { this.schedulerRegistry.deleteTimeout(CAPACITY_EPOCH_TIMEOUT_NAME); } catch (err) { @@ -56,7 +50,7 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli * @param job - The job to process. * @returns A promise that resolves when the job is processed. */ - async process(job: Job): Promise { + async process(job: Job): Promise { let statefulStorageTxHash: Hash = {} as Hash; try { this.logger.log(`Processing job ${job.id} of type ${job.name}`); @@ -112,7 +106,7 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli this.graphChangeNotifyQueue.add(`Graph Change Notify Job - ${txMonitorJob.id}`, txMonitorJob, { delay: blockDelay, }); - } catch (error: any) { + } catch (error: unknown) { this.logger.error(error); throw error; } finally { @@ -145,7 +139,7 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli } this.logger.debug(`Tx hash: ${txHash}`); return txHash; - } catch (error: any) { + } catch (error: unknown) { this.logger.error(`Error processing batch: ${error}`); throw error; } diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts index c35600b3..9ab5c10d 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts @@ -1,14 +1,9 @@ -/* -https://docs.nestjs.com/modules -*/ - import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; import { RedisModule } from '@songkeys/nestjs-redis'; import { EventEmitterModule } from '@nestjs/event-emitter'; -import { ConfigModule } from '../../../../libs/common/src/config/config.module'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; +import * as QueueConstants from '#lib/utils/queues'; +import { ConfigModule, ConfigService } from '#lib'; import { GraphReconnectionService } from './graph.reconnection.processor.service'; @Module({ diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts index d6b4c628..e6334fe3 100644 --- a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts +++ b/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts @@ -1,21 +1,16 @@ -import { InjectRedis } from '@songkeys/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; -import Redis from 'ioredis'; import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; import { MessageSourceId, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { AxiosError, AxiosResponse } from 'axios'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphUpdateJob, ProviderWebhookService } from '../../../../libs/common/src'; -import { BaseConsumer } from '../BaseConsumer'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; +import * as QueueConstants from '#lib/utils/queues'; +import { BaseConsumer, ConfigService, ConnectionDto, GraphKeyPairDto, IGraphUpdateJob, ProviderGraphUpdateJob, ProviderWebhookService } from '#lib'; @Injectable() @Processor(QueueConstants.RECONNECT_REQUEST_QUEUE) export class GraphReconnectionService extends BaseConsumer { constructor( - @InjectRedis() private cacheManager: Redis, @InjectQueue(QueueConstants.RECONNECT_REQUEST_QUEUE) private reconnectRequestQueue: Queue, @InjectQueue(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) private graphChangeRequestQueuue: Queue, private configService: ConfigService, @@ -25,7 +20,7 @@ export class GraphReconnectionService extends BaseConsumer { super(); } - async process(job: Job): Promise { + async process(job: Job): Promise { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { let graphConnections: ConnectionDto[] = []; @@ -56,7 +51,7 @@ export class GraphReconnectionService extends BaseConsumer { } } - async getUserGraphFromProvider(dsnpUserId: MessageSourceId | string, providerId: ProviderId | string): Promise { + async getUserGraphFromProvider(dsnpUserId: MessageSourceId | string, providerId: ProviderId | string): Promise<[ConnectionDto[], GraphKeyPairDto[]]> { const providerAPI = this.providerWebhookService.providerApi; const pageSize = this.configService.getPageSize(); const params = { @@ -105,7 +100,7 @@ export class GraphReconnectionService extends BaseConsumer { // No more pages available, exit the loop hasNextPage = false; } - } catch (error: any) { + } catch (error: unknown) { let newError = error; if (error instanceof AxiosError) { webhookFailures += 1; diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/apps/worker/src/request_processor/request.processor.module.ts index 3fecc535..3a4651a6 100644 --- a/apps/worker/src/request_processor/request.processor.module.ts +++ b/apps/worker/src/request_processor/request.processor.module.ts @@ -5,12 +5,9 @@ https://docs.nestjs.com/modules import { BullModule } from '@nestjs/bullmq'; import { Module } from '@nestjs/common'; import { RedisModule } from '@songkeys/nestjs-redis'; -import { ConfigModule } from '../../../../libs/common/src/config/config.module'; -import { ConfigService } from '../../../../libs/common/src/config/config.service'; -import { GraphStateManager } from '../../../../libs/common/src'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; +import * as QueueConstants from '#lib/utils/queues'; +import { BlockchainModule, ConfigModule, ConfigService, GraphStateManager } from '#lib'; import { RequestProcessorService } from './request.processor.service'; -import { BlockchainModule } from '../../../../libs/common/src/blockchain/blockchain.module'; @Module({ imports: [ diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 7fdb186c..83bff048 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -3,18 +3,16 @@ import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable, Logger } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; -import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys, DisconnectAction, Action } from '@dsnp/graph-sdk'; +import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys, DisconnectAction, Action, PrivacyType } from '@dsnp/graph-sdk'; import { MessageSourceId, SchemaGrantResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; import { Option, Vec } from '@polkadot/types'; import { AnyNumber } from '@polkadot/types/types'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { BaseConsumer } from '../BaseConsumer'; -import { ConnectionDto, GraphStateManager, GraphUpdateJob, PrivacyType, ProviderGraphUpdateJob, SkipTransitiveGraphs, createReconnectionJob } from '../../../../libs/common/src'; -import * as QueueConstants from '../../../../libs/common/src/utils/queues'; -import { BlockchainService } from '../../../../libs/common/src/blockchain/blockchain.service'; -import { Direction } from '../../../../libs/common/src/dtos/direction.enum'; -import { SECONDS_PER_BLOCK } from '../graph_publisher/graph.publisher.processor.service'; +import * as QueueConstants from '#lib/utils/queues'; import fs from 'fs'; +import { GraphStateManager, BlockchainService, ProviderGraphUpdateJob, SECONDS_PER_BLOCK, GraphUpdateJob, ConnectionDto, Direction, createReconnectionJob, SkipTransitiveGraphs } from '#lib'; + @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) export class RequestProcessorService extends BaseConsumer { @@ -56,7 +54,7 @@ export class RequestProcessorService extends BaseConsumer { this.logger.debug(`No actions to apply for user ${dsnpUserId.toString()}`); } this.graphStateManager.applyActions(actions, true); - } catch (e: any) { + } catch (e: unknown) { const errMessage = e instanceof Error ? e.message : ''; if (errMessage.includes('already exists')) { this.logger.warn(`Error applying actions: ${e}`); diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index 0cc02de0..d65e0701 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -3,18 +3,14 @@ import { BullModule } from '@nestjs/bullmq'; import { ScheduleModule } from '@nestjs/schedule'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { RedisModule } from '@songkeys/nestjs-redis'; -import { BlockchainModule } from '../../../libs/common/src/blockchain/blockchain.module'; -import { RequestProcessorModule } from './request_processor/request.processor.module'; -import { RequestProcessorService } from './request_processor/request.processor.service'; -import { ConfigModule } from '../../../libs/common/src/config/config.module'; -import { ConfigService } from '../../../libs/common/src/config/config.service'; -import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.processor.module'; -import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; +import * as QueueConstants from '#lib/utils/queues'; +import { BlockchainModule, BlockchainScannerService, ConfigModule, ConfigService, GraphStateManager, NonceService, ProviderWebhookService } from '#lib'; import { GraphNotifierModule } from './graph_notifier/graph.monitor.processor.module'; import { GraphNotifierService } from './graph_notifier/graph.monitor.processor.service'; -import { ProviderWebhookService, NonceService, GraphStateManager } from '../../../libs/common/src'; -import { BlockchainScannerService } from '../../../libs/common/src/services/blockchain-scanner.service'; -import * as QueueConstants from '../../../libs/common/src/utils/queues'; +import { GraphUpdatePublisherModule } from './graph_publisher/graph.publisher.processor.module'; +import { GraphUpdatePublisherService } from './graph_publisher/graph.publisher.processor.service'; +import { RequestProcessorModule } from './request_processor/request.processor.module'; +import { RequestProcessorService } from './request_processor/request.processor.service'; @Module({ imports: [ diff --git a/libs/common/src/blockchain/index.ts b/libs/common/src/blockchain/index.ts new file mode 100644 index 00000000..747c32ce --- /dev/null +++ b/libs/common/src/blockchain/index.ts @@ -0,0 +1,6 @@ +export * from './blockchain-constants'; +export * from './blockchain.module'; +export * from './blockchain.service'; +export * from './create-keys'; +export * from './event-error'; +export * from './extrinsic'; diff --git a/libs/common/src/config/index.ts b/libs/common/src/config/index.ts new file mode 100644 index 00000000..37c5b7dd --- /dev/null +++ b/libs/common/src/config/index.ts @@ -0,0 +1,4 @@ +export * from './config.module'; +export * from './config.service'; +export * from './env.config'; +export * from './swagger_config'; diff --git a/libs/common/src/dtos/index.ts b/libs/common/src/dtos/index.ts new file mode 100644 index 00000000..e8041860 --- /dev/null +++ b/libs/common/src/dtos/index.ts @@ -0,0 +1,15 @@ +export * from './connection-type.enum'; +export * from './connection.dto'; +export * from './direction.enum'; +export * from './dsnp-graph-edge.dto'; +export * from './graph-change-notification.dto'; +export * from './graph-change-response.dto'; +export * from './graph-key-pair.dto'; +export * from './graph-query-params.dto'; +export * from './graph.notifier.job'; +export * from './graph.update.job'; +export * from './key-type.enum'; +export * from './privacy-type.enum'; +export * from './provider-graph.dto'; +export * from './user-graph.dto'; +export * from './watch-graphs.dto'; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index f0875efc..ad62270a 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -1,23 +1,7 @@ -export * from './utils/processing'; -export * from './utils/redis'; -export * from './utils/base-consumer'; -export * from './dtos/user-graph.dto'; -export * from './dtos/graph-query-params.dto'; -export * from './dtos/provider-graph.dto'; -export * from './dtos/privacy-type.enum'; -export * from './dtos/key-type.enum'; -export * from './dtos/graph-key-pair.dto'; -export * from './dtos/connection.dto'; -export * from './dtos/watch-graphs.dto'; -export * from './dtos/dsnp-graph-edge.dto'; -export * from './dtos/graph-change-notification.dto'; -export * from './dtos/graph-change-response.dto'; -export * from './dtos/graph.update.job'; -export * from './interfaces/graph-update-job.interface'; -export * from './interfaces/provider.graph.update-job.interface'; -export * from './services/nonce.service'; -export * from './utils/queues'; -export * from './services/provider-webhook.service'; -export * from './services/async_debouncer'; -export * from './services/graph-state-manager'; +export * from './blockchain'; +export * from './config'; export * from './constants'; +export * from './dtos'; +export * from './interfaces'; +export * from './services'; +export * from './utils'; diff --git a/libs/common/src/interfaces/index.ts b/libs/common/src/interfaces/index.ts new file mode 100644 index 00000000..b05da155 --- /dev/null +++ b/libs/common/src/interfaces/index.ts @@ -0,0 +1,3 @@ +export * from './capacity-limit.interface'; +export * from './graph-update-job.interface'; +export * from './provider.graph.update-job.interface'; diff --git a/libs/common/src/services/index.ts b/libs/common/src/services/index.ts new file mode 100644 index 00000000..a5dcaafd --- /dev/null +++ b/libs/common/src/services/index.ts @@ -0,0 +1,5 @@ +export * from './async_debouncer'; +export * from './blockchain-scanner.service'; +export * from './graph-state-manager'; +export * from './nonce.service'; +export * from './provider-webhook.service'; diff --git a/libs/common/src/utils/index.ts b/libs/common/src/utils/index.ts new file mode 100644 index 00000000..fd9f04c6 --- /dev/null +++ b/libs/common/src/utils/index.ts @@ -0,0 +1,4 @@ +export * from './base-consumer'; +export * from './processing'; +export * from './queues'; +export * from './redis'; diff --git a/package.json b/package.json index c76465e5..9d0ff1ce 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "docker-stop:dev": "docker-compose -f docker-compose.dev.yaml stop", "chain-setup": "tsx ./test-setup/main.ts", "clean": "rm -Rf dist", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "lint": "eslint \"{apps,libs}/**/*.ts\"", + "format": "eslint \"{apps,libs}/**/*.ts\" --fix", "test": "jest --coverage --verbose", "test:e2e": "set -a ; . .env ; jest --config ./apps/api/test/jest-e2e.json --detectOpenHandles" }, @@ -132,7 +133,15 @@ "/libs/" ], "moduleNameMapper": { - "^@graph-service-common(|/.*)$": "/libs/common/src/$1" + "^#api(|/.*)$": "/apps/api/src/$1", + "^#worker(|/.*)$": "/apps/worker/src/$1", + "^#lib(|/.*)$": "/libs/common/src/$1", + "^#lib/blockchain(|/.*)$": "/libs/common/src/blockchain/$1", + "^#lib/config(|/.*)$": "/libs/common/src/config/$1", + "^#lib/dtos(|/.*)$": "/libs/common/src/dtos/$1", + "^#lib/interfaces(|/.*)$": "/libs/common/src/interfaces/$1", + "^#lib/services(|/.*)$": "/libs/common/src/services/$1", + "^#lib/utils(|/.*)$": "/libs/common/src/utils/$1" } } } diff --git a/swagger.json b/swagger.json index d8b3d804..f737bcc6 100644 --- a/swagger.json +++ b/swagger.json @@ -3,7 +3,7 @@ "paths": { "/v1/graphs": { "put": { - "operationId": "GraphController_getGraphs", + "operationId": "GraphControllerV1_getGraphs", "summary": "Post a request to fetch graphs for specified dsnpIds and blockNumber", "parameters": [], "requestBody": { @@ -38,7 +38,7 @@ }, "/v1/update-graph": { "post": { - "operationId": "GraphController_updateGraph", + "operationId": "GraphControllerV1_updateGraph", "summary": "Request an update to given users graph", "parameters": [], "requestBody": { @@ -70,7 +70,7 @@ }, "/v1/watch-graphs": { "put": { - "operationId": "GraphController_watchGraphs", + "operationId": "GraphControllerV1_watchGraphs", "summary": "Watch graphs for specified dsnpIds and receive updates", "parameters": [], "requestBody": { @@ -166,16 +166,20 @@ "type": "object", "properties": { "publicKey": { - "type": "string" + "type": "string", + "description": "Public graph encryption key as a hex string (prefixed with \"0x\")" }, "privateKey": { - "type": "string" + "type": "string", + "description": "Private graph encryption key as a hex string (prefixed with \"0x\")" }, "keyType": { "type": "string", "enum": [ "X25519" - ] + ], + "description": "Key type of graph encryption keypair (currently only X25519 supported)", + "example": "X25519" } }, "required": [ @@ -188,19 +192,29 @@ "type": "object", "properties": { "dsnpIds": { + "description": "Array of MSA IDs for which to query graphs", + "example": [ + 2, + 3, + 4, + 5 + ], "type": "array", "items": { "type": "string" } }, "privacyType": { - "type": "string", "enum": [ "private", "public" - ] + ], + "type": "string", + "description": "Graph type to query (public or private)", + "example": "public" }, "graphKeyPairs": { + "description": "Graph encryption keypairs for the users requested in `dsnpIds`. (Only for `privacyType` === \"private\"", "type": "array", "items": { "$ref": "#/components/schemas/GraphKeyPairDto" @@ -209,18 +223,21 @@ }, "required": [ "dsnpIds", - "privacyType", - "graphKeyPairs" + "privacyType" ] }, "DsnpGraphEdge": { "type": "object", "properties": { "userId": { - "type": "string" + "type": "string", + "description": "MSA ID of the user represented by this graph edge", + "example": "3" }, "since": { - "type": "number" + "type": "number", + "description": "Block number when connection represented by this graph edge was created", + "example": 12 } }, "required": [ @@ -232,9 +249,12 @@ "type": "object", "properties": { "dsnpId": { - "type": "string" + "type": "string", + "description": "MSA ID that is the owner of the graph represented by the graph edges in this object", + "example": "2" }, "dsnpGraphEdges": { + "description": "Optional array of graph edges in the specific user graph represented by this object", "type": "array", "items": { "$ref": "#/components/schemas/DsnpGraphEdge" @@ -249,30 +269,38 @@ "type": "object", "properties": { "dsnpId": { - "type": "string" + "type": "string", + "description": "MSA ID representing the target of this connection", + "example": "3" }, "privacyType": { - "type": "string", "enum": [ "private", "public" - ] + ], + "type": "string", + "description": "Indicator connection type (public or private)", + "example": "public" }, "direction": { - "type": "string", "enum": [ "connectionTo", "connectionFrom", "bidirectional", "disconnect" - ] + ], + "type": "string", + "description": "Indicator of the direction of this connection", + "example": "connectionTo" }, "connectionType": { - "type": "string", "enum": [ "follow", "friendship" - ] + ], + "type": "string", + "description": "Indicator of the type of connection (follow or friendship)", + "example": "follow" } }, "required": [ @@ -282,25 +310,39 @@ "connectionType" ] }, + "ConnectionDtoWrapper": { + "type": "object", + "properties": { + "data": { + "description": "Wrapper object for array of connections", + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectionDto" + } + } + }, + "required": [ + "data" + ] + }, "ProviderGraphDto": { "type": "object", "properties": { "dsnpId": { - "type": "string" + "type": "string", + "description": "MSA ID that owns the connections represented in this object", + "example": 2 }, "connections": { - "type": "object", - "properties": { - "data": { - "required": true, - "type": "array", - "items": { - "$ref": "#/components/schemas/ConnectionDto" - } + "description": "Array of connections known to the Provider for ths MSA referenced in this object", + "allOf": [ + { + "$ref": "#/components/schemas/ConnectionDtoWrapper" } - } + ] }, "graphKeyPairs": { + "description": "Optional array of graph encryption keypairs decrypting/encrypting the above-referenced users private graph", "type": "array", "items": { "$ref": "#/components/schemas/GraphKeyPairDto" @@ -314,19 +356,36 @@ }, "GraphChangeRepsonseDto": { "type": "object", - "properties": {} + "properties": { + "referenceId": { + "type": "string", + "description": "Reference ID by which the results/status of a submitted GraphChangeRequest may be retrieved" + } + }, + "required": [ + "referenceId" + ] }, "WatchGraphsDto": { "type": "object", "properties": { "dsnpIds": { + "description": "MSA IDs for which to watch for graph updates", + "example": [ + "2", + "3", + "4", + "5" + ], "type": "array", "items": { "type": "string" } }, "webhookEndpoint": { - "type": "string" + "type": "string", + "description": "Webhook URL to call when graph changes for the referenced MSAs are detected", + "example": "http://localhost/webhook" } }, "required": [ diff --git a/tsconfig.json b/tsconfig.json index 8b70d256..7c07e09a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "allowSyntheticDefaultImports": true, - "baseUrl": "./src", + "baseUrl": "./", "esModuleInterop": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, @@ -11,14 +11,59 @@ "noImplicitThis": false, "outDir": "dist", "paths": { - "#app/*": [ - "*" + "#api": [ + "apps/api/src" ], - "@app/common": [ + "#api/*": [ + "apps/api/src/*" + ], + "#worker": [ + "apps/worker/src" + ], + "#worker/*": [ + "apps/worker/src/*" + ], + "#lib": [ "libs/common/src" ], - "@app/common/*": [ + "#lib/*": [ "libs/common/src/*" + ], + "#lib/blockchain": [ + "libs/common/src/blockchain" + ], + "#lib/blockchain/*": [ + "libs/common/src/blockchain/*" + ], + "#lib/config": [ + "libs/common/src/config" + ], + "#lib/config/*": [ + "libs/common/src/config/*" + ], + "#lib/dots": [ + "libs/common/src/dtos" + ], + "#lib/dtos/*": [ + "libs/common/src/dtos/*" + ], + "#lib/interfaces": [ + "libs/common/src/interfaces" + ], + "#lib/interfaces/*": [ + "libs/common/src/interfaces/*" + ], + "#lib/services": [ + "libs/common/src/services" + ], + "#lib/services/*": [ + "libs/common/src/services/*" + ], + "#lib/utils": [ + "libs/common/src/utils" + ], + "#lib/utils/*": [ + "libs/common/src/utils/*" ] }, "resolveJsonModule": true, @@ -31,4 +76,4 @@ "node_modules/@types" ] } -} \ No newline at end of file +} From 79c76a24aa64f326ff4c524f88540336e5068f9d Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Mon, 1 Jul 2024 16:18:07 -0400 Subject: [PATCH 45/53] feat: rework webhook endpoints (#100) - Refactor controllers into controllers/v1 directory structure - Split out webhook endpoint from graph endpoints - Add endpoints to get/remove webhooks by specific MSA or URL - Rework caching of webhooks to take advantage of Redis hashes and JS Set to avoid duplication of webhook registrations - Refactor e2e tests for new API e2e tests now pass --- apps/api/src/api.module.ts | 5 +- apps/api/src/api.service.ts | 124 ++++++- .../src/controllers/v1/graph-v1.controller.ts | 34 +- .../controllers/v1/webhooks-v1.controller.ts | 86 +++++ apps/api/src/metadata.ts | 129 ++++++- apps/api/test/app.e2e-spec.ts | 333 +++++++++--------- apps/api/test/jest-e2e.json | 9 - apps/api/test/setup/index.ts | 91 ----- .../graph.monitor.processor.service.ts | 14 +- .../request.processor.service.ts | 12 +- k6-test/package-lock.json | 22 -- k6-test/package.json | 15 - k6-test/script.js | 155 +++++--- .../common/src/dtos/graph-query-params.dto.ts | 2 +- libs/common/src/dtos/provider-graph.dto.ts | 2 +- libs/common/src/dtos/watch-graphs.dto.ts | 3 +- package.json | 6 +- swagger.json | 156 +++++++- 18 files changed, 786 insertions(+), 412 deletions(-) create mode 100644 apps/api/src/controllers/v1/webhooks-v1.controller.ts delete mode 100644 apps/api/test/jest-e2e.json delete mode 100644 apps/api/test/setup/index.ts delete mode 100644 k6-test/package-lock.json delete mode 100644 k6-test/package.json diff --git a/apps/api/src/api.module.ts b/apps/api/src/api.module.ts index e8961fb7..86699d8e 100644 --- a/apps/api/src/api.module.ts +++ b/apps/api/src/api.module.ts @@ -10,7 +10,8 @@ import { GraphControllerV1 } from './controllers/v1/graph-v1.controller'; import { HealthController } from './controllers/health.controller'; import { ApiService } from './api.service'; import { BlockchainModule, ConfigModule, ConfigService, GraphStateManager } from '#lib'; -import * as QueueConstants from '#lib/utils/queues' +import * as QueueConstants from '#lib/utils/queues'; +import { WebhooksControllerV1 } from './controllers/v1/webhooks-v1.controller'; @Module({ imports: [ @@ -125,7 +126,7 @@ import * as QueueConstants from '#lib/utils/queues' ScheduleModule.forRoot(), ], providers: [ApiService, GraphStateManager, ConfigService], - controllers: [GraphControllerV1, HealthController], + controllers: [GraphControllerV1, WebhooksControllerV1, HealthController], exports: [], }) export class ApiModule {} diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index ff6dffed..c3ef8a02 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -6,7 +6,29 @@ import { Queue } from 'bullmq'; import { createHash } from 'crypto'; import { MessageSourceId } from '@frequency-chain/api-augment/interfaces'; import * as QueueConstants from '#lib/utils/queues'; -import { AsyncDebouncerService, BlockchainService, ConfigService, GraphChangeRepsonseDto, GraphStateManager, GraphsQueryParamsDto, ProviderGraphDto, ProviderGraphUpdateJob, UserGraphDto, WatchGraphsDto } from '#lib'; +import { + AsyncDebouncerService, + BlockchainService, + ConfigService, + GraphChangeRepsonseDto, + GraphStateManager, + GraphsQueryParamsDto, + ProviderGraphDto, + ProviderGraphUpdateJob, + UserGraphDto, + WatchGraphsDto, +} from '#lib'; + +async function hscanToObject(keyValues: string[]) { + const result = {}; + + for (let i = 0; i < keyValues.length; i += 2) { + const field = keyValues[i]; + const value = JSON.parse(keyValues[i + 1]); + result[field] = value; + } + return result; +} @Injectable() export class ApiService implements BeforeApplicationShutdown { @@ -27,7 +49,6 @@ export class ApiService implements BeforeApplicationShutdown { beforeApplicationShutdown(_signal?: string | undefined) { try { - this.redis.del(QueueConstants.REDIS_WATCHER_PREFIX); this.redis.del(QueueConstants.DEBOUNCER_CACHE_KEY); this.redis.del(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY); this.logger.log('Cleanup on shutdown completed.'); @@ -57,13 +78,102 @@ export class ApiService implements BeforeApplicationShutdown { }; } - async watchGraphs(watchGraphsDto: WatchGraphsDto): Promise { - watchGraphsDto.dsnpIds.forEach(async (dsnpId) => { - const redisKey = `${QueueConstants.REDIS_WATCHER_PREFIX}:${dsnpId}`; - const redisValue = watchGraphsDto.webhookEndpoint; + /** + * Adds webhook registrations for a list of MSA IDs to the set + * of webhooks in the Redis cache. Returns whether any new + * webhooks were added. + * @param {any} watchGraphsDto:WatchGraphsDto + * @returns {boolean} Whether any new webhooks were registered + */ + async watchGraphs(watchGraphsDto: WatchGraphsDto): Promise { + let itemsAdded = false; + for (const dsnpId of watchGraphsDto.dsnpIds) { // eslint-disable-next-line no-await-in-loop - await this.redis.rpush(redisKey, redisValue); + const result = await this.watchGraphForMsa(dsnpId, watchGraphsDto.webhookEndpoint); + itemsAdded = itemsAdded || result; + } + + return itemsAdded; + } + + async watchGraphForMsa(msaId: string, webhook: string): Promise { + try { + let webhookAdded = false; + const url = new URL(webhook).toString(); + const existingWebhooks = new Set( + await this.redis.hget(QueueConstants.REDIS_WATCHER_PREFIX, msaId).then((webhooksStr) => { + return webhooksStr ? (JSON.parse(webhooksStr) as string[]) : []; + }), + ); + if (existingWebhooks.size === 0 || !existingWebhooks.has(url)) { + webhookAdded = true; + this.logger.verbose(`Registering webhook for MSA ${msaId}: ${url}`); + } + existingWebhooks.add(url); + await this.redis.hset(QueueConstants.REDIS_WATCHER_PREFIX, msaId, JSON.stringify([...existingWebhooks])); + return webhookAdded; + } catch (err: any) { + this.logger.error('Error adding webhook', err); + throw err; + } + } + + async getAllWebhooks(): Promise> { + let cursor = '0'; + let value: string[]; + const result = {}; + do { + [cursor, value] = await this.redis.hscan(QueueConstants.REDIS_WATCHER_PREFIX, cursor); + Object.assign(result, await hscanToObject(value)); + } while (cursor !== '0'); + return result; + } + + /** + * Return all URLs registered as webhooks for the given MSA + * + * @param {string} msaId:string + * @returns {string[]} Array of URLs + */ + async getWebhooksForMsa(msaId: string): Promise { + const value = await this.redis.hget(QueueConstants.REDIS_WATCHER_PREFIX, msaId); + return value ? (JSON.parse(value) as string[]) : []; + } + + async getWatchedGraphsForUrl(url: string): Promise { + const msasForUrl: string[] = []; + const registeredWebhooks = await this.getAllWebhooks(); + Object.entries(registeredWebhooks).forEach(([msaId, urls]) => { + if (urls.some((hookUrl) => hookUrl === url)) { + msasForUrl.push(msaId); + } }); + + return msasForUrl; + } + + async deleteAllWebhooks(): Promise { + await this.redis.del(QueueConstants.REDIS_WATCHER_PREFIX); + } + + async deleteWebhooksForUser(msaId: string): Promise { + await this.redis.hdel(QueueConstants.REDIS_WATCHER_PREFIX, msaId); + } + + async removeWebhookFromUser(msaId: string, url: string): Promise { + const webhooksForUser = new Set(await this.getWebhooksForMsa(msaId)); + if (webhooksForUser.delete(url)) { + if (webhooksForUser.size === 0) { + await this.deleteWebhooksForUser(msaId); + } else { + await this.redis.hset(QueueConstants.REDIS_WATCHER_PREFIX, msaId, JSON.stringify([...webhooksForUser])); + } + } + } + + async deleteWebhooksForUrl(url: string): Promise { + const msaIds = await this.getWatchedGraphsForUrl(url); + await Promise.all(msaIds.map((msaId) => this.removeWebhookFromUser(msaId, url))); } async getGraphs(queryParams: GraphsQueryParamsDto): Promise { diff --git a/apps/api/src/controllers/v1/graph-v1.controller.ts b/apps/api/src/controllers/v1/graph-v1.controller.ts index 7302b268..030f9a15 100644 --- a/apps/api/src/controllers/v1/graph-v1.controller.ts +++ b/apps/api/src/controllers/v1/graph-v1.controller.ts @@ -1,10 +1,10 @@ import { ApiService } from '#api/api.service'; -import { UserGraphDto, GraphsQueryParamsDto, GraphChangeRepsonseDto, ProviderGraphDto, WatchGraphsDto } from '#lib'; +import { UserGraphDto, GraphsQueryParamsDto, GraphChangeRepsonseDto, ProviderGraphDto } from '#lib'; import { Controller, Post, HttpCode, HttpStatus, Logger, Body, Put } from '@nestjs/common'; import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; -@Controller('v1') -@ApiTags('v1/graph') +@Controller('v1/graphs') +@ApiTags('v1/graphs') export class GraphControllerV1 { private readonly logger: Logger; @@ -13,9 +13,10 @@ export class GraphControllerV1 { } // Fetch graphs for list of `dsnpIds` at optional `blockNumber` - @Put('graphs') + // TODO: Use HTTP QUERY method or GET with a body instead of POST (can then eliminate endpoint name, will just be GET /graph) + @Post('getGraphs') @HttpCode(HttpStatus.OK) - @ApiOperation({ summary: 'Post a request to fetch graphs for specified dsnpIds and blockNumber' }) + @ApiOperation({ summary: 'Fetch graphs for specified dsnpIds and blockNumber' }) @ApiOkResponse({ description: 'Graphs retrieved successfully', type: [UserGraphDto] }) async getGraphs(@Body() queryParams: GraphsQueryParamsDto): Promise { try { @@ -27,8 +28,8 @@ export class GraphControllerV1 { } } - // Create a provider graph - @Post('update-graph') + // Enqueue a request to update a user graph + @Put() @HttpCode(HttpStatus.CREATED) @ApiOperation({ summary: 'Request an update to given users graph' }) @ApiCreatedResponse({ description: 'Graph update request created successfully', type: GraphChangeRepsonseDto }) @@ -41,23 +42,4 @@ export class GraphControllerV1 { throw new Error('Failed to update graph'); } } - - @Put('watch-graphs') - @HttpCode(HttpStatus.OK) - @ApiOperation({ summary: 'Watch graphs for specified dsnpIds and receive updates' }) - @ApiOkResponse({ description: 'Successfully started watching graphs' }) - @ApiBody({ type: WatchGraphsDto }) - async watchGraphs(@Body() watchGraphsDto: WatchGraphsDto) { - try { - // eslint-disable-next-line no-await-in-loop - await this.apiService.watchGraphs(watchGraphsDto); - return { - status: HttpStatus.OK, - data: 'Successfully started watching graphs', - }; - } catch (error) { - this.logger.error(error); - throw new Error('Failed to watch graphs'); - } - } } diff --git a/apps/api/src/controllers/v1/webhooks-v1.controller.ts b/apps/api/src/controllers/v1/webhooks-v1.controller.ts new file mode 100644 index 00000000..d0892d0e --- /dev/null +++ b/apps/api/src/controllers/v1/webhooks-v1.controller.ts @@ -0,0 +1,86 @@ +import { ApiService } from '#api/api.service'; +import { WatchGraphsDto } from '#lib'; +import { Controller, HttpCode, HttpStatus, Logger, Body, Put, Res, HttpException, Get, Query, Delete, Param } from '@nestjs/common'; +import { ApiBody, ApiOkResponse, ApiOperation, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger'; +import { Response } from 'express'; + +@Controller('v1/webhooks') +@ApiTags('v1/webhooks') +export class WebhooksControllerV1 { + private readonly logger: Logger; + + constructor(private apiService: ApiService) { + this.logger = new Logger(this.constructor.name); + } + + @Get() + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Get all registered webhooks' }) + @ApiOkResponse({ description: 'Retrieved all registered webhooks' }) + async getAllWebhooks(): Promise { + return this.apiService.getAllWebhooks(); + } + + @Get('users/:msaId') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Get all registered webhooks for a specific MSA ID' }) + @ApiOkResponse({ description: 'Retrieved all registered webhooks for the given MSA ID' }) + @ApiParam({ name: 'msaId', example: '2', type: String, description: 'MSA ID for which to request registered webhooks ' }) + async getWebhooksForMsa(@Param('msaId') msaId: string): Promise { + return this.apiService.getWebhooksForMsa(msaId); + } + + @Get('urls') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Get all webhooks registered to the specified URL' }) + @ApiOkResponse({ description: 'Retrieved all webhooks registered to the specified URL' }) + @ApiQuery({ name: 'url', type: String, example: 'http://localhost/webhook', description: 'URL for which to fetch all watched MSAs' }) + async getWebhooksForUrl(@Query('url') url: string): Promise { + return this.apiService.getWatchedGraphsForUrl(url); + } + + @Put() + @ApiOperation({ summary: 'Watch graphs for specified dsnpIds and receive updates' }) + @ApiOkResponse({ description: 'Successfully started watching graphs' }) + @ApiBody({ type: WatchGraphsDto }) + async watchGraphs(@Body() watchGraphsDto: WatchGraphsDto, @Res() response: Response) { + try { + const hooksAdded = await this.apiService.watchGraphs(watchGraphsDto); + response + .status(hooksAdded ? HttpStatus.CREATED : HttpStatus.OK) + .send({ + status: hooksAdded ? HttpStatus.CREATED : HttpStatus.OK, + data: 'Successfully started watching graphs', + }) + .end(); + } catch (error) { + this.logger.error(error); + throw new HttpException('Failed to watch graphs', HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Delete() + @ApiOperation({ summary: 'Delete all registered webhooks' }) + @ApiOkResponse({ description: 'Removed all registered webhooks' }) + deleteAllWebhooks(): Promise { + return this.apiService.deleteAllWebhooks(); + } + + @Delete('users/:msaId') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Delete all webhooks registered for a specific MSA' }) + @ApiOkResponse({ description: 'Removed all registered webhooks for the specified MSA' }) + @ApiParam({ name: 'msaId', type: String, example: '2', description: 'MSA for which to remove all webhook registrations' }) + deleteWebhooksForMsa(@Param('msaId') msaId: string): Promise { + return this.apiService.deleteWebhooksForUser(msaId); + } + + @Delete('urls') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Delete all MSA webhooks registered with the given URL' }) + @ApiOkResponse({ description: 'Removed all webhooks registered to the specified URL' }) + @ApiQuery({ name: 'url', type: String, example: 'http://localhost/webhook', description: 'URL for which to un-watch all MSAs' }) + deleteAllWebhooksForUrl(@Query('url') url: string): Promise { + return this.apiService.deleteWebhooksForUrl(url); + } +} diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index cf4cb38b..d2184354 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,15 +1,118 @@ /* eslint-disable */ export default async () => { - const t = { - ["../../../libs/common/src/dtos/key-type.enum"]: await import("../../../libs/common/src/dtos/key-type.enum"), - ["../../../libs/common/src/dtos/privacy-type.enum"]: await import("../../../libs/common/src/dtos/privacy-type.enum"), - ["../../../libs/common/src/dtos/direction.enum"]: await import("../../../libs/common/src/dtos/direction.enum"), - ["../../../libs/common/src/dtos/connection-type.enum"]: await import("../../../libs/common/src/dtos/connection-type.enum"), - ["../../../libs/common/src/dtos/connection.dto"]: await import("../../../libs/common/src/dtos/connection.dto"), - ["../../../libs/common/src/dtos/dsnp-graph-edge.dto"]: await import("../../../libs/common/src/dtos/dsnp-graph-edge.dto"), - ["../../../libs/common/src/dtos/graph-key-pair.dto"]: await import("../../../libs/common/src/dtos/graph-key-pair.dto"), - ["../../../libs/common/src/dtos/user-graph.dto"]: await import("../../../libs/common/src/dtos/user-graph.dto"), - ["../../../libs/common/src/dtos/graph-change-response.dto"]: await import("../../../libs/common/src/dtos/graph-change-response.dto") - }; - return { "@nestjs/swagger": { "models": [[import("../../../libs/common/src/dtos/dsnp-graph-edge.dto"), { "DsnpGraphEdge": { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }], [import("../../../libs/common/src/dtos/graph-key-pair.dto"), { "GraphKeyPairDto": { publicKey: { required: true, type: () => String }, privateKey: { required: true, type: () => String }, keyType: { required: true, type: () => String, enum: t["../../../libs/common/src/dtos/key-type.enum"].KeyType } } }], [import("../../../libs/common/src/dtos/connection.dto"), { "ConnectionDto": { dsnpId: { required: true, type: () => String }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy-type.enum"].PrivacyType }, direction: { required: true, enum: t["../../../libs/common/src/dtos/direction.enum"].Direction }, connectionType: { required: true, enum: t["../../../libs/common/src/dtos/connection-type.enum"].ConnectionType } }, "ConnectionDtoWrapper": { data: { required: true, type: () => [t["../../../libs/common/src/dtos/connection.dto"].ConnectionDto] } } }], [import("../../../libs/common/src/dtos/user-graph.dto"), { "UserGraphDto": { dsnpId: { required: true, type: () => String }, dsnpGraphEdges: { required: false, type: () => [t["../../../libs/common/src/dtos/dsnp-graph-edge.dto"].DsnpGraphEdge] } } }], [import("../../../libs/common/src/dtos/graph-change-response.dto"), { "GraphChangeRepsonseDto": { referenceId: { required: true, type: () => String } } }], [import("../../../libs/common/src/dtos/graph-query-params.dto"), { "GraphsQueryParamsDto": { dsnpIds: { required: true, type: () => [String] }, privacyType: { required: true, enum: t["../../../libs/common/src/dtos/privacy-type.enum"].PrivacyType }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph-key-pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/provider-graph.dto"), { "ProviderGraphDto": { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t["../../../libs/common/src/dtos/connection.dto"].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t["../../../libs/common/src/dtos/graph-key-pair.dto"].GraphKeyPairDto] } } }], [import("../../../libs/common/src/dtos/watch-graphs.dto"), { "WatchGraphsDto": { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }], [import("../../../libs/common/src/dtos/graph-change-notification.dto"), { "PersistPageUpdateDto": { type: { required: true, type: () => String }, ownerDsnpUserId: { required: true, type: () => String }, schemaId: { required: true, type: () => Number }, pageId: { required: true, type: () => Number }, prevHash: { required: true, type: () => Number } }, "DeletePageUpdateDto": { type: { required: true, type: () => String }, ownerDsnpUserId: { required: true, type: () => String }, schemaId: { required: true, type: () => Number }, pageId: { required: true, type: () => Number }, prevHash: { required: true, type: () => Number } }, "AddKeyUpdateDto": { type: { required: true, type: () => String }, ownerDsnpUserId: { required: true, type: () => String }, prevHash: { required: true, type: () => Number } }, "GraphChangeNotificationDto": { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } } }]], "controllers": [[import("./controllers/health.controller"), { "HealthController": { "healthz": {}, "livez": {}, "readyz": {} } }], [import("./controllers/v1/graph-v1.controller"), { "GraphControllerV1": { "getGraphs": { type: [t["../../../libs/common/src/dtos/user-graph.dto"].UserGraphDto] }, "updateGraph": { type: t["../../../libs/common/src/dtos/graph-change-response.dto"].GraphChangeRepsonseDto }, "watchGraphs": {} } }]] } }; -}; \ No newline at end of file + const t = { + ['../../../libs/common/src/dtos/key-type.enum']: await import('../../../libs/common/src/dtos/key-type.enum'), + ['../../../libs/common/src/dtos/privacy-type.enum']: await import('../../../libs/common/src/dtos/privacy-type.enum'), + ['../../../libs/common/src/dtos/direction.enum']: await import('../../../libs/common/src/dtos/direction.enum'), + ['../../../libs/common/src/dtos/connection-type.enum']: await import('../../../libs/common/src/dtos/connection-type.enum'), + ['../../../libs/common/src/dtos/connection.dto']: await import('../../../libs/common/src/dtos/connection.dto'), + ['../../../libs/common/src/dtos/dsnp-graph-edge.dto']: await import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), + ['../../../libs/common/src/dtos/graph-key-pair.dto']: await import('../../../libs/common/src/dtos/graph-key-pair.dto'), + ['../../../libs/common/src/dtos/user-graph.dto']: await import('../../../libs/common/src/dtos/user-graph.dto'), + ['../../../libs/common/src/dtos/graph-change-response.dto']: await import('../../../libs/common/src/dtos/graph-change-response.dto'), + }; + return { + '@nestjs/swagger': { + models: [ + [ + import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), + { DsnpGraphEdge: { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }, + ], + [ + import('../../../libs/common/src/dtos/graph-key-pair.dto'), + { + GraphKeyPairDto: { + publicKey: { required: true, type: () => String }, + privateKey: { required: true, type: () => String }, + keyType: { required: true, type: () => String, enum: t['../../../libs/common/src/dtos/key-type.enum'].KeyType }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/connection.dto'), + { + ConnectionDto: { + dsnpId: { required: true, type: () => String }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, + direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.enum'].Direction }, + connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection-type.enum'].ConnectionType }, + }, + ConnectionDtoWrapper: { data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }, + }, + ], + [ + import('../../../libs/common/src/dtos/user-graph.dto'), + { + UserGraphDto: { + dsnpId: { required: true, type: () => String }, + dsnpGraphEdges: { required: false, type: () => [t['../../../libs/common/src/dtos/dsnp-graph-edge.dto'].DsnpGraphEdge] }, + }, + }, + ], + [import('../../../libs/common/src/dtos/graph-change-response.dto'), { GraphChangeRepsonseDto: { referenceId: { required: true, type: () => String } } }], + [ + import('../../../libs/common/src/dtos/graph-query-params.dto'), + { + GraphsQueryParamsDto: { + dsnpIds: { required: true, type: () => [String] }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, + graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/provider-graph.dto'), + { + ProviderGraphDto: { + dsnpId: { required: true, type: () => String }, + connections: { required: true, type: () => ({ data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }) }, + graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, + }, + }, + ], + [ + import('../../../libs/common/src/dtos/watch-graphs.dto'), + { WatchGraphsDto: { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }, + ], + [ + import('../../../libs/common/src/dtos/graph-change-notification.dto'), + { + PersistPageUpdateDto: { + type: { required: true, type: () => String }, + ownerDsnpUserId: { required: true, type: () => String }, + schemaId: { required: true, type: () => Number }, + pageId: { required: true, type: () => Number }, + prevHash: { required: true, type: () => Number }, + }, + DeletePageUpdateDto: { + type: { required: true, type: () => String }, + ownerDsnpUserId: { required: true, type: () => String }, + schemaId: { required: true, type: () => Number }, + pageId: { required: true, type: () => Number }, + prevHash: { required: true, type: () => Number }, + }, + AddKeyUpdateDto: { + type: { required: true, type: () => String }, + ownerDsnpUserId: { required: true, type: () => String }, + prevHash: { required: true, type: () => Number }, + }, + GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } }, + }, + ], + ], + controllers: [ + [import('./controllers/health.controller'), { HealthController: { healthz: {}, livez: {}, readyz: {} } }], + [ + import('./controllers/v1/graph-v1.controller'), + { + GraphControllerV1: { + getGraphs: { type: [t['../../../libs/common/src/dtos/user-graph.dto'].UserGraphDto] }, + updateGraph: { type: t['../../../libs/common/src/dtos/graph-change-response.dto'].GraphChangeRepsonseDto }, + watchGraphs: {}, + }, + }, + ], + ], + }, + }; +}; diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 422b2931..40d7ee5c 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable no-undef */ import { INestApplication, ValidationPipe } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; @@ -37,13 +38,52 @@ describe('Graph Service E2E request verification!', () => { await ExtrinsicHelper.disconnect(); }); - it('(GET) /healthz', () => request(app.getHttpServer()).get('/healthz').expect(200).expect({ status: 200, message: 'Service is healthy' })); + describe('Health endpoints', () => { + it('(GET) /healthz', () => request(app.getHttpServer()).get('/healthz').expect(200).expect({ status: 200, message: 'Service is healthy' })); - it('(GET) /livez', () => request(app.getHttpServer()).get('/livez').expect(200).expect({ status: 200, message: 'Service is live' })); + it('(GET) /livez', () => request(app.getHttpServer()).get('/livez').expect(200).expect({ status: 200, message: 'Service is live' })); - it('(GET) /readyz', () => request(app.getHttpServer()).get('/readyz').expect(200).expect({ status: 200, message: 'Service is ready' })); + it('(GET) /readyz', () => request(app.getHttpServer()).get('/readyz').expect(200).expect({ status: 200, message: 'Service is ready' })); + }); + + describe('/graph endpoints', () => { + // TODO: Re-enable this test once the setup is update to create user graphs on-chain + describe.skip('(POST) /v1/graphs retrieves user graphs', () => { + it('Get graph request should work', async () => { + const userGraphGet: GraphsQueryParamsDto = { + dsnpIds: [users[0].msaId!.toString()], + privacyType: PrivacyType.Public, + } as GraphsQueryParamsDto; + + await request(app.getHttpServer()) + .post(`/v1/graphs`) + .send(userGraphGet) + .expect(200) + .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); + }); + + it('Get graph request should work with private graph', async () => { + const userGraphGet: GraphsQueryParamsDto = { + dsnpIds: [users[0].msaId!.toString()], + privacyType: PrivacyType.Private, + graphKeyPairs: [ + { + keyType: KeyType.X25519, + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), + } as GraphKeyPairDto, + ], + } as GraphsQueryParamsDto; - describe('(POST) /v1/update-graph', () => { + await request(app.getHttpServer()) + .post(`/v1/graphs`) + .send(userGraphGet) + .expect(200) + .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); + }); + }); + }); + describe('(PUT) /v1/graphs', () => { it('Valid public graph update request should work', async () => { const validGraphChangeRequest: ProviderGraphDto = { dsnpId: users[0].msaId!.toString(), @@ -60,7 +100,7 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/v1/update-graph`) + .put(`/v1/graphs`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); @@ -99,7 +139,7 @@ describe('Graph Service E2E request verification!', () => { const requests = validGraphChangeRequests.map((requestPayload) => { console.log(`requestPayload.dsnpId: ${requestPayload.dsnpId}`); return request(app.getHttpServer()) - .post(`/v1/update-graph`) + .put(`/v1/graphs`) .send(requestPayload) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); @@ -131,183 +171,160 @@ describe('Graph Service E2E request verification!', () => { }; return request(app.getHttpServer()) - .post(`/v1/update-graph`) + .put(`/v1/graphs`) .send(validGraphChangeRequest) .expect(201) .expect((res) => expect(res.text).toContain('referenceId')); }); - it('Get graph request should work', async () => { - const userGraphGet: GraphsQueryParamsDto = { - dsnpIds: [users[0].msaId!.toString()], - privacyType: PrivacyType.Public, - } as GraphsQueryParamsDto; - - await request(app.getHttpServer()) - .put(`/v1/graphs`) - .send(userGraphGet) - .expect(200) - .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); - }); - - it('Get graph request should work with private graph', async () => { - const userGraphGet: GraphsQueryParamsDto = { - dsnpIds: [users[0].msaId!.toString()], - privacyType: PrivacyType.Private, - graphKeyPairs: [ - { - keyType: KeyType.X25519, - publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), - privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), - } as GraphKeyPairDto, - ], - } as GraphsQueryParamsDto; + describe('(PUT) /v1/graphs with public disconnect', () => { + it('Valid public graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: users[0].msaId!.toString(), + connections: { + data: [ + { + dsnpId: users[1].msaId!.toString(), + privacyType: PrivacyType.Public, + direction: Direction.Disconnect, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }; - await request(app.getHttpServer()) - .put(`/v1/graphs`) - .send(userGraphGet) - .expect(200) - .expect((res) => expect(res.body[0].dsnpId).toBe(users[0].msaId!.toString())); + return request(app.getHttpServer()) + .put(`/v1/graphs`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); }); - }); - describe('(POST) /v1/update-graph with public disconnect', () => { - it('Valid public graph update request should work', async () => { - const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: users[0].msaId!.toString(), - connections: { - data: [ + describe('(PUT) /v1/graphs with private disconnect', () => { + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: users[0].msaId!.toString(), + connections: { + data: [ + { + dsnpId: users[1].msaId!.toString(), + privacyType: PrivacyType.Private, + direction: Direction.Disconnect, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ { - dsnpId: users[1].msaId!.toString(), - privacyType: PrivacyType.Public, - direction: Direction.Disconnect, - connectionType: ConnectionType.Follow, - } as ConnectionDto, + keyType: KeyType.X25519, + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), + } as GraphKeyPairDto, ], - }, - }; + }; - return request(app.getHttpServer()) - .post(`/v1/update-graph`) - .send(validGraphChangeRequest) - .expect(201) - .expect((res) => expect(res.text).toContain('referenceId')); + return request(app.getHttpServer()) + .put(`/v1/graphs`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); }); - }); - describe('(POST) /v1/update-graph with private disconnect', () => { - it('Valid private graph update request should work', async () => { - const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: users[0].msaId!.toString(), - connections: { - data: [ + describe('(PUT) /v1/graphs with private friend request user A -> B', () => { + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: users[0].msaId!.toString(), + connections: { + data: [ + { + dsnpId: users[1].msaId!.toString(), + privacyType: PrivacyType.Private, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Friendship, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ { - dsnpId: users[1].msaId!.toString(), - privacyType: PrivacyType.Private, - direction: Direction.Disconnect, - connectionType: ConnectionType.Follow, - } as ConnectionDto, + keyType: KeyType.X25519, + publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), + } as GraphKeyPairDto, ], - }, - graphKeyPairs: [ - { - keyType: KeyType.X25519, - publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), - privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), - } as GraphKeyPairDto, - ], - }; + }; - return request(app.getHttpServer()) - .post(`/v1/update-graph`) - .send(validGraphChangeRequest) - .expect(201) - .expect((res) => expect(res.text).toContain('referenceId')); + return request(app.getHttpServer()) + .put(`/v1/graphs`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); }); - }); - describe('(POST) /v1/update-graph with private friend request user A -> B', () => { - it('Valid private graph update request should work', async () => { - const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: users[0].msaId!.toString(), - connections: { - data: [ + describe('(PUT) /v1/graphs with private friend request from user B -> A', () => { + it('Valid private graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: users[1].msaId!.toString(), + connections: { + data: [ + { + dsnpId: users[0].msaId!.toString(), + privacyType: PrivacyType.Private, + direction: Direction.ConnectionTo, + connectionType: ConnectionType.Friendship, + } as ConnectionDto, + ], + }, + graphKeyPairs: [ { - dsnpId: users[1].msaId!.toString(), - privacyType: PrivacyType.Private, - direction: Direction.ConnectionTo, - connectionType: ConnectionType.Friendship, - } as ConnectionDto, + keyType: KeyType.X25519, + publicKey: u8aToHex(users[1].graphKeyPair?.publicKey), + privateKey: u8aToHex(users[1].graphKeyPair?.secretKey), + } as GraphKeyPairDto, ], - }, - graphKeyPairs: [ - { - keyType: KeyType.X25519, - publicKey: u8aToHex(users[0].graphKeyPair?.publicKey), - privateKey: u8aToHex(users[0].graphKeyPair?.secretKey), - } as GraphKeyPairDto, - ], - }; + }; - return request(app.getHttpServer()) - .post(`/v1/update-graph`) - .send(validGraphChangeRequest) - .expect(201) - .expect((res) => expect(res.text).toContain('referenceId')); + return request(app.getHttpServer()) + .put(`/v1/graphs`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); }); - }); - - describe('(POST) /v1/update-graph with private friend request from user B -> A', () => { - it('Valid private graph update request should work', async () => { - const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: users[1].msaId!.toString(), - connections: { - data: [ - { - dsnpId: users[0].msaId!.toString(), - privacyType: PrivacyType.Private, - direction: Direction.ConnectionTo, - connectionType: ConnectionType.Friendship, - } as ConnectionDto, - ], - }, - graphKeyPairs: [ - { - keyType: KeyType.X25519, - publicKey: u8aToHex(users[1].graphKeyPair?.publicKey), - privateKey: u8aToHex(users[1].graphKeyPair?.secretKey), - } as GraphKeyPairDto, - ], - }; + describe('(PUT) /v1/graphs with bi-directional connection', () => { + it('Valid public graph update request should work', async () => { + const validGraphChangeRequest: ProviderGraphDto = { + dsnpId: users[0].msaId!.toString(), + connections: { + data: [ + { + dsnpId: users[1].msaId!.toString(), + privacyType: PrivacyType.Public, + direction: Direction.Bidirectional, + connectionType: ConnectionType.Follow, + } as ConnectionDto, + ], + }, + }; - return request(app.getHttpServer()) - .post(`/v1/update-graph`) - .send(validGraphChangeRequest) - .expect(201) - .expect((res) => expect(res.text).toContain('referenceId')); + return request(app.getHttpServer()) + .put(`/v1/graphs`) + .send(validGraphChangeRequest) + .expect(201) + .expect((res) => expect(res.text).toContain('referenceId')); + }); }); }); - describe('(POST) /v1/update-graph with bi-directional connection', () => { - it('Valid public graph update request should work', async () => { - const validGraphChangeRequest: ProviderGraphDto = { - dsnpId: users[0].msaId!.toString(), - connections: { - data: [ - { - dsnpId: users[1].msaId!.toString(), - privacyType: PrivacyType.Public, - direction: Direction.Bidirectional, - connectionType: ConnectionType.Follow, - } as ConnectionDto, - ], - }, - }; - return request(app.getHttpServer()) - .post(`/v1/update-graph`) - .send(validGraphChangeRequest) - .expect(201) - .expect((res) => expect(res.text).toContain('referenceId')); - }); + describe('/v1/webhooks endpoints', () => { + it.todo('(POST) /v1/webhooks creates a webhook registration'); + it.todo('(GET) /v1/webhooks gets all webhooks'); + it.todo('(GET) /v1/webhooks/users/:msaId gets all webhooks for a particular user'); + it.todo('(GET) /v1/webhooks/urls/:url gets all watched user graphs for a given URL registration'); + it.todo('(DELETE) /v1/webhooks/users/:msaId deletes all webhooks for a given user'); + it.todo('(DELETE) /v1/webhooks/urls?url= deletes watched user graphs for a given webhook URL'); + it.todo('(DELETE) /v1/webhooks clears all registered webhooks'); }); }); diff --git a/apps/api/test/jest-e2e.json b/apps/api/test/jest-e2e.json deleted file mode 100644 index ac432d93..00000000 --- a/apps/api/test/jest-e2e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } -} \ No newline at end of file diff --git a/apps/api/test/setup/index.ts b/apps/api/test/setup/index.ts deleted file mode 100644 index 4f7c8e3e..00000000 --- a/apps/api/test/setup/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -import log from 'loglevel'; -import { - initialize, - provisionProvider, - ensureProviderStake, - ChainUser, - initializeLocalUsers, - SchemaBuilder, - provisionLocalUserCreationExtrinsics, - provisionUserGraphResets, - provisionUserGraphEncryptionKeys, - ChainEventHandler, - ExtrinsicHelper, - provisionUsersOnChain, -} from '@amplica-labs/frequency-scenario-template'; -import { cryptoWaitReady } from '@polkadot/util-crypto'; - -const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://127.0.0.1:9944'; - -const CAPACITY_AMOUNT_TO_STAKE = 2000000000000000n; - -const BASE_SEED_PHRASE = process.env.SEED_PHRASE || '//Alice'; - -async function main() { - await cryptoWaitReady(); - console.log('Connecting...'); - await initialize(FREQUENCY_URL); - log.setLevel('trace'); - - // Create provider - console.log('Creating/resolving provider...'); - const provider = await provisionProvider(`${BASE_SEED_PHRASE}`, 'Alice'); - console.log(`Provider ID is: ${provider.msaId!.toString()}`); - - // Ensure provider is staked - await ensureProviderStake(provider.keypair, CAPACITY_AMOUNT_TO_STAKE, provider.msaId!); - - // Delegations - const delegators: ChainUser[] = await initializeLocalUsers(`${BASE_SEED_PHRASE}//users`, 256); - - const builder = new SchemaBuilder().withAutoDetectExistingSchema(); - const updateSchema = await builder.withName('dsnp', 'update').resolve(); - const publicKeySchema = await builder.withName('dsnp', 'public-key-key-agreement').resolve(); - const publicFollowsSchema = await builder.withName('dsnp', 'public-follows').resolve(); - const privateFollowsSchema = await builder.withName('dsnp', 'private-follows').resolve(); - const privateConnectionsSchema = await builder.withName('dsnp', 'private-connections').resolve(); - - const schemaIds = [ - updateSchema!.id.toNumber(), - publicKeySchema!.id.toNumber(), - publicFollowsSchema!.id.toNumber(), - privateFollowsSchema!.id.toNumber(), - privateConnectionsSchema!.id.toNumber(), - ]; - - // Create followers - await provisionLocalUserCreationExtrinsics(provider, [...delegators.values()], { schemaIds, allocateHandle: false }); - await provisionUserGraphResets([...delegators.values()]); - await provisionUserGraphEncryptionKeys([...delegators.values()], true); - const eventHandler: ChainEventHandler = (events) => { - events.forEach((eventRecord) => { - const { event } = eventRecord; - if (event && ExtrinsicHelper.apiPromise.events.msa.MsaCreated.is(event)) { - const { msaId, key } = event.data; - const address = key.toString(); - const delegator = delegators.find((d) => d.keypair.address === address); - if (delegator) { - delegator.msaId = msaId; - } else { - console.error('Cannot find delegator ', address); - } - } - }); - }; - - await provisionUsersOnChain(provider.keypair, [...delegators.values()], [eventHandler]); - - console.log(`Created Provider ${provider.msaId?.toString()} as Alice`); - console.log( - 'Created delegated MSAs: ', - delegators.map((d) => d.msaId!.toString()), - ); - console.log('Setup complete'); -} - -main() - .catch((r) => { - console.error(r); - process.exit(1); - }) - .finally(process.exit); diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 316900c6..2c07cfcd 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -7,7 +7,17 @@ import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { RegistryError } from '@polkadot/types/types'; import axios from 'axios'; import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; -import { BaseConsumer, AsyncDebouncerService, BlockchainService, GraphStateManager, ITxMonitorJob, ProviderGraphUpdateJob, GraphChangeNotificationDto, SECONDS_PER_BLOCK, ConfigService } from '#lib'; +import { + BaseConsumer, + AsyncDebouncerService, + BlockchainService, + GraphStateManager, + ITxMonitorJob, + ProviderGraphUpdateJob, + GraphChangeNotificationDto, + SECONDS_PER_BLOCK, + ConfigService, +} from '#lib'; import * as QueueConstants from '#lib/utils/queues'; import * as BlockchainConstants from '#lib/blockchain/blockchain-constants'; @@ -180,7 +190,7 @@ export class GraphNotifierService extends BaseConsumer { async getWebhookList(dsnpId: string): Promise { const redisKey = `${QueueConstants.REDIS_WATCHER_PREFIX}:${dsnpId}`; - const redisList = await this.cacheManager.lrange(redisKey, 0, -1); + const redisList = await this.cacheManager.smembers(redisKey); return redisList || []; } diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 83bff048..cc77057b 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -11,7 +11,17 @@ import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { BaseConsumer } from '../BaseConsumer'; import * as QueueConstants from '#lib/utils/queues'; import fs from 'fs'; -import { GraphStateManager, BlockchainService, ProviderGraphUpdateJob, SECONDS_PER_BLOCK, GraphUpdateJob, ConnectionDto, Direction, createReconnectionJob, SkipTransitiveGraphs } from '#lib'; +import { + GraphStateManager, + BlockchainService, + ProviderGraphUpdateJob, + SECONDS_PER_BLOCK, + GraphUpdateJob, + ConnectionDto, + Direction, + createReconnectionJob, + SkipTransitiveGraphs, +} from '#lib'; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_REQUEST_QUEUE) diff --git a/k6-test/package-lock.json b/k6-test/package-lock.json deleted file mode 100644 index c41fefa7..00000000 --- a/k6-test/package-lock.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "k6-scripts", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "k6-scripts", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@types/k6": "^0.51.0" - } - }, - "node_modules/@types/k6": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@types/k6/-/k6-0.51.0.tgz", - "integrity": "sha512-xelcvFGPI4VYrV5ozADmRuFQBKmDqDRzxfHVuCDD1/firZiSQvTP0pntxHuYUSkRyL8I83kvABXUlnLYNT2VuA==", - "dev": true - } - } -} diff --git a/k6-test/package.json b/k6-test/package.json deleted file mode 100644 index cc6985a3..00000000 --- a/k6-test/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "k6-scripts", - "version": "1.0.0", - "description": "The `script.js` file contains most of the Swagger/OpenAPI specification and you can customize it to your needs.", - "main": "account-service-load.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@types/k6": "^0.51.0" - } -} diff --git a/k6-test/script.js b/k6-test/script.js index e601838c..14ccee50 100644 --- a/k6-test/script.js +++ b/k6-test/script.js @@ -12,7 +12,7 @@ import http from "k6/http"; -import { group, check } from "k6"; +import { group, check, sleep } from "k6"; export const options = { vus: 100, @@ -33,11 +33,88 @@ const SLEEP_DURATION = 0.1; // Global variables should be initialized. export default function() { - group("/api/update-graph", () => { + group("/v1/webhooks", () => { - // Request No. 1: ApiController_updateGraph + // Request No. 1: WebhooksControllerV1_getAllWebhooks { - let url = BASE_URL + `/api/update-graph`; + let url = BASE_URL + `/v1/webhooks`; + let request = http.get(url); + + check(request, { + "Retrieved all registered webhooks": (r) => r.status === 200 + }); + + sleep(SLEEP_DURATION); + } + + // Request No. 2: WebhooksControllerV1_deleteAllWebhooks + { + let url = BASE_URL + `/v1/webhooks`; + let request = http.del(url); + + check(request, { + "Removed all registered webhooks": (r) => r.status === 200 + }); + } + }); + + group("/v1/webhooks/users/{msaId}", () => { + let msaId = '2'; // extracted from 'example' field defined at the parameter level of OpenAPI spec + + // Request No. 1: WebhooksControllerV1_getWebhooksForMsa + { + let url = BASE_URL + `/v1/webhooks/users/${msaId}`; + let request = http.get(url); + + check(request, { + "Retrieved all registered webhooks for the given MSA ID": (r) => r.status === 200 + }); + + sleep(SLEEP_DURATION); + } + + // Request No. 2: WebhooksControllerV1_deleteWebhooksForMsa + { + let url = BASE_URL + `/v1/webhooks/users/${msaId}`; + let request = http.del(url); + + check(request, { + "Removed all registered webhooks for the specified MSA": (r) => r.status === 200 + }); + } + }); + + group("/v1/webhooks/urls", () => { + let webhookUrl = 'http://localhost/webhook'; // extracted from 'example' field defined at the parameter level of OpenAPI spec + + // Request No. 1: WebhooksControllerV1_getWebhooksForUrl + { + let url = BASE_URL + `/v1/webhooks/urls?url=${webhookUrl}`; + let request = http.get(url); + + check(request, { + "Retrieved all webhooks registered to the specified URL": (r) => r.status === 200 + }); + + sleep(SLEEP_DURATION); + } + + // Request No. 2: WebhooksControllerV1_deleteAllWebhooksForUrl + { + let url = BASE_URL + `/v1/webhooks/urls?url=${webhookUrl}`; + let request = http.del(url); + + check(request, { + "Removed all webhooks registered to the specified URL": (r) => r.status === 200 + }); + } + }); + + group("/v1/graphs", () => { + + // Request No. 1: GraphControllerV1_updateGraph + { + let url = BASE_URL + `/v1/graphs`; let body = {"dsnpId": "2", "connections": {"data": [ { "dsnpId": "3", @@ -47,77 +124,65 @@ export default function() { } ]}, "graphKeyPairs": []}; let params = {headers: {"Content-Type": "application/json", "Accept": "application/json"}}; - let request = http.post(url, JSON.stringify(body), params); + let request = http.put(url, JSON.stringify(body), params); check(request, { - "Got 201 response": (r) => r.status === 201, - "Repsonse contains referenceId": ({ body: bodyStr }) => { - try { - const body = JSON.parse(bodyStr); - return Object.keys(body).includes("referenceId"); - } catch (e) { - return false; - } - } + "Graph update request created successfully": (r) => r.status === 201 + }); + } + }); + + group("/livez", () => { + + // Request No. 1: HealthController_livez + { + let url = BASE_URL + `/livez`; + let request = http.get(url); + + check(request, { + "Service is live": (r) => r.status === 200 }); } }); - group("/api/graphs", () => { + group("/v1/graphs/getGraphs", () => { const msaIds = ["2", "3", "4"]; - // Request No. 1: ApiController_getGraphs + // Request No. 1: GraphControllerV1_getGraphs { - let url = BASE_URL + `/api/graphs`; + let url = BASE_URL + `/v1/graphs/getGraphs`; let body = {"dsnpIds": msaIds, "privacyType": "public", "graphKeyPairs": []}; let params = {headers: {"Content-Type": "application/json", "Accept": "application/json"}}; - let request = http.put(url, JSON.stringify(body), params); + let request = http.post(url, JSON.stringify(body), params); check(request, { - "Got 200 response": (r) => r.status === 200, - "Response contained requested graphs": ({ body: bodyStr }) => { - try { - const body = JSON.parse(bodyStr); - for (const msaId of msaIds) { - if (!body.some((userGraph) =>userGraph.dsnpId === msaId)) { - return false; - } - } - - return true; - } catch (e) { - return false; - } - } + "Graphs retrieved successfully": (r) => r.status === 200 }); } }); - group("/api/health", () => { + group("/readyz", () => { - // Request No. 1: ApiController_health + // Request No. 1: HealthController_readyz { - let url = BASE_URL + `/api/health`; + let url = BASE_URL + `/readyz`; let request = http.get(url); check(request, { - "Service is healthy": (r) => r.status === 200 + "Service is ready": (r) => r.status === 200 }); } }); - group("/api/watch-graphs", () => { + group("/healthz", () => { - // Request No. 1: ApiController_watchGraphs + // Request No. 1: HealthController_healthz { - let url = BASE_URL + `/api/watch-graphs`; - let body = {"dsnpIds": ["2"], "webhookEndpoint": "http://localhost:3000/webhook"}; - let params = {headers: {"Content-Type": "application/json", "Accept": "application/json"}}; - let request = http.put(url, JSON.stringify(body), params); + let url = BASE_URL + `/healthz`; + let request = http.get(url); check(request, { - "Got 200 response": (r) => r.status === 200, - "Response body is correct": ({ body }) => body === JSON.stringify({ status: 200, data: "Successfully started watching graphs" }), + "Service is healthy": (r) => r.status === 200 }); } }); diff --git a/libs/common/src/dtos/graph-query-params.dto.ts b/libs/common/src/dtos/graph-query-params.dto.ts index 3fb0e6fd..6e72e97f 100644 --- a/libs/common/src/dtos/graph-query-params.dto.ts +++ b/libs/common/src/dtos/graph-query-params.dto.ts @@ -8,7 +8,7 @@ export class GraphsQueryParamsDto { @ArrayNotEmpty() @ArrayUnique() @IsString({ each: true }) - @ApiProperty({ description: 'Array of MSA IDs for which to query graphs', example: [2, 3, 4, 5], type: [String] }) + @ApiProperty({ description: 'Array of MSA IDs for which to query graphs', example: ['2', '3', '4', '5'], type: [String] }) dsnpIds: string[]; @IsEnum(PrivacyType) diff --git a/libs/common/src/dtos/provider-graph.dto.ts b/libs/common/src/dtos/provider-graph.dto.ts index d883c101..f0688a61 100644 --- a/libs/common/src/dtos/provider-graph.dto.ts +++ b/libs/common/src/dtos/provider-graph.dto.ts @@ -11,7 +11,7 @@ export type ConnectionsDtoWrapper = { export class ProviderGraphDto { @IsNotEmpty() @IsString() - @ApiProperty({ description: 'MSA ID that owns the connections represented in this object', example: 2, type: String }) + @ApiProperty({ description: 'MSA ID that owns the connections represented in this object', example: '2', type: String }) dsnpId: string; @IsNotEmpty() diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/libs/common/src/dtos/watch-graphs.dto.ts index eb8def6e..afa19233 100644 --- a/libs/common/src/dtos/watch-graphs.dto.ts +++ b/libs/common/src/dtos/watch-graphs.dto.ts @@ -1,8 +1,9 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsArray, IsNotEmpty, IsString, IsUrl } from 'class-validator'; +import { IsArray, IsNotEmpty, IsNumberString, IsString, IsUrl } from 'class-validator'; export class WatchGraphsDto { @IsArray() + @IsNumberString({ no_symbols: true }, { each: true }) @IsNotEmpty() @ApiProperty({ description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5'] }) dsnpIds: string[]; diff --git a/package.json b/package.json index 9d0ff1ce..7ab13e4c 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "build:swagger": "npx ts-node -r tsconfig-paths/register apps/api/src/build-openapi.ts", "build:metadata": "npx ts-node apps/api/src/generate-metadata.ts", "generate-swagger-ui": "npx --yes @redocly/cli build-docs swagger.json --output=./docs/index.html", - "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start:api": "nest start api", "start:api:watch": "nest start api --watch", "start:api:prod": "node dist/apps/api/main.js", @@ -27,9 +26,10 @@ "chain-setup": "tsx ./test-setup/main.ts", "clean": "rm -Rf dist", "lint": "eslint \"{apps,libs}/**/*.ts\"", - "format": "eslint \"{apps,libs}/**/*.ts\" --fix", + "lint:fix": "eslint \"{apps,libs}/**/*.ts\" --fix", + "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "test": "jest --coverage --verbose", - "test:e2e": "set -a ; . .env ; jest --config ./apps/api/test/jest-e2e.json --detectOpenHandles" + "test:e2e": "set -a ; . .env ; jest --testRegex \".e2e-spec.ts$\" --detectOpenHandles" }, "repository": { "type": "git", diff --git a/swagger.json b/swagger.json index f737bcc6..5f16cd32 100644 --- a/swagger.json +++ b/swagger.json @@ -1,10 +1,10 @@ { "openapi": "3.0.0", "paths": { - "/v1/graphs": { - "put": { + "/v1/graphs/getGraphs": { + "post": { "operationId": "GraphControllerV1_getGraphs", - "summary": "Post a request to fetch graphs for specified dsnpIds and blockNumber", + "summary": "Fetch graphs for specified dsnpIds and blockNumber", "parameters": [], "requestBody": { "required": true, @@ -32,12 +32,12 @@ } }, "tags": [ - "v1/graph" + "v1/graphs" ] } }, - "/v1/update-graph": { - "post": { + "/v1/graphs": { + "put": { "operationId": "GraphControllerV1_updateGraph", "summary": "Request an update to given users graph", "parameters": [], @@ -64,13 +64,26 @@ } }, "tags": [ - "v1/graph" + "v1/graphs" ] } }, - "/v1/watch-graphs": { + "/v1/webhooks": { + "get": { + "operationId": "WebhooksControllerV1_getAllWebhooks", + "summary": "Get all registered webhooks", + "parameters": [], + "responses": { + "200": { + "description": "Retrieved all registered webhooks" + } + }, + "tags": [ + "v1/webhooks" + ] + }, "put": { - "operationId": "GraphControllerV1_watchGraphs", + "operationId": "WebhooksControllerV1_watchGraphs", "summary": "Watch graphs for specified dsnpIds and receive updates", "parameters": [], "requestBody": { @@ -89,7 +102,120 @@ } }, "tags": [ - "v1/graph" + "v1/webhooks" + ] + }, + "delete": { + "operationId": "WebhooksControllerV1_deleteAllWebhooks", + "summary": "Delete all registered webhooks", + "parameters": [], + "responses": { + "200": { + "description": "Removed all registered webhooks" + } + }, + "tags": [ + "v1/webhooks" + ] + } + }, + "/v1/webhooks/users/{msaId}": { + "get": { + "operationId": "WebhooksControllerV1_getWebhooksForMsa", + "summary": "Get all registered webhooks for a specific MSA ID", + "parameters": [ + { + "name": "msaId", + "required": true, + "in": "path", + "example": "2", + "description": "MSA ID for which to request registered webhooks ", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved all registered webhooks for the given MSA ID" + } + }, + "tags": [ + "v1/webhooks" + ] + }, + "delete": { + "operationId": "WebhooksControllerV1_deleteWebhooksForMsa", + "summary": "Delete all webhooks registered for a specific MSA", + "parameters": [ + { + "name": "msaId", + "required": true, + "in": "path", + "example": "2", + "description": "MSA for which to remove all webhook registrations", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Removed all registered webhooks for the specified MSA" + } + }, + "tags": [ + "v1/webhooks" + ] + } + }, + "/v1/webhooks/urls": { + "get": { + "operationId": "WebhooksControllerV1_getWebhooksForUrl", + "summary": "Get all webhooks registered to the specified URL", + "parameters": [ + { + "name": "url", + "required": true, + "in": "query", + "example": "http://localhost/webhook", + "description": "URL for which to fetch all watched MSAs", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved all webhooks registered to the specified URL" + } + }, + "tags": [ + "v1/webhooks" + ] + }, + "delete": { + "operationId": "WebhooksControllerV1_deleteAllWebhooksForUrl", + "summary": "Delete all MSA webhooks registered with the given URL", + "parameters": [ + { + "name": "url", + "required": true, + "in": "query", + "example": "http://localhost/webhook", + "description": "URL for which to un-watch all MSAs", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Removed all webhooks registered to the specified URL" + } + }, + "tags": [ + "v1/webhooks" ] } }, @@ -194,10 +320,10 @@ "dsnpIds": { "description": "Array of MSA IDs for which to query graphs", "example": [ - 2, - 3, - 4, - 5 + "2", + "3", + "4", + "5" ], "type": "array", "items": { @@ -331,7 +457,7 @@ "dsnpId": { "type": "string", "description": "MSA ID that owns the connections represented in this object", - "example": 2 + "example": "2" }, "connections": { "description": "Array of connections known to the Provider for ths MSA referenced in this object", From 39b90186c6174b07e68d314ea06a994bd9b7699f Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Fri, 12 Jul 2024 12:02:48 -0400 Subject: [PATCH 46/53] fix: pending extrinsic monitoring and capacity accounting (#112) # Description This PR fixes 2 bugs in the Worker related to extrinsic completion monitoring and capacity accounting: - Ensures that ONLY the events associated with the target extrinsic are processed in a block for both capacity accounting and extrinsic success/failure/timeout determination - Ensures the correct capacity epoch is used when recording the withdrawn capacity for an extrinsic Closes #111 --- .gitignore | 5 +- apps/api/src/api.service.ts | 3 +- .../graph.monitor.processor.module.ts | 3 + .../graph.monitor.processor.service.ts | 13 +- .../graph.publisher.processor.service.ts | 5 +- apps/worker/src/main.ts | 6 + .../request.processor.service.ts | 29 ++- .../src/blockchain/blockchain.service.spec.ts | 27 +-- .../src/blockchain/blockchain.service.ts | 196 +++++++++--------- libs/common/src/blockchain/extrinsic.ts | 74 +------ libs/common/src/dtos/graph.notifier.job.ts | 1 - libs/common/src/services/async_debouncer.ts | 40 ++-- .../src/services/graph-state-manager.ts | 6 +- 13 files changed, 160 insertions(+), 248 deletions(-) diff --git a/.gitignore b/.gitignore index d608595d..f361c8d5 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,7 @@ dist .yarn/install-state.gz .pnp.* -.idea/ \ No newline at end of file +.idea/ + +.vscode/ + diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index c3ef8a02..7ed1553a 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -182,9 +182,8 @@ export class ApiService implements BeforeApplicationShutdown { const graphs: UserGraphDto[] = []; // eslint-disable-next-line no-restricted-syntax for (const dsnpId of dsnpIds) { - const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', dsnpId); // eslint-disable-next-line no-await-in-loop - const graphEdges = await this.asyncDebouncerService.getGraphForDsnpId(dsnpUserId, privacyType, graphKeyPairs); + const graphEdges = await this.asyncDebouncerService.getGraphForDsnpId(dsnpId, privacyType, graphKeyPairs); graphs.push({ dsnpId, dsnpGraphEdges: graphEdges, diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts index e1fbff3e..2842d2b1 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts @@ -49,6 +49,9 @@ import * as QueueConstants from '#lib/utils/queues'; removeOnComplete: true, removeOnFail: false, attempts: 3, + backoff: { + type: 'exponential', + }, }, }, { diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 2c07cfcd..f7b635cf 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -6,7 +6,6 @@ import Redis from 'ioredis'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { RegistryError } from '@polkadot/types/types'; import axios from 'axios'; -import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; import { BaseConsumer, AsyncDebouncerService, @@ -42,7 +41,6 @@ export class GraphNotifierService extends BaseConsumer { this.logger.log(`Processing job ${job.id} of type ${job.name}`); try { const numberBlocksToParse = BlockchainConstants.NUMBER_BLOCKS_TO_CRAWL; - const txCapacityEpoch = job.data.epoch; const previousKnownBlockNumber = (await this.blockchainService.getBlock(job.data.lastFinalizedBlockHash)).block.header.number.toBigInt(); const currentFinalizedBlockNumber = await this.blockchainService.getLatestFinalizedBlockNumber(); const blockList: bigint[] = []; @@ -56,7 +54,7 @@ export class GraphNotifierService extends BaseConsumer { throw new Error(`Tx ${job.data.txHash} not found in block list`); } else { // Set current epoch capacity - await this.setEpochCapacity(txCapacityEpoch, BigInt(txResult.capacityWithDrawn ?? 0n)); + await this.setEpochCapacity(txResult.capacityEpoch ?? 0, txResult.capacityWithDrawn ?? 0n); if (txResult.error) { this.logger.debug(`Error found in tx result: ${JSON.stringify(txResult.error)}`); const errorReport = await this.handleMessagesFailure(txResult.error); @@ -81,11 +79,10 @@ export class GraphNotifierService extends BaseConsumer { if (job.data.referencePublishJob.update.type !== 'AddKey') { this.logger.debug(`Setting graph for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); const graphKeyPairs = requestJob?.data.graphKeyPairs ?? []; - const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.referencePublishJob.update.ownerDsnpUserId); - const schemaId: SchemaId = this.blockchainService.api.registry.createType('SchemaId', job.data.referencePublishJob.update.schemaId); - const graphEdges = await this.asyncDebouncerService.setGraphForSchemaId(dsnpUserId, schemaId, graphKeyPairs); + const { ownerDsnpUserId, schemaId } = job.data.referencePublishJob.update; + const graphEdges = await this.asyncDebouncerService.setGraphForSchemaId(ownerDsnpUserId, schemaId, graphKeyPairs); if (graphEdges.length === 0) { - this.logger.debug(`No graph edges found for ${dsnpUserId.toString()}`); + this.logger.debug(`No graph edges found for ${ownerDsnpUserId}`); } } const notification: GraphChangeNotificationDto = { @@ -138,7 +135,7 @@ export class GraphNotifierService extends BaseConsumer { }); } - private async setEpochCapacity(epoch: string, capacityWithdrew: bigint): Promise { + private async setEpochCapacity(epoch: number, capacityWithdrew: bigint): Promise { const epochCapacityKey = `epochCapacity:${epoch}`; try { diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts index bd6ca4d7..2c2f8d42 100644 --- a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts +++ b/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts @@ -96,7 +96,6 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli const txMonitorJob: ITxMonitorJob = { id: job.data.referenceId, txHash: statefulStorageTxHash, - epoch: currentCapacityEpoch.toString(), lastFinalizedBlockHash, referencePublishJob: job.data, }; @@ -122,7 +121,7 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli * @returns The hash of the submitted transaction. * @throws Error if the transaction hash is undefined or if there is an error processing the batch. */ - async processSingleBatch(providerKeys: KeyringPair, tx: SubmittableExtrinsic<'rxjs', ISubmittableResult>): Promise { + async processSingleBatch(providerKeys: KeyringPair, tx: SubmittableExtrinsic<'promise', ISubmittableResult>): Promise { this.logger.debug(`Submitting tx of size ${tx.length}, nonce:${tx.nonce}, method: ${tx.method.section}.${tx.method.method}`); try { const ext = this.blockchainService.createExtrinsic( @@ -133,7 +132,7 @@ export class GraphUpdatePublisherService extends BaseConsumer implements OnAppli ); const nonce = await this.nonceService.getNextNonce(); this.logger.debug(`Capacity Wrapped Extrinsic: ${ext}, nonce:${nonce}`); - const [txHash, _] = await ext.signAndSend(nonce); + const txHash = await ext.signAndSend(nonce); if (!txHash) { throw new Error('Tx hash is undefined'); } diff --git a/apps/worker/src/main.ts b/apps/worker/src/main.ts index a821ecfa..9c2a853c 100644 --- a/apps/worker/src/main.ts +++ b/apps/worker/src/main.ts @@ -1,6 +1,12 @@ import { NestFactory } from '@nestjs/core'; import { WorkerModule } from './worker.module'; +// Monkey-patch BigInt so that JSON.stringify will work +// eslint-disable-next-line +BigInt.prototype['toJSON'] = function () { + return this.toString(); +}; + async function bootstrap() { const app = await NestFactory.createApplicationContext(WorkerModule); app.enableShutdownHooks(); diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index cc77057b..48bd328b 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -4,7 +4,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { Job, Queue } from 'bullmq'; import Redis from 'ioredis'; import { ConnectionType, ImportBundleBuilder, ConnectAction, DsnpKeys, DisconnectAction, Action, PrivacyType } from '@dsnp/graph-sdk'; -import { MessageSourceId, SchemaGrantResponse, ProviderId } from '@frequency-chain/api-augment/interfaces'; +import { MessageSourceId, SchemaGrantResponse } from '@frequency-chain/api-augment/interfaces'; import { Option, Vec } from '@polkadot/types'; import { AnyNumber } from '@polkadot/types/types'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; @@ -53,15 +53,14 @@ export class RequestProcessorService extends BaseConsumer { setTimeout(r, blockDelay); }); } - const dsnpUserId: MessageSourceId = this.blockchainService.api.registry.createType('MessageSourceId', job.data.dsnpId); - const providerId: ProviderId = this.blockchainService.api.registry.createType('ProviderId', job.data.providerId); - this.graphStateManager.removeUserGraph(dsnpUserId.toString()); - await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + const { dsnpId, providerId } = job.data; + this.graphStateManager.removeUserGraph(dsnpId); + await this.graphStateManager.importBundles(dsnpId, job.data.graphKeyPairs ?? []); // using graphConnections form Action[] and update the user's DSNP Graph - const actions: Action[] = await this.formConnections(dsnpUserId, providerId, job.data.updateConnection, job.data.connections); + const actions: Action[] = await this.formConnections(dsnpId, providerId, job.data.updateConnection, job.data.connections); try { if (actions.length === 0) { - this.logger.debug(`No actions to apply for user ${dsnpUserId.toString()}`); + this.logger.debug(`No actions to apply for user ${dsnpId}`); } this.graphStateManager.applyActions(actions, true); } catch (e: unknown) { @@ -72,8 +71,8 @@ export class RequestProcessorService extends BaseConsumer { throw new Error(`Error applying actions: ${e}`); } } - const exportedUpdates = this.graphStateManager.exportUserGraphUpdates(dsnpUserId.toString()); - this.logger.debug(`Exported ${exportedUpdates.length} updates for user ${dsnpUserId.toString()}`); + const exportedUpdates = this.graphStateManager.exportUserGraphUpdates(dsnpId); + this.logger.debug(`Exported ${exportedUpdates.length} updates for user ${dsnpId}`); // create a GraphUpdateJob for each exported update const graphPublisherJobs: GraphUpdateJob[] = exportedUpdates.map((update) => ({ referenceId: job.data.referenceId, @@ -84,19 +83,19 @@ export class RequestProcessorService extends BaseConsumer { this.graphChangePublisherQueue.add(`Graph Publisher Job - ${graphPublisherJob.referenceId}`, graphPublisherJob); }); - const reImported = await this.graphStateManager.importBundles(dsnpUserId, job.data.graphKeyPairs ?? []); + const reImported = await this.graphStateManager.importBundles(dsnpId, job.data.graphKeyPairs ?? []); if (reImported) { // Use lua script to update last processed dsnpId // @ts-expect-error updateLastProcessed is defined in the constructor - await this.cacheManager.updateLastProcessed(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY, dsnpUserId.toString(), blockDelay); - this.logger.debug(`Re-imported bundles for ${dsnpUserId.toString()}`); + await this.cacheManager.updateLastProcessed(QueueConstants.LAST_PROCESSED_DSNP_ID_KEY, dsnpId.toString(), blockDelay); + this.logger.debug(`Re-imported bundles for ${dsnpId.toString()}`); // eslint-disable-next-line no-await-in-loop - const userGraphExists = this.graphStateManager.graphContainsUser(dsnpUserId.toString()); + const userGraphExists = this.graphStateManager.graphContainsUser(dsnpId.toString()); if (!userGraphExists) { - throw new Error(`User graph does not exist for ${dsnpUserId.toString()}`); + throw new Error(`User graph does not exist for ${dsnpId.toString()}`); } } else { - throw new Error(`Error re-importing bundles for ${dsnpUserId.toString()}`); + throw new Error(`Error re-importing bundles for ${dsnpId.toString()}`); } } catch (e) { this.logger.error(e); diff --git a/libs/common/src/blockchain/blockchain.service.spec.ts b/libs/common/src/blockchain/blockchain.service.spec.ts index 7bc849e4..92cf0df3 100644 --- a/libs/common/src/blockchain/blockchain.service.spec.ts +++ b/libs/common/src/blockchain/blockchain.service.spec.ts @@ -1,17 +1,10 @@ -import { describe, it, beforeEach, jest, expect } from '@jest/globals'; -import { u32 } from '@polkadot/types'; import { BlockchainService } from './blockchain.service'; import { ConfigService } from '../config/config.service'; describe('BlockchainService', () => { - let mockApi: any; let blockchainService: BlockchainService; - beforeEach(async () => { - mockApi = { - createType: jest.fn(), - query: jest.fn(), - }; + beforeAll(async () => { const configService = { logger: jest.fn(), nestConfigService: jest.fn(), @@ -40,21 +33,13 @@ describe('BlockchainService', () => { blockchainService = new BlockchainService(configService as unknown as ConfigService); }); - describe('createExtrinsicCall', () => { - it('should return an extrinsic call', async () => { - const pallet = 'messages'; - const extrinsic = 'addIpfsMessage'; - const schemaId = 1; - const cid = 'QmRgJZmR6Z6yB5k9aLXjzJ6jG8L6tq4v4J9zQfDz7p3J9v'; - const payloadLength = 100; - }); - }); - describe('getCurrentCapacityEpochStart', () => { it('should return the current capacity epoch start', async () => { // Arrange - const expectedEpochStart: u32 = mockApi.createType('u32', 123); - const currentEpochInfo = { epochStart: expectedEpochStart }; + const expectedEpochStart = { toNumber: () => 32 }; + const currentEpochInfo = { + epochStart: expectedEpochStart, + }; jest.spyOn(blockchainService, 'query').mockResolvedValue(currentEpochInfo); @@ -62,7 +47,7 @@ describe('BlockchainService', () => { const result = await blockchainService.getCurrentCapacityEpochStart(); // Assert - expect(result).toBe(expectedEpochStart); + expect(result).toBe(expectedEpochStart.toNumber()); }); }); }); diff --git a/libs/common/src/blockchain/blockchain.service.ts b/libs/common/src/blockchain/blockchain.service.ts index 4cd0e7a6..769df42e 100644 --- a/libs/common/src/blockchain/blockchain.service.ts +++ b/libs/common/src/blockchain/blockchain.service.ts @@ -1,22 +1,28 @@ /* eslint-disable no-underscore-dangle */ import { Injectable, Logger, OnApplicationBootstrap, BeforeApplicationShutdown } from '@nestjs/common'; -import { ApiPromise, ApiRx, HttpProvider, WsProvider } from '@polkadot/api'; -import { firstValueFrom, from } from 'rxjs'; +import { ApiPromise, HttpProvider, WsProvider } from '@polkadot/api'; import { options } from '@frequency-chain/api-augment'; import { KeyringPair } from '@polkadot/keyring/types'; -import { BlockHash, BlockNumber, DispatchError, DispatchInfo, Hash, SignedBlock } from '@polkadot/types/interfaces'; +import { BlockHash, BlockNumber, Hash, SignedBlock } from '@polkadot/types/interfaces'; import { SubmittableExtrinsic } from '@polkadot/api/types'; import { AnyNumber, ISubmittableResult, RegistryError } from '@polkadot/types/types'; -import { u32, Option, u128, u16 } from '@polkadot/types'; +import { u32, Option } from '@polkadot/types'; import { PalletCapacityCapacityDetails, PalletCapacityEpochInfo } from '@polkadot/types/lookup'; import { ConfigService } from '../config/config.service'; import { Extrinsic } from './extrinsic'; +interface ITxMonitorResult { + found: boolean; + success: boolean; + blockHash?: BlockHash; + capacityEpoch?: number; + capacityWithDrawn?: bigint; + error?: RegistryError; +} + @Injectable() export class BlockchainService implements OnApplicationBootstrap, BeforeApplicationShutdown { - public api: ApiRx; - - public apiPromise: ApiPromise; + public api: ApiPromise; private configService: ConfigService; @@ -33,27 +39,18 @@ export class BlockchainService implements OnApplicationBootstrap, BeforeApplicat this.logger.error(`Unrecognized chain URL type: ${providerUrl.toString()}`); throw new Error('Unrecognized chain URL type'); } - this.api = await firstValueFrom(ApiRx.create({ provider, ...options })); - this.apiPromise = await ApiPromise.create({ provider, ...options }); - await Promise.all([firstValueFrom(this.api.isReady), this.apiPromise.isReady]); + this.api = await ApiPromise.create({ provider, ...options }); + await this.api.isReady; this.logger.log('Blockchain API ready.'); } public async isReady(): Promise { - await this.apiPromise.isReady; + await this.api.isReady; return true; } - public async beforeApplicationShutdown(signal?: string | undefined) { - const promises: Promise[] = []; - if (this.api) { - promises.push(this.api.disconnect()); - } - - if (this.apiPromise) { - promises.push(this.apiPromise.disconnect()); - } - await Promise.all(promises); + public async beforeApplicationShutdown(_signal?: string | undefined) { + await this.api?.disconnect(); } constructor(configService: ConfigService) { @@ -62,23 +59,24 @@ export class BlockchainService implements OnApplicationBootstrap, BeforeApplicat } public getBlockHash(block: BlockNumber | AnyNumber): Promise { - return firstValueFrom(this.api.rpc.chain.getBlockHash(block)); + return this.api.rpc.chain.getBlockHash(block); } public getBlock(block: BlockHash): Promise { - return firstValueFrom(this.api.rpc.chain.getBlock(block)); + return this.api.rpc.chain.getBlock(block); } public async getLatestFinalizedBlockHash(): Promise { - return (await this.apiPromise.rpc.chain.getFinalizedHead()) as BlockHash; + return this.api.rpc.chain.getFinalizedHead(); } - public async getLatestFinalizedBlockNumber(): Promise { - return (await this.apiPromise.rpc.chain.getBlock()).block.header.number.toBigInt(); + public async getLatestFinalizedBlockNumber(): Promise { + const blockHash = await this.getLatestFinalizedBlockHash(); + return (await this.api.rpc.chain.getBlock(blockHash)).block.header.number.toNumber(); } public async getBlockNumberForHash(hash: string): Promise { - const block = await this.apiPromise.rpc.chain.getBlock(hash); + const block = await this.api.rpc.chain.getBlock(hash); if (block) { return block.block.header.number.toNumber(); } @@ -91,7 +89,7 @@ export class BlockchainService implements OnApplicationBootstrap, BeforeApplicat return this.api.registry.createType(type, ...args); } - public createExtrinsicCall({ pallet, extrinsic }: { pallet: string; extrinsic: string }, ...args: (any | undefined)[]): SubmittableExtrinsic<'rxjs', ISubmittableResult> { + public createExtrinsicCall({ pallet, extrinsic }: { pallet: string; extrinsic: string }, ...args: (any | undefined)[]): SubmittableExtrinsic<'promise', ISubmittableResult> { return this.api.tx[pallet][extrinsic](...args); } @@ -102,19 +100,19 @@ export class BlockchainService implements OnApplicationBootstrap, BeforeApplicat ...args: (any | undefined)[] ): Extrinsic { const targetEvent = eventPallet && event ? this.api.events[eventPallet][event] : undefined; - return new Extrinsic(this.api, this.api.tx[pallet][extrinsic](...args), keys, targetEvent); + return new Extrinsic(this.api, this.api.tx[pallet][extrinsic](...args), keys); } public rpc(pallet: string, rpc: string, ...args: (any | undefined)[]): Promise { - return this.apiPromise.rpc[pallet][rpc](...args); + return this.api.rpc[pallet][rpc](...args); } public query(pallet: string, extrinsic: string, ...args: (any | undefined)[]): Promise { - return args ? this.apiPromise.query[pallet][extrinsic](...args) : this.apiPromise.query[pallet][extrinsic](); + return args ? this.api.query[pallet][extrinsic](...args) : this.api.query[pallet][extrinsic](); } public async queryAt(blockHash: BlockHash, pallet: string, extrinsic: string, ...args: (any | undefined)[]): Promise { - const newApi = await this.apiPromise.at(blockHash); + const newApi = await this.api.at(blockHash); return newApi.query[pallet][extrinsic](...args); } @@ -128,7 +126,7 @@ export class BlockchainService implements OnApplicationBootstrap, BeforeApplicat nextEpochStart: number; remainingCapacity: bigint; totalCapacityIssued: bigint; - currentEpoch: bigint; + currentEpoch: number; }> { const providerU64 = this.api.createType('u64', providerId); const { epochStart }: PalletCapacityEpochInfo = await this.query('capacity', 'currentEpochInfo'); @@ -147,84 +145,76 @@ export class BlockchainService implements OnApplicationBootstrap, BeforeApplicat }; } - public async getCurrentCapacityEpoch(): Promise { + public async getCurrentCapacityEpoch(): Promise { const currentEpoch: u32 = await this.query('capacity', 'currentEpoch'); - return typeof currentEpoch === 'number' ? BigInt(currentEpoch) : currentEpoch.toBigInt(); + return currentEpoch.toNumber(); } - public async getCurrentCapacityEpochStart(): Promise { + public async getCurrentCapacityEpochStart(): Promise { const currentEpochInfo: PalletCapacityEpochInfo = await this.query('capacity', 'currentEpochInfo'); - return currentEpochInfo.epochStart; + return currentEpochInfo.epochStart.toNumber(); } public async getCurrentEpochLength(): Promise { const epochLength: u32 = await this.query('capacity', 'epochLength'); - return typeof epochLength === 'number' ? epochLength : epochLength.toNumber(); - } - - public async crawlBlockListForTx( - txHash: Hash, - blockList: bigint[], - successEvents: [{ pallet: string; event: string }], - ): Promise<{ found: boolean; success: boolean; blockHash?: BlockHash; capacityWithDrawn?: string; error?: RegistryError }> { - const txReceiptPromises: Promise<{ found: boolean; success: boolean; blockHash?: BlockHash; capacityWithDrawn?: string; error?: RegistryError }>[] = blockList.map( - async (blockNumber) => { - const blockHash = await this.getBlockHash(blockNumber); - const block = await this.getBlock(blockHash); - const txInfo = block.block.extrinsics.find((extrinsic) => extrinsic.hash.toString() === txHash.toString()); - - if (!txInfo) { - return { found: false, success: false }; - } - - this.logger.verbose(`Found tx ${txHash} in block ${blockNumber}`); - const at = await this.api.at(blockHash.toHex()); - const eventsPromise = firstValueFrom(at.query.system.events()); - - let isTxSuccess = false; - let totalBlockCapacity = 0n; - let txError: RegistryError | undefined; - - try { - const events = await eventsPromise; - - events.forEach((record) => { - const { event } = record; - const eventName = event.section; - const { method } = event; - const { data } = event; - this.logger.debug(`Received event: ${eventName} ${method} ${data}`); - - // find capacity withdrawn event - if (eventName.search('capacity') !== -1 && method.search('Withdrawn') !== -1) { - // allow lowercase constructor for eslint - // eslint-disable-next-line new-cap - const currentCapacity: u128 = new u128(this.api.registry, data[1]); - totalBlockCapacity += currentCapacity.toBigInt(); - } - - // check custom success events - if (successEvents.find((successEvent) => successEvent.pallet === eventName && successEvent.event === method)) { - this.logger.debug(`Found success event ${eventName} ${method}`); - isTxSuccess = true; - } - - // check for system extrinsic failure - if (eventName.search('system') !== -1 && method.search('ExtrinsicFailed') !== -1) { - const dispatchError = data[0] as DispatchError; - const moduleThatErrored = dispatchError.asModule; - const moduleError = dispatchError.registry.findMetaError(moduleThatErrored); - txError = moduleError; - this.logger.error(`Extrinsic failed with error: ${JSON.stringify(moduleError)}`); - } - }); - } catch (error) { - this.logger.error(error); - } - this.logger.debug(`Total capacity withdrawn in block: ${totalBlockCapacity.toString()}`); - return { found: true, success: isTxSuccess, blockHash, capacityWithDrawn: totalBlockCapacity.toString(), error: txError }; - }, - ); + return epochLength.toNumber(); + } + + public async crawlBlockListForTx(txHash: Hash, blockList: bigint[], successEvents: [{ pallet: string; event: string }]): Promise { + const txReceiptPromises: Promise[] = blockList.map(async (blockNumber) => { + const blockHash = await this.getBlockHash(blockNumber); + const block = await this.getBlock(blockHash); + const txIndex = block.block.extrinsics.findIndex((extrinsic) => extrinsic.hash.toString() === txHash.toString()); + + if (txIndex === -1) { + return { found: false, success: false }; + } + + this.logger.verbose(`Found tx ${txHash} in block ${blockNumber}`); + const at = await this.api.at(blockHash.toHex()); + const capacityEpoch = (await at.query.capacity.currentEpoch()).toNumber(); + const eventsPromise = at.query.system.events(); + + let isTxSuccess = false; + let totalBlockCapacity = 0n; + let txError: RegistryError | undefined; + + try { + const events = (await eventsPromise).filter(({ phase }) => phase.isApplyExtrinsic && phase.asApplyExtrinsic.eq(txIndex)); + + events.forEach((record) => { + const { event } = record; + const eventName = event.section; + const { method } = event; + const { data } = event; + this.logger.debug(`Received event: ${eventName} ${method} ${data}`); + + // find capacity withdrawn event + if (at.events.capacity.CapacityWithdrawn.is(event)) { + totalBlockCapacity += event.data.amount.toBigInt(); + } + + // check custom success events + if (successEvents.find((successEvent) => successEvent.pallet === eventName && successEvent.event === method)) { + this.logger.debug(`Found success event ${eventName} ${method}`); + isTxSuccess = true; + } + + // check for system extrinsic failure + if (at.events.system.ExtrinsicFailed.is(event)) { + const { dispatchError } = event.data; + const moduleThatErrored = dispatchError.asModule; + const moduleError = dispatchError.registry.findMetaError(moduleThatErrored); + txError = moduleError; + this.logger.error(`Extrinsic failed with error: ${JSON.stringify(moduleError)}`); + } + }); + } catch (error) { + this.logger.error(error); + } + this.logger.debug(`Total capacity withdrawn in block: ${totalBlockCapacity.toString()}`); + return { found: true, success: isTxSuccess, blockHash, capacityEpoch, capacityWithDrawn: totalBlockCapacity, error: txError }; + }); const results = await Promise.all(txReceiptPromises); const result = results.find((receipt) => receipt.found); this.logger.debug(`Found tx receipt: ${JSON.stringify(result)}`); diff --git a/libs/common/src/blockchain/extrinsic.ts b/libs/common/src/blockchain/extrinsic.ts index 5965edd9..35d86654 100644 --- a/libs/common/src/blockchain/extrinsic.ts +++ b/libs/common/src/blockchain/extrinsic.ts @@ -1,78 +1,24 @@ -/** - * These helpers return a map of events, some of which contain useful data, some of which don't. - * Extrinsics that "create" records typically contain an ID of the entity they created, and this - * would be a useful value to return. However, this data seems to be nested inside an array of arrays. - * - * Ex: schemaId = events["schemas.SchemaCreated"][] - * - * To get the value associated with an event key, we would need to query inside that nested array with - * a set of arbitrary indices. Should an object at any level of that querying be undefined, the helper - * will throw an unchecked exception. - * - * To get type checking and cast a returned event as a specific event type, you can utilize TypeScripts - * type guard functionality like so: - * - * const msaCreatedEvent = events.defaultEvent; - * if (this.api.events.msa.MsaCreated.is(msaCreatedEvent)) { - * msaId = msaCreatedEvent.data.msaId; - * } - * - * Normally, I'd say the best experience is for the helper to return both the ID of the created entity - * along with a map of emitted events. But in this case, returning that value will increase the complexity - * of each helper, since each would have to check for undefined values at every lookup. So, this may be - * a rare case when it is best to simply return the map of emitted events and trust the user to look them - * up in the test. - */ - -import { ApiRx } from '@polkadot/api'; -import { SubmittableExtrinsic, ApiTypes, AugmentedEvent } from '@polkadot/api/types'; -import { Call, Event, EventRecord, Hash } from '@polkadot/types/interfaces'; -import { IsEvent } from '@polkadot/types/metadata/decorate/types'; -import { Codec, ISubmittableResult, AnyTuple } from '@polkadot/types/types'; -import { filter, firstValueFrom, map, pipe, tap } from 'rxjs'; +import { ApiPromise } from '@polkadot/api'; +import { SubmittableExtrinsic } from '@polkadot/api/types'; +import { Call, Hash } from '@polkadot/types/interfaces'; +import { ISubmittableResult } from '@polkadot/types/types'; import { KeyringPair } from '@polkadot/keyring/types'; -import { EventError } from './event-error'; - -export type EventMap = Record; - -function eventKey(event: Event): string { - return `${event.section}.${event.method}`; -} -export type ParsedEventResult = [any, EventMap]; +export class Extrinsic { + private extrinsic: SubmittableExtrinsic<'promise', T>; -export class Extrinsic { - private event?: IsEvent; - - private extrinsic: SubmittableExtrinsic<'rxjs', T>; - - // private call: Call; private keys: KeyringPair; - public api: ApiRx; + public api: ApiPromise; - constructor(api: ApiRx, extrinsic: SubmittableExtrinsic<'rxjs', T>, keys: KeyringPair, targetEvent?: IsEvent) { + constructor(api: ApiPromise, extrinsic: SubmittableExtrinsic<'promise', T>, keys: KeyringPair) { this.extrinsic = extrinsic; this.keys = keys; - this.event = targetEvent; this.api = api; } - public get targetEvent() { - return this.event; - } - - public async signAndSend(nonce?: number): Promise<[Hash, EventMap]> { - const { status, events, txHash } = await firstValueFrom(this.extrinsic.signAndSend(this.keys, { nonce })); - if (status.isFinalized || status.isInBlock) { - const eventMap: EventMap = {}; - events.forEach((record: EventRecord) => { - const { event } = record; - eventMap[eventKey(event)] = event; - }); - return [txHash, eventMap]; - } - return [txHash, {}]; + public async signAndSend(nonce?: number): Promise { + return this.extrinsic.signAndSend(this.keys, { nonce }); } public getCall(): Call { diff --git a/libs/common/src/dtos/graph.notifier.job.ts b/libs/common/src/dtos/graph.notifier.job.ts index b6b8115b..aba9f3b5 100644 --- a/libs/common/src/dtos/graph.notifier.job.ts +++ b/libs/common/src/dtos/graph.notifier.job.ts @@ -4,7 +4,6 @@ import { GraphUpdateJob } from './graph.update.job'; export interface ITxMonitorJob { id: string; txHash: Hash; - epoch: string; lastFinalizedBlockHash: BlockHash; referencePublishJob: GraphUpdateJob; } diff --git a/libs/common/src/services/async_debouncer.ts b/libs/common/src/services/async_debouncer.ts index 8a4b10c8..f8331280 100644 --- a/libs/common/src/services/async_debouncer.ts +++ b/libs/common/src/services/async_debouncer.ts @@ -1,7 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; import Redis from 'ioredis'; import { PrivacyType } from '@dsnp/graph-sdk'; -import { MessageSourceId, SchemaId } from '@frequency-chain/api-augment/interfaces'; import * as QueueConstants from '../utils/queues'; import { DsnpGraphEdge } from '../dtos/dsnp-graph-edge.dto'; import { ConfigService } from '../config/config.service'; @@ -20,60 +19,47 @@ export class AsyncDebouncerService { this.logger = new Logger(this.constructor.name); } - public async getGraphForDsnpId(dsnpId: MessageSourceId, privacyType: string, graphKeyPairs?: GraphKeyPairDto[]): Promise { + public getGraphForDsnpId(dsnpId: string, privacyType: PrivacyType, graphKeyPairs?: GraphKeyPairDto[]): Promise { return this.debounceAsyncOperation(dsnpId, privacyType, graphKeyPairs); } - public async setGraphForSchemaId(dsnpId: MessageSourceId, schemaId: SchemaId, graphKeyPairs?: GraphKeyPairDto[]): Promise { + public setGraphForSchemaId(dsnpId: string, schemaId: number, graphKeyPairs?: GraphKeyPairDto[]): Promise { if (!schemaId) { throw new Error('Schema ID is required'); } - const privacyType = this.graphStateManager.getPrivacyForSchema(schemaId.toNumber()); + const privacyType = this.graphStateManager.getPrivacyForSchema(schemaId); return this.debounceAsyncOperation(dsnpId, privacyType, graphKeyPairs); } - async debounceAsyncOperation(dsnpId: MessageSourceId, privacyType: string, graphKeyPairs?: GraphKeyPairDto[]): Promise { - const cacheKey = this.getCacheKey(dsnpId.toString(), privacyType); + public async debounceAsyncOperation(dsnpId: string, privacyType: PrivacyType, graphKeyPairs?: GraphKeyPairDto[]): Promise { + const cacheKey = this.getCacheKey(dsnpId, privacyType); const cachedFuture = await this.redis.get(cacheKey); if (cachedFuture) { - this.logger.debug(`Async operation for key ${dsnpId} is already inflight`); - this.logger.debug(`Data: ${cachedFuture}`); + this.logger.debug(`Async operation for key ${dsnpId} is already inflight`, cachedFuture); const graphData: DsnpGraphEdge[] = JSON.parse(cachedFuture); if (graphData && graphData.length > 0) { - return Promise.resolve(graphData); + return graphData; } } - let privacyTypeValue = PrivacyType.Public; - if (privacyType === 'private') { + if (privacyType === PrivacyType.Private) { if (!graphKeyPairs || graphKeyPairs.length === 0) { throw new Error('Graph key pairs are required for private graph'); } - privacyTypeValue = PrivacyType.Private; } let graphEdges: DsnpGraphEdge[] = []; try { - graphEdges = await this.graphStateManager.getConnectionsWithPrivacyType(dsnpId, privacyTypeValue, graphKeyPairs); + graphEdges = await this.graphStateManager.getConnectionsWithPrivacyType(dsnpId, privacyType, graphKeyPairs); } catch (err) { - this.logger.error(`Error getting graph edges for ${dsnpId} with privacy type ${privacyType}`); - this.logger.error(err); - return Promise.resolve(graphEdges); + this.logger.error(`Error getting graph edges for ${dsnpId} with privacy type ${privacyType}`, err); + return graphEdges; } const debounceTime = this.configService.getDebounceSeconds(); await this.redis.setex(cacheKey, debounceTime, JSON.stringify(graphEdges)); // Remove the graph from the graph state after the debounce time - this.scheduleRemoveUserGraph(dsnpId, debounceTime); - return Promise.resolve(graphEdges); - } - - private async scheduleRemoveUserGraph(dsnpId: MessageSourceId, debounceTime: number): Promise { - return new Promise((resolve) => { - setTimeout(() => { - this.graphStateManager.removeUserGraph(dsnpId.toString()); - resolve(); - }, debounceTime * 1000); - }); + setTimeout(() => this.graphStateManager.removeUserGraph(dsnpId.toString()), debounceTime * 1000); + return graphEdges; } private getCacheKey(key: string, privacyType: string): string { diff --git a/libs/common/src/services/graph-state-manager.ts b/libs/common/src/services/graph-state-manager.ts index 780ae153..ccd203ef 100644 --- a/libs/common/src/services/graph-state-manager.ts +++ b/libs/common/src/services/graph-state-manager.ts @@ -155,7 +155,7 @@ export class GraphStateManager implements OnApplicationBootstrap { return false; } - public async getConnectionsWithPrivacyType(dsnpUserId: MessageSourceId, privacyType: PrivacyType, graphKeyPairs?: GraphKeyPairDto[]): Promise { + public async getConnectionsWithPrivacyType(dsnpUserId: string, privacyType: PrivacyType, graphKeyPairs?: GraphKeyPairDto[]): Promise { const privateFollowSchemaId = this.schemaIds[ConnectionType.Follow][PrivacyType.Private]; const privateFriendSchemaId = this.schemaIds[ConnectionType.Friendship][PrivacyType.Private]; const publicFollowSchemaId = this.schemaIds[ConnectionType.Follow][PrivacyType.Public]; @@ -188,12 +188,12 @@ export class GraphStateManager implements OnApplicationBootstrap { return []; } - async importBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { + async importBundles(dsnpUserId: string, graphKeyPairs: GraphKeyPairDto[]): Promise { const importBundles = await this.formImportBundles(dsnpUserId, graphKeyPairs); return this.importUserData(importBundles); } - async formImportBundles(dsnpUserId: MessageSourceId, graphKeyPairs: GraphKeyPairDto[]): Promise { + async formImportBundles(dsnpUserId: string, graphKeyPairs: GraphKeyPairDto[]): Promise { const publicFollowSchemaId = this.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Public); const privateFollowSchemaId = this.getSchemaIdFromConfig(ConnectionType.Follow, PrivacyType.Private); const privateFriendshipSchemaId = this.getSchemaIdFromConfig(ConnectionType.Friendship, PrivacyType.Private); From 7ed304af3fa269c3cf0e0136768aba332c02eae7 Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Fri, 12 Jul 2024 15:29:43 -0400 Subject: [PATCH 47/53] feat: update GET webhooks endpoint (#114) # Description This PR does the following: * Updates the DTO for the `PUT /v1/webhooks` endpoint to make the `dsnpIds` property optional; if omitted, the request will register the provided URL with the MSA 'all' * Methods that retrieve webhooks for a graph update now include a defaulted (true) boolean parameter, `includeAll`, which indicates to also include URLs registered for MSA 'all' * The `GET /v1/webhooks/{msaId}` endpoint has been updated to add an optional `QUERY` parameter, `includeAll` (boolean). If true (default), the response will include webhook URLs registered for MSA 'all' in addition to the requested MSA; otherwise it will only include URLs registered for the specific MSA requested. --- apps/api/src/api.service.ts | 32 ++++++++++++------- .../controllers/v1/webhooks-v1.controller.ts | 5 +-- apps/api/test/app.e2e-spec.ts | 3 +- .../graph.monitor.processor.service.ts | 23 ++++++++++--- libs/common/src/dtos/watch-graphs.dto.ts | 6 ++-- libs/common/src/utils/queues.ts | 5 --- libs/common/src/utils/redis.ts | 10 ++++++ package.json | 5 +-- swagger.json | 10 ++++++ 9 files changed, 69 insertions(+), 30 deletions(-) diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 7ed1553a..78485545 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -4,8 +4,8 @@ import Redis from 'ioredis'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; import { createHash } from 'crypto'; -import { MessageSourceId } from '@frequency-chain/api-augment/interfaces'; import * as QueueConstants from '#lib/utils/queues'; +import * as RedisConstants from '#lib/utils/redis'; import { AsyncDebouncerService, BlockchainService, @@ -87,7 +87,8 @@ export class ApiService implements BeforeApplicationShutdown { */ async watchGraphs(watchGraphsDto: WatchGraphsDto): Promise { let itemsAdded = false; - for (const dsnpId of watchGraphsDto.dsnpIds) { + const ids = watchGraphsDto?.dsnpIds || [RedisConstants.REDIS_WEBHOOK_ALL]; + for (const dsnpId of ids) { // eslint-disable-next-line no-await-in-loop const result = await this.watchGraphForMsa(dsnpId, watchGraphsDto.webhookEndpoint); itemsAdded = itemsAdded || result; @@ -101,7 +102,7 @@ export class ApiService implements BeforeApplicationShutdown { let webhookAdded = false; const url = new URL(webhook).toString(); const existingWebhooks = new Set( - await this.redis.hget(QueueConstants.REDIS_WATCHER_PREFIX, msaId).then((webhooksStr) => { + await this.redis.hget(RedisConstants.REDIS_WEBHOOK_PREFIX, msaId).then((webhooksStr) => { return webhooksStr ? (JSON.parse(webhooksStr) as string[]) : []; }), ); @@ -110,7 +111,7 @@ export class ApiService implements BeforeApplicationShutdown { this.logger.verbose(`Registering webhook for MSA ${msaId}: ${url}`); } existingWebhooks.add(url); - await this.redis.hset(QueueConstants.REDIS_WATCHER_PREFIX, msaId, JSON.stringify([...existingWebhooks])); + await this.redis.hset(RedisConstants.REDIS_WEBHOOK_PREFIX, msaId, JSON.stringify([...existingWebhooks])); return webhookAdded; } catch (err: any) { this.logger.error('Error adding webhook', err); @@ -123,7 +124,7 @@ export class ApiService implements BeforeApplicationShutdown { let value: string[]; const result = {}; do { - [cursor, value] = await this.redis.hscan(QueueConstants.REDIS_WATCHER_PREFIX, cursor); + [cursor, value] = await this.redis.hscan(RedisConstants.REDIS_WEBHOOK_PREFIX, cursor); Object.assign(result, await hscanToObject(value)); } while (cursor !== '0'); return result; @@ -135,9 +136,18 @@ export class ApiService implements BeforeApplicationShutdown { * @param {string} msaId:string * @returns {string[]} Array of URLs */ - async getWebhooksForMsa(msaId: string): Promise { - const value = await this.redis.hget(QueueConstants.REDIS_WATCHER_PREFIX, msaId); - return value ? (JSON.parse(value) as string[]) : []; + async getWebhooksForMsa(msaId: string, includeAll = true): Promise { + const value = await this.redis.hget(RedisConstants.REDIS_WEBHOOK_PREFIX, msaId); + let webhooks = value ? (JSON.parse(value) as string[]) : []; + + if (includeAll) { + const all = await this.redis.hget(RedisConstants.REDIS_WEBHOOK_PREFIX, RedisConstants.REDIS_WEBHOOK_ALL); + const allHooks = all ? (JSON.parse(all) as string[]) : []; + webhooks.push(...allHooks); + webhooks = [...new Set(webhooks)]; + } + + return webhooks; } async getWatchedGraphsForUrl(url: string): Promise { @@ -153,11 +163,11 @@ export class ApiService implements BeforeApplicationShutdown { } async deleteAllWebhooks(): Promise { - await this.redis.del(QueueConstants.REDIS_WATCHER_PREFIX); + await this.redis.del(RedisConstants.REDIS_WEBHOOK_PREFIX); } async deleteWebhooksForUser(msaId: string): Promise { - await this.redis.hdel(QueueConstants.REDIS_WATCHER_PREFIX, msaId); + await this.redis.hdel(RedisConstants.REDIS_WEBHOOK_PREFIX, msaId); } async removeWebhookFromUser(msaId: string, url: string): Promise { @@ -166,7 +176,7 @@ export class ApiService implements BeforeApplicationShutdown { if (webhooksForUser.size === 0) { await this.deleteWebhooksForUser(msaId); } else { - await this.redis.hset(QueueConstants.REDIS_WATCHER_PREFIX, msaId, JSON.stringify([...webhooksForUser])); + await this.redis.hset(RedisConstants.REDIS_WEBHOOK_PREFIX, msaId, JSON.stringify([...webhooksForUser])); } } } diff --git a/apps/api/src/controllers/v1/webhooks-v1.controller.ts b/apps/api/src/controllers/v1/webhooks-v1.controller.ts index d0892d0e..8c94475c 100644 --- a/apps/api/src/controllers/v1/webhooks-v1.controller.ts +++ b/apps/api/src/controllers/v1/webhooks-v1.controller.ts @@ -26,8 +26,9 @@ export class WebhooksControllerV1 { @ApiOperation({ summary: 'Get all registered webhooks for a specific MSA ID' }) @ApiOkResponse({ description: 'Retrieved all registered webhooks for the given MSA ID' }) @ApiParam({ name: 'msaId', example: '2', type: String, description: 'MSA ID for which to request registered webhooks ' }) - async getWebhooksForMsa(@Param('msaId') msaId: string): Promise { - return this.apiService.getWebhooksForMsa(msaId); + @ApiQuery({ name: 'includeAll', type: Boolean, example: true, required: false, description: "Boolean whether to include webhooks registered for 'all' MSAs (default: true)" }) + async getWebhooksForMsa(@Param('msaId') msaId: string, @Query('includeAll') includeAll = 'true'): Promise { + return this.apiService.getWebhooksForMsa(msaId, JSON.parse(includeAll ?? 'true')); } @Get('urls') diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index 40d7ee5c..d52c53ac 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -10,6 +10,7 @@ import { u8aToHex } from '@polkadot/util'; import { ApiModule } from '#api/api.module'; import { ProviderGraphDto, ConnectionDto, KeyType, GraphKeyPairDto, GraphsQueryParamsDto, Direction } from '#lib/dtos'; import { PrivacyType, ConnectionType } from '@dsnp/graph-sdk'; +import { MILLISECONDS_PER_SECOND } from 'time-constants'; let app: INestApplication; let testModule: TestingModule; @@ -31,7 +32,7 @@ describe('Graph Service E2E request verification!', () => { app.useGlobalPipes(new ValidationPipe()); app.enableShutdownHooks(); await app.init(); - }); + }, 60 * MILLISECONDS_PER_SECOND); afterAll(async () => { await app.close(); diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index f7b635cf..463fbd21 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -18,6 +18,7 @@ import { ConfigService, } from '#lib'; import * as QueueConstants from '#lib/utils/queues'; +import * as RedisConstants from '#lib/utils/redis'; import * as BlockchainConstants from '#lib/blockchain/blockchain-constants'; @Injectable() @@ -185,10 +186,24 @@ export class GraphNotifierService extends BaseConsumer { return { pause: false, retry: false }; } - async getWebhookList(dsnpId: string): Promise { - const redisKey = `${QueueConstants.REDIS_WATCHER_PREFIX}:${dsnpId}`; - const redisList = await this.cacheManager.smembers(redisKey); + /** + * Return all URLs registered as webhooks for the given MSA + * + * @param {string} msaId - MSA to retrieve webhooks for + * @param {boolean} includeAll - Whether to include webhooks registered for 'all' + * @returns {string[]} Array of URLs + */ + async getWebhookList(msaId: string, includeAll = true): Promise { + const value = await this.cacheManager.hget(RedisConstants.REDIS_WEBHOOK_PREFIX, msaId); + let webhooks = value ? (JSON.parse(value) as string[]) : []; + + if (includeAll) { + const all = await this.cacheManager.hget(RedisConstants.REDIS_WEBHOOK_PREFIX, RedisConstants.REDIS_WEBHOOK_ALL); + const allHooks = all ? (JSON.parse(all) as string[]) : []; + webhooks.push(...allHooks); + webhooks = [...new Set(webhooks)]; + } - return redisList || []; + return webhooks; } } diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/libs/common/src/dtos/watch-graphs.dto.ts index afa19233..f4b8c58c 100644 --- a/libs/common/src/dtos/watch-graphs.dto.ts +++ b/libs/common/src/dtos/watch-graphs.dto.ts @@ -1,12 +1,12 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsArray, IsNotEmpty, IsNumberString, IsString, IsUrl } from 'class-validator'; +import { IsArray, IsNotEmpty, IsNumberString, IsOptional, IsString, IsUrl } from 'class-validator'; export class WatchGraphsDto { + @IsOptional() @IsArray() @IsNumberString({ no_symbols: true }, { each: true }) - @IsNotEmpty() @ApiProperty({ description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5'] }) - dsnpIds: string[]; + dsnpIds?: string[]; @IsNotEmpty() @IsString() diff --git a/libs/common/src/utils/queues.ts b/libs/common/src/utils/queues.ts index 72386cec..78925347 100644 --- a/libs/common/src/utils/queues.ts +++ b/libs/common/src/utils/queues.ts @@ -18,11 +18,6 @@ export const GRAPH_CHANGE_PUBLISH_QUEUE = 'graphChangePublish'; */ export const GRAPH_CHANGE_NOTIFY_QUEUE = 'graphChangeNotify'; -/** - * Prefix for Redis keys that store webhook endpoints - */ -export const REDIS_WATCHER_PREFIX = 'graph-service-watcher'; - /** * Debouncer cache key */ diff --git a/libs/common/src/utils/redis.ts b/libs/common/src/utils/redis.ts index 0a35e4b7..34c4ccd3 100644 --- a/libs/common/src/utils/redis.ts +++ b/libs/common/src/utils/redis.ts @@ -22,3 +22,13 @@ const CHAIN_NONCE_KEY = 'chain:nonce'; export function getNonceKey(suffix: string) { return `${CHAIN_NONCE_KEY}:${suffix}`; } + +/** + * Prefix for Redis keys that store webhook endpoints + */ +export const REDIS_WEBHOOK_PREFIX = 'graph-service-webhooks'; + +/** + * Const for registering/looking up webhooks designated for all MSAs + */ +export const REDIS_WEBHOOK_ALL = 'all'; diff --git a/package.json b/package.json index 7ab13e4c..47c6aae8 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,7 @@ "start:worker:dev": "set -a ; . .env ; nest start worker", "start:worker:debug": "set -a ; . .env ;nest start worker --debug=9230 --watch", "docker-build": "docker build -t graph-service .", - "docker-build:dev": "docker-compose -f docker-compose.dev.yaml build", - "docker-run": " build -t graph-service-deploy . ; docker run -p 6379:6379 --env-file .env graph-service-deploy", - "docker-run:dev": "docker-compose -f docker-compose.dev.yaml up -d ; docker-compose -f docker-compose.dev.yaml logs", - "docker-stop:dev": "docker-compose -f docker-compose.dev.yaml stop", + "docker-run": "docker build -t graph-service-deploy . ; docker run --env-file .env graph-service-deploy", "chain-setup": "tsx ./test-setup/main.ts", "clean": "rm -Rf dist", "lint": "eslint \"{apps,libs}/**/*.ts\"", diff --git a/swagger.json b/swagger.json index 5f16cd32..a28d7e30 100644 --- a/swagger.json +++ b/swagger.json @@ -133,6 +133,16 @@ "schema": { "type": "string" } + }, + { + "name": "includeAll", + "required": false, + "in": "query", + "example": true, + "description": "Boolean whether to include webhooks registered for 'all' MSAs (default: true)", + "schema": { + "type": "boolean" + } } ], "responses": { From 053c6c56deaf4c52ea62c272debc70d9771ba3b1 Mon Sep 17 00:00:00 2001 From: Joe Caputo Date: Tue, 16 Jul 2024 12:05:44 -0400 Subject: [PATCH 48/53] feat: add operation-specific webhook for graph change requests (#119) # Description This PR adds an optional `webhookURL` parameter to graph change request DTOs, and if supplied, the worker will notify the provided URL according to a new published webhook spec when the extrinsic completes/fails/expires. Closes #118 --- .env.docker.dev | 30 --- Makefile | 2 +- README.md | 5 +- apps/api/src/api.service.ts | 1 + apps/api/src/metadata.ts | 65 ++--- .../graph.monitor.processor.service.ts | 151 ++++++----- .../request.processor.service.ts | 1 + docker-compose.yaml | 36 ++- graph-webhooks.openapi.yaml | 139 ++++++++++ .../src/dtos/graph-change-notification.dto.ts | 35 --- libs/common/src/dtos/graph.update.job.ts | 2 + libs/common/src/dtos/index.ts | 1 - libs/common/src/dtos/provider-graph.dto.ts | 7 +- libs/common/src/dtos/watch-graphs.dto.ts | 2 +- .../provider.graph.update-job.interface.ts | 2 + libs/common/src/types/index.ts | 1 + libs/common/src/types/webhook-types.d.ts | 91 +++++++ package-lock.json | 253 ++++++++++++++++++ package.json | 3 + scripts/run-e2e.sh | 22 ++ swagger.json | 5 +- test-setup/main.ts | 97 ++++++- tsconfig.json | 6 + 23 files changed, 766 insertions(+), 191 deletions(-) delete mode 100644 .env.docker.dev create mode 100644 graph-webhooks.openapi.yaml delete mode 100644 libs/common/src/dtos/graph-change-notification.dto.ts create mode 100644 libs/common/src/types/index.ts create mode 100644 libs/common/src/types/webhook-types.d.ts create mode 100755 scripts/run-e2e.sh diff --git a/.env.docker.dev b/.env.docker.dev deleted file mode 100644 index 3749341f..00000000 --- a/.env.docker.dev +++ /dev/null @@ -1,30 +0,0 @@ -# Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development -FREQUENCY_URL=ws://frequency:9944 -REDIS_URL=redis://redis:6379 -QUEUE_HIGH_WATER=1000 -API_PORT=3000 -DEBOUNCE_SECONDS=10 - -# Configure the amount of capacity Graph Service can use. -CAPACITY_LIMIT={"type":"percentage", "value":80} - -# Add the graph environment type. This can be 'TestnetPaseo' or 'Mainnet'. -# Mainnet is also used for dsnp/instant-seal-node-with-deployed-schemas:latest -GRAPH_ENVIRONMENT_TYPE=Mainnet - -PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" -PROVIDER_ID=1 - -# ------- following are optional if reconnection service is is required --- -PROVIDER_BASE_URL=http://localhost:3000 - -# this is optional if reconnection service if PROVIDER_BASE_URL requires an access token -PROVIDER_ACCESS_TOKEN="api-key" -PAGE_SIZE=100 -RECONNECTION_SERVICE_REQUIRED=false -BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 -WEBHOOK_FAILURE_THRESHOLD=3 -HEALTH_CHECK_SUCCESS_THRESHOLD=10 -WEBHOOK_RETRY_INTERVAL_SECONDS=10 -HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 -HEALTH_CHECK_MAX_RETRIES=4 diff --git a/Makefile b/Makefile index dfdd7b41..9895c68c 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ setup: .PHONY: test-e2e test-e2e: - @(npm run test:e2e) + ./scripts/run-e2e.sh ###### ###### Running apps targets diff --git a/README.md b/README.md index fe5651ea..d28d860c 100644 --- a/README.md +++ b/README.md @@ -181,14 +181,13 @@ Install NPM Dependencies: ### Environment Variables -The application receives its configuration from the environment. Each method of launching the app has its own source for the environment. If you run a container image using Kubernetes, it is likely your environment injection will be configured in a Helm chart. For local Docker-based development, you may specifiy the environment or point to an environment file (the included [docker-compose.yaml](./docker-compose.yaml) relies on the included [.env.docker.dev](./.env.docker.dev) file). If running natively using the script included in `package.json`, the app will use a local `.env` file. +The application receives its configuration from the environment. Each method of launching the app has its own source for the environment. If you run a container image using Kubernetes, it is likely your environment injection will be configured in a Helm chart. For local Docker-based development, you may specifiy the environment or point to an environment file (the included [docker-compose.yaml](./docker-compose.yaml) can has a self-contained environment which may be edited to suit your purposes). If running natively using the script included in `package.json`, the app will use a local `.env` file. Environment files are documented [here](./ENVIRONMENT.md), and a sample environment file is provided [here](./env.template). -1. Copy the template values into the .env files. +1. Copy the template values into the .env file. ```sh cp env.template .env - cp env.template .env.docker.dev ``` 2. Replace template values with values appropriate to your environment. diff --git a/apps/api/src/api.service.ts b/apps/api/src/api.service.ts index 78485545..450fb511 100644 --- a/apps/api/src/api.service.ts +++ b/apps/api/src/api.service.ts @@ -66,6 +66,7 @@ export class ApiService implements BeforeApplicationShutdown { graphKeyPairs: request.graphKeyPairs, referenceId: this.calculateJobId(request), updateConnection: this.configService.getReconnectionServiceRequired(), + webhookUrl: request.webhookUrl, }; const jobOld = await this.graphChangeRequestQueue.getJob(data.referenceId); if (jobOld && (await jobOld.isCompleted())) { diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index d2184354..4d3a2b92 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -1,11 +1,11 @@ /* eslint-disable */ export default async () => { const t = { - ['../../../libs/common/src/dtos/key-type.enum']: await import('../../../libs/common/src/dtos/key-type.enum'), ['../../../libs/common/src/dtos/privacy-type.enum']: await import('../../../libs/common/src/dtos/privacy-type.enum'), ['../../../libs/common/src/dtos/direction.enum']: await import('../../../libs/common/src/dtos/direction.enum'), ['../../../libs/common/src/dtos/connection-type.enum']: await import('../../../libs/common/src/dtos/connection-type.enum'), ['../../../libs/common/src/dtos/connection.dto']: await import('../../../libs/common/src/dtos/connection.dto'), + ['../../../libs/common/src/dtos/key-type.enum']: await import('../../../libs/common/src/dtos/key-type.enum'), ['../../../libs/common/src/dtos/dsnp-graph-edge.dto']: await import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), ['../../../libs/common/src/dtos/graph-key-pair.dto']: await import('../../../libs/common/src/dtos/graph-key-pair.dto'), ['../../../libs/common/src/dtos/user-graph.dto']: await import('../../../libs/common/src/dtos/user-graph.dto'), @@ -14,6 +14,18 @@ export default async () => { return { '@nestjs/swagger': { models: [ + [ + import('../../../libs/common/src/dtos/connection.dto'), + { + ConnectionDto: { + dsnpId: { required: true, type: () => String }, + privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, + direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.enum'].Direction }, + connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection-type.enum'].ConnectionType }, + }, + ConnectionDtoWrapper: { data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }, + }, + ], [ import('../../../libs/common/src/dtos/dsnp-graph-edge.dto'), { DsnpGraphEdge: { userId: { required: true, type: () => String }, since: { required: true, type: () => Number } } }, @@ -28,18 +40,6 @@ export default async () => { }, }, ], - [ - import('../../../libs/common/src/dtos/connection.dto'), - { - ConnectionDto: { - dsnpId: { required: true, type: () => String }, - privacyType: { required: true, enum: t['../../../libs/common/src/dtos/privacy-type.enum'].PrivacyType }, - direction: { required: true, enum: t['../../../libs/common/src/dtos/direction.enum'].Direction }, - connectionType: { required: true, enum: t['../../../libs/common/src/dtos/connection-type.enum'].ConnectionType }, - }, - ConnectionDtoWrapper: { data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }, - }, - ], [ import('../../../libs/common/src/dtos/user-graph.dto'), { @@ -67,48 +67,37 @@ export default async () => { dsnpId: { required: true, type: () => String }, connections: { required: true, type: () => ({ data: { required: true, type: () => [t['../../../libs/common/src/dtos/connection.dto'].ConnectionDto] } }) }, graphKeyPairs: { required: false, type: () => [t['../../../libs/common/src/dtos/graph-key-pair.dto'].GraphKeyPairDto] }, + webhookUrl: { required: false, type: () => String }, }, }, ], [ import('../../../libs/common/src/dtos/watch-graphs.dto'), - { WatchGraphsDto: { dsnpIds: { required: true, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }, + { WatchGraphsDto: { dsnpIds: { required: false, type: () => [String] }, webhookEndpoint: { required: true, type: () => String } } }, ], + ], + controllers: [ + [import('./controllers/health.controller'), { HealthController: { healthz: {}, livez: {}, readyz: {} } }], [ - import('../../../libs/common/src/dtos/graph-change-notification.dto'), + import('./controllers/v1/webhooks-v1.controller'), { - PersistPageUpdateDto: { - type: { required: true, type: () => String }, - ownerDsnpUserId: { required: true, type: () => String }, - schemaId: { required: true, type: () => Number }, - pageId: { required: true, type: () => Number }, - prevHash: { required: true, type: () => Number }, - }, - DeletePageUpdateDto: { - type: { required: true, type: () => String }, - ownerDsnpUserId: { required: true, type: () => String }, - schemaId: { required: true, type: () => Number }, - pageId: { required: true, type: () => Number }, - prevHash: { required: true, type: () => Number }, - }, - AddKeyUpdateDto: { - type: { required: true, type: () => String }, - ownerDsnpUserId: { required: true, type: () => String }, - prevHash: { required: true, type: () => Number }, + WebhooksControllerV1: { + getAllWebhooks: { type: Object }, + getWebhooksForMsa: { type: [String] }, + getWebhooksForUrl: { type: [String] }, + watchGraphs: {}, + deleteAllWebhooks: {}, + deleteWebhooksForMsa: {}, + deleteAllWebhooksForUrl: {}, }, - GraphChangeNotificationDto: { dsnpId: { required: true, type: () => String }, update: { required: true, type: () => Object } }, }, ], - ], - controllers: [ - [import('./controllers/health.controller'), { HealthController: { healthz: {}, livez: {}, readyz: {} } }], [ import('./controllers/v1/graph-v1.controller'), { GraphControllerV1: { getGraphs: { type: [t['../../../libs/common/src/dtos/user-graph.dto'].UserGraphDto] }, updateGraph: { type: t['../../../libs/common/src/dtos/graph-change-response.dto'].GraphChangeRepsonseDto }, - watchGraphs: {}, }, }, ], diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts index 463fbd21..29162841 100644 --- a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts +++ b/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts @@ -1,25 +1,19 @@ import { InjectRedis } from '@songkeys/nestjs-redis'; import { InjectQueue, Processor } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; -import { Job, Queue } from 'bullmq'; +import { Job, Queue, UnrecoverableError } from 'bullmq'; import Redis from 'ioredis'; import { MILLISECONDS_PER_SECOND } from 'time-constants'; import { RegistryError } from '@polkadot/types/types'; import axios from 'axios'; -import { - BaseConsumer, - AsyncDebouncerService, - BlockchainService, - GraphStateManager, - ITxMonitorJob, - ProviderGraphUpdateJob, - GraphChangeNotificationDto, - SECONDS_PER_BLOCK, - ConfigService, -} from '#lib'; +import { BaseConsumer, AsyncDebouncerService, BlockchainService, GraphStateManager, ITxMonitorJob, ProviderGraphUpdateJob, SECONDS_PER_BLOCK, ConfigService } from '#lib'; import * as QueueConstants from '#lib/utils/queues'; import * as RedisConstants from '#lib/utils/redis'; import * as BlockchainConstants from '#lib/blockchain/blockchain-constants'; +import * as GraphServiceWebhook from '#lib/types/webhook-types'; + +type GraphChangeNotification = GraphServiceWebhook.Components.Schemas.GraphChangeNotification; +type GraphOperationStatus = GraphServiceWebhook.Components.Schemas.GraphOperationStatus; @Injectable() @Processor(QueueConstants.GRAPH_CHANGE_NOTIFY_QUEUE) @@ -49,66 +43,103 @@ export class GraphNotifierService extends BaseConsumer { for (let i = previousKnownBlockNumber; i <= currentFinalizedBlockNumber && i < previousKnownBlockNumber + numberBlocksToParse; i += 1n) { blockList.push(i); } - const txResult = await this.blockchainService.crawlBlockListForTx(job.data.txHash, blockList, [{ pallet: 'system', event: 'ExtrinsicSuccess' }]); - if (!txResult.found) { - this.logger.error(`Tx ${job.data.txHash} not found in block list`); - throw new Error(`Tx ${job.data.txHash} not found in block list`); - } else { - // Set current epoch capacity - await this.setEpochCapacity(txResult.capacityEpoch ?? 0, txResult.capacityWithDrawn ?? 0n); - if (txResult.error) { - this.logger.debug(`Error found in tx result: ${JSON.stringify(txResult.error)}`); - const errorReport = await this.handleMessagesFailure(txResult.error); - if (errorReport.pause) { - this.logger.debug(`Pausing queue ${job.data.referencePublishJob.referenceId}`); - await this.changeRequestQueue.pause(); - await this.reconnectionQueue.pause(); + + const notification: GraphOperationStatus = { + referenceId: job.data.referencePublishJob.referenceId, + status: 'pending', + }; + + try { + const txResult = await this.blockchainService.crawlBlockListForTx(job.data.txHash, blockList, [{ pallet: 'system', event: 'ExtrinsicSuccess' }]); + if (!txResult.found) { + this.logger.error(`Tx ${job.data.txHash} not found in block list`); + // TODO: implement a blockchain scanner with mortality checks for expiration. + // For now, if we fail more times than this job queue will allow, consider the operation expired. + if (job.attemptsMade >= (this.changeRequestQueue.jobsOpts.attempts || 1)) { + notification.status = 'expired'; } - if (errorReport.retry) { - await this.retryRequestJob(job.data.referencePublishJob.referenceId); - } else { - throw new Error(`Job ${job.data.id} failed with error ${JSON.stringify(txResult.error)}`); + throw new Error(`Tx ${job.data.txHash} not found in block list`); + } else { + // Set current epoch capacity + await this.setEpochCapacity(txResult.capacityEpoch ?? 0, txResult.capacityWithDrawn ?? 0n); + + if (txResult.error) { + this.logger.debug(`Error found in tx result: ${JSON.stringify(txResult.error)}`); + const errorReport = await this.handleMessagesFailure(txResult.error); + if (errorReport.pause) { + this.logger.debug(`Pausing queue ${job.data.referencePublishJob.referenceId}`); + await this.changeRequestQueue.pause(); + await this.reconnectionQueue.pause(); + } + if (errorReport.retry) { + await this.retryRequestJob(job.data.referencePublishJob.referenceId); + } else { + notification.status = 'failed'; + } + throw new UnrecoverableError(`Job ${job.data.id} failed with error ${JSON.stringify(txResult.error)}`); } - } - if (txResult.success) { - this.logger.verbose(`Successfully found ${job.data.txHash} found in block ${txResult.blockHash}`); - const webhookList = await this.getWebhookList(job.data.referencePublishJob.update.ownerDsnpUserId); - this.logger.debug(`Found ${webhookList.length} webhooks for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); - const requestJob: Job | undefined = await this.changeRequestQueue.getJob(job.data.referencePublishJob.referenceId); - - if (job.data.referencePublishJob.update.type !== 'AddKey') { - this.logger.debug(`Setting graph for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); - const graphKeyPairs = requestJob?.data.graphKeyPairs ?? []; - const { ownerDsnpUserId, schemaId } = job.data.referencePublishJob.update; - const graphEdges = await this.asyncDebouncerService.setGraphForSchemaId(ownerDsnpUserId, schemaId, graphKeyPairs); - if (graphEdges.length === 0) { - this.logger.debug(`No graph edges found for ${ownerDsnpUserId}`); + if (txResult.success) { + this.logger.verbose(`Successfully found ${job.data.txHash} found in block ${txResult.blockHash}`); + notification.status = 'succeeded'; + const webhookList = await this.getWebhookList(job.data.referencePublishJob.update.ownerDsnpUserId); + this.logger.debug(`Found ${webhookList.length} webhooks for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); + const requestJob: Job | undefined = await this.changeRequestQueue.getJob(job.data.referencePublishJob.referenceId); + + if (job.data.referencePublishJob.update.type !== 'AddKey') { + this.logger.debug(`Setting graph for ${job.data.referencePublishJob.update.ownerDsnpUserId}`); + const graphKeyPairs = requestJob?.data.graphKeyPairs ?? []; + const { ownerDsnpUserId, schemaId } = job.data.referencePublishJob.update; + const graphEdges = await this.asyncDebouncerService.setGraphForSchemaId(ownerDsnpUserId, schemaId, graphKeyPairs); + if (graphEdges.length === 0) { + this.logger.debug(`No graph edges found for ${ownerDsnpUserId}`); + } } + const graphUpdateNotification: GraphChangeNotification = { + msaId: job.data.referencePublishJob.update.ownerDsnpUserId, + update: job.data.referencePublishJob.update, + }; + + // TODO: This should be moved elsewhere, likely need a blockchain scanner. This piece of code + // will only invoke the webhook for graph updates that we submitted. We likely want to monitor all + // graph updates, presuming the intent of "watch graph updates" is to watch for unsolicited graph updates on-chain. + // Here, we likely only want to notify the original submitter of this particular graph update. + webhookList.forEach(async (webhookUrl) => { + let retries = 0; + while (retries < this.configService.getHealthCheckMaxRetries()) { + try { + this.logger.debug(`Sending graph change notification to webhook: ${webhookUrl}`); + this.logger.debug(`Graph Change: ${JSON.stringify(notification)}`); + // eslint-disable-next-line no-await-in-loop + await axios.post(webhookUrl, graphUpdateNotification); + this.logger.debug(`Notification sent to webhook: ${webhookUrl}`); + break; + } catch (error) { + this.logger.error(`Failed to send notification to webhook: ${webhookUrl}`); + this.logger.error(error); + retries += 1; + } + } + }); + await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); } - const notification: GraphChangeNotificationDto = { - dsnpId: job.data.referencePublishJob.update.ownerDsnpUserId, - update: job.data.referencePublishJob.update, - }; - - webhookList.forEach(async (webhookUrl) => { + } + } finally { + if (notification.status !== 'pending') { + const webhook = job.data.referencePublishJob.webhookUrl; + if (webhook) { let retries = 0; while (retries < this.configService.getHealthCheckMaxRetries()) { try { - this.logger.debug(`Sending graph change notification to webhook: ${webhookUrl}`); - this.logger.debug(`Graph Change: ${JSON.stringify(notification)}`); - // eslint-disable-next-line no-await-in-loop - await axios.post(webhookUrl, notification); - this.logger.debug(`Notification sent to webhook: ${webhookUrl}`); + this.logger.debug(`Sending graph operation status (${notification.status}) notification for refId ${notification.referenceId} to webhook: ${webhook}`); + await axios.post(webhook, notification); break; - } catch (error) { - this.logger.error(`Failed to send notification to webhook: ${webhookUrl}`); - this.logger.error(error); + } catch (error: any) { + this.logger.error(`Failed to send status to webhook: ${webhook}`, error, error?.stack); retries += 1; } } - }); - await this.removeSuccessJobs(job.data.referencePublishJob.referenceId); + } } } } catch (e) { diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/apps/worker/src/request_processor/request.processor.service.ts index 48bd328b..9e919ea2 100644 --- a/apps/worker/src/request_processor/request.processor.service.ts +++ b/apps/worker/src/request_processor/request.processor.service.ts @@ -76,6 +76,7 @@ export class RequestProcessorService extends BaseConsumer { // create a GraphUpdateJob for each exported update const graphPublisherJobs: GraphUpdateJob[] = exportedUpdates.map((update) => ({ referenceId: job.data.referenceId, + webhookUrl: job.data.webhookUrl, update, })); // add each GraphUpdateJob to the graph publisher queue diff --git a/docker-compose.yaml b/docker-compose.yaml index b4e9d151..6a0f3fd9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,3 +1,19 @@ +x-graph-service-environment: &graph-service-environment + FREQUENCY_URL: ws://frequency:9944 + REDIS_URL: redis://redis:6379 + QUEUE_HIGH_WATER: 1000 + API_PORT: 3000 + DEBOUNCE_SECONDS: 10 + CAPACITY_LIMIT: '{"type": "percentage", "value": 80 }' + GRAPH_ENVIRONMENT_TYPE: Mainnet + PROVIDER_ACCOUNT_SEED_PHRASE: '//Alice' + PROVIDER_ID: 1 + RECONNECTION_SERVICE_REQUIRED: false + WEBHOOK_FAILURE_THRESHOLD: 3 + WEBHOOK_RETRY_INTERVAL_SECONDS: 10 + HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS: 10 + HEALTH_CHECK_MAX_RETRIES: 4 + services: redis: image: redis:latest @@ -30,37 +46,35 @@ services: graph-service-base: pull_policy: never - image: graph-service:latest + image: graph-service-dev:latest build: context: . dockerfile: dev.Dockerfile tags: - - graph-service:latest + - graph-service-dev:latest api: pull_policy: never - image: graph-service:latest - command: ["npm", "run", "start:api:watch"] + image: graph-service-dev:latest ports: - 3000:3000 - env_file: - - .env.docker.dev + command: ['npm', 'run', 'start:api:watch'] + environment: + <<: [*graph-service-environment] volumes: - ./:/app depends_on: - redis - frequency - - graph-service-base networks: - graph-service restart: on-failure worker: - image: graph-service:latest + image: graph-service-dev:latest pull_policy: never - command: ["npm", "run", "start:worker:watch"] - env_file: - - .env.docker.dev + environment: + <<: [*graph-service-environment] volumes: - ./:/app depends_on: diff --git a/graph-webhooks.openapi.yaml b/graph-webhooks.openapi.yaml new file mode 100644 index 00000000..9413acae --- /dev/null +++ b/graph-webhooks.openapi.yaml @@ -0,0 +1,139 @@ +--- +# +# Define webhook API for Graph Service. The nestjs/swagger package does not +# support auto-generation of webhooks, or types that are not part of controller +# endpoints. +# These interface types at inception match the interfaces exported by @dsnp/graph-sdk +openapi: 3.1.0 +info: + title: Graph Service Webhooks API + version: 1.0.0 +webhooks: + graph-update: + post: + summary: Announce a graph update + operationId: announceGraphUpdate + requestBody: + required: true + content: + application/json: + schema: + '$ref': '#/components/schemas/GraphChangeNotification' + responses: + '200': + description: Graph update announcement handled + '400': + description: Bad request +components: + schemas: + Uint8Array: + type: object + properties: {} + PersistPageUpdate: + type: object + properties: + type: + title: type + enum: + - PersistPage + type: string + ownerDsnpUserId: + type: string + description: MSA of graph owner + example: '2' + schemaId: + type: number + description: Schema ID of graph schema + example: 8 + pageId: + type: number + description: Page ID of graph page being updated + example: 1 + prevHash: + type: number + description: Content hash of last known state of graph page + example: 1234567 + payload: + description: Byte array of graph page data + allOf: + - '$ref': '#/components/schemas/Uint8Array' + required: + - type + - ownerDsnpUserId + - schemaId + - pageId + - prevHash + - payload + DeletePageUpdate: + type: object + properties: + type: + title: type + enum: + - DeletePage + type: string + ownerDsnpUserId: + type: string + schemaId: + type: number + pageId: + type: number + prevHash: + type: number + required: + - type + - ownerDsnpUserId + - schemaId + - pageId + - prevHash + AddKeyUpdate: + type: object + properties: + type: + title: type + enum: + - AddKey + type: string + ownerDsnpUserId: + type: string + prevHash: + type: number + required: + - type + - ownerDsnpUserId + - prevHash + GraphChangeNotification: + type: object + properties: + msaId: + type: string + description: MSA ID for which this notification is being sent + example: '2' + update: + description: The payload of the specific update. Content depends on the + type of update (Add, Delete, Persist) + oneOf: + - '$ref': '#/components/schemas/PersistPageUpdate' + - '$ref': '#/components/schemas/DeletePageUpdate' + - '$ref': '#/components/schemas/AddKeyUpdate' + required: + - msaId + - update + GraphOperationStatus: + type: object + properties: + referenceId: + type: string + description: Job reference ID of a previously submitted graph update request + example: 'Lve95gjOVATpfV8EL5X4nxwjKHE' + status: + title: status + enum: + - pending + - expired + - failed + - succeeded + type: string + required: + - referenceId + - status diff --git a/libs/common/src/dtos/graph-change-notification.dto.ts b/libs/common/src/dtos/graph-change-notification.dto.ts deleted file mode 100644 index 292317ab..00000000 --- a/libs/common/src/dtos/graph-change-notification.dto.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { AddKeyUpdate, DeletePageUpdate, PersistPageUpdate, Update } from '@dsnp/graph-sdk'; -import { ApiProperty } from '@nestjs/swagger'; - -export class PersistPageUpdateDto implements PersistPageUpdate { - type: 'PersistPage'; - ownerDsnpUserId: string; - schemaId: number; - pageId: number; - prevHash: number; - payload: Uint8Array; -} -export class DeletePageUpdateDto implements DeletePageUpdate { - type: 'DeletePage'; - ownerDsnpUserId: string; - schemaId: number; - pageId: number; - prevHash: number; -} -export class AddKeyUpdateDto implements AddKeyUpdate { - type: 'AddKey'; - ownerDsnpUserId: string; - prevHash: number; - payload: Uint8Array; -} - -export class GraphChangeNotificationDto { - @ApiProperty({ description: 'MSA ID for which this notification is being sent', type: String, example: '2' }) - dsnpId: string; - - @ApiProperty({ - description: 'The payload of the specific update. Content depends on the type of update (Add, Delete, Persist)', - oneOf: [{ type: 'PersistPageUpdateDto' }, { type: 'DeletePageUpdateDto' }, { type: 'AddKeyUpdateDto' }], - }) - update: Update; -} diff --git a/libs/common/src/dtos/graph.update.job.ts b/libs/common/src/dtos/graph.update.job.ts index bd6de9d5..5553e8cf 100644 --- a/libs/common/src/dtos/graph.update.job.ts +++ b/libs/common/src/dtos/graph.update.job.ts @@ -4,4 +4,6 @@ export class GraphUpdateJob { referenceId: string; update: Update; + + webhookUrl?: string; } diff --git a/libs/common/src/dtos/index.ts b/libs/common/src/dtos/index.ts index e8041860..a37a31d4 100644 --- a/libs/common/src/dtos/index.ts +++ b/libs/common/src/dtos/index.ts @@ -2,7 +2,6 @@ export * from './connection-type.enum'; export * from './connection.dto'; export * from './direction.enum'; export * from './dsnp-graph-edge.dto'; -export * from './graph-change-notification.dto'; export * from './graph-change-response.dto'; export * from './graph-key-pair.dto'; export * from './graph-query-params.dto'; diff --git a/libs/common/src/dtos/provider-graph.dto.ts b/libs/common/src/dtos/provider-graph.dto.ts index f0688a61..9857845f 100644 --- a/libs/common/src/dtos/provider-graph.dto.ts +++ b/libs/common/src/dtos/provider-graph.dto.ts @@ -1,4 +1,4 @@ -import { IsArray, IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { IsArray, IsNotEmpty, IsOptional, IsString, IsUrl } from 'class-validator'; import { Type } from 'class-transformer'; import { GraphKeyPairDto } from './graph-key-pair.dto'; import { ConnectionDto, ConnectionDtoWrapper } from './connection.dto'; @@ -23,4 +23,9 @@ export class ProviderGraphDto { @IsOptional() @ApiPropertyOptional({ description: 'Optional array of graph encryption keypairs decrypting/encrypting the above-referenced users private graph', type: [GraphKeyPairDto] }) graphKeyPairs?: GraphKeyPairDto[]; + + @IsUrl({ require_tld: false }) + @IsOptional() + @ApiPropertyOptional({ description: 'Optional URL of a webhook to invoke when the request is complete', type: String }) + webhookUrl?: string; } diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/libs/common/src/dtos/watch-graphs.dto.ts index f4b8c58c..d071caf7 100644 --- a/libs/common/src/dtos/watch-graphs.dto.ts +++ b/libs/common/src/dtos/watch-graphs.dto.ts @@ -5,7 +5,7 @@ export class WatchGraphsDto { @IsOptional() @IsArray() @IsNumberString({ no_symbols: true }, { each: true }) - @ApiProperty({ description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5'] }) + @ApiProperty({ required: false, description: 'MSA IDs for which to watch for graph updates', type: [String], example: ['2', '3', '4', '5'] }) dsnpIds?: string[]; @IsNotEmpty() diff --git a/libs/common/src/interfaces/provider.graph.update-job.interface.ts b/libs/common/src/interfaces/provider.graph.update-job.interface.ts index aab4ca19..279de8e6 100644 --- a/libs/common/src/interfaces/provider.graph.update-job.interface.ts +++ b/libs/common/src/interfaces/provider.graph.update-job.interface.ts @@ -13,4 +13,6 @@ export class ProviderGraphUpdateJob { graphKeyPairs?: GraphKeyPairDto[]; updateConnection: boolean; + + webhookUrl?: string; } diff --git a/libs/common/src/types/index.ts b/libs/common/src/types/index.ts new file mode 100644 index 00000000..a25f1ad8 --- /dev/null +++ b/libs/common/src/types/index.ts @@ -0,0 +1 @@ +export * from './webhook-types.d'; diff --git a/libs/common/src/types/webhook-types.d.ts b/libs/common/src/types/webhook-types.d.ts new file mode 100644 index 00000000..70d33978 --- /dev/null +++ b/libs/common/src/types/webhook-types.d.ts @@ -0,0 +1,91 @@ +import type { OpenAPIClient, Parameters, UnknownParamsObject, OperationResponse, AxiosRequestConfig } from 'openapi-client-axios'; + +declare namespace Components { + namespace Schemas { + export interface AddKeyUpdate { + /** + * type + */ + type: 'AddKey'; + ownerDsnpUserId: string; + prevHash: number; + } + export interface DeletePageUpdate { + /** + * type + */ + type: 'DeletePage'; + ownerDsnpUserId: string; + schemaId: number; + pageId: number; + prevHash: number; + } + export interface GraphChangeNotification { + /** + * MSA ID for which this notification is being sent + * example: + * 2 + */ + msaId: string; + /** + * The payload of the specific update. Content depends on the type of update (Add, Delete, Persist) + */ + update: /* The payload of the specific update. Content depends on the type of update (Add, Delete, Persist) */ PersistPageUpdate | DeletePageUpdate | AddKeyUpdate; + } + export interface GraphOperationStatus { + /** + * Job reference ID of a previously submitted graph update request + * example: + * Lve95gjOVATpfV8EL5X4nxwjKHE + */ + referenceId: string; + /** + * status + */ + status: 'pending' | 'expired' | 'failed' | 'succeeded'; + } + export interface PersistPageUpdate { + /** + * type + */ + type: 'PersistPage'; + /** + * MSA of graph owner + * example: + * 2 + */ + ownerDsnpUserId: string; + /** + * Schema ID of graph schema + * example: + * 8 + */ + schemaId: number; + /** + * Page ID of graph page being updated + * example: + * 1 + */ + pageId: number; + /** + * Content hash of last known state of graph page + * example: + * 1234567 + */ + prevHash: number; + /** + * Byte array of graph page data + */ + payload: { + [key: string]: any; + }; + } + export interface Uint8Array {} + } +} + +export interface OperationMethods {} + +export interface PathsDictionary {} + +export type Client = OpenAPIClient; diff --git a/package-lock.json b/package-lock.json index 27e83d30..0e6b7d82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,6 +61,7 @@ "ioredis-mock": "^8.9.0", "jest": "^29.7.0", "license-report": "^6.5.0", + "openapi-client-axios-typegen": "^7.6.2", "prettier": "^3.2.5", "supertest": "^7.0.0", "ts-jest": "^29.1.2", @@ -271,6 +272,87 @@ "node": ">=0.12.0" } }, + "node_modules/@anttiviljami/dtsgenerator": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@anttiviljami/dtsgenerator/-/dtsgenerator-3.20.0.tgz", + "integrity": "sha512-b90uOx7/dC53mo8fHfXXz3Iy20nLkIaZXBZt6RwPzxMll9MZTG5rVkJdy74vxw9ngmnrtC8Z4elmGgNA2aeTIA==", + "dev": true, + "dependencies": { + "commander": "^11.1.0", + "cross-fetch": "^4.0.0", + "debug": "^4.3.4", + "glob": "^10.3.10", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.2", + "typescript": "^5.2.2" + }, + "bin": { + "dtsgen": "bin/dtsgen" + }, + "engines": { + "node": ">= 18.0" + } + }, + "node_modules/@anttiviljami/dtsgenerator/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@anttiviljami/dtsgenerator/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@anttiviljami/dtsgenerator/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@anttiviljami/dtsgenerator/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.6.4", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.4.tgz", + "integrity": "sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@assemblyscript/loader": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", @@ -2928,6 +3010,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, "node_modules/@kessler/tableify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@kessler/tableify/-/tableify-1.0.2.tgz", @@ -5734,6 +5822,41 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -6065,6 +6188,12 @@ } ] }, + "node_modules/bath-es5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz", + "integrity": "sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg==", + "dev": true + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -7074,6 +7203,12 @@ "node": ">= 0.8" } }, + "node_modules/dereference-json-schema": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dereference-json-schema/-/dereference-json-schema-0.2.1.tgz", + "integrity": "sha512-uzJsrg225owJyRQ8FNTPHIuBOdSzIZlHhss9u6W8mp7jJldHqGuLv9cULagP/E26QVJDnjtG8U7Dw139mM1ydA==", + "dev": true + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -8533,6 +8668,42 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -8546,6 +8717,42 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -10793,6 +11000,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-client-axios": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/openapi-client-axios/-/openapi-client-axios-7.5.5.tgz", + "integrity": "sha512-pgCo1z+rxtYmGQXzB+N5DiXvRurTP6JqV+Ao/wtaGUMIIIM+znh3nTztps+FZS8mZgWnDHpdEzL9bWtZuWuvoA==", + "dev": true, + "dependencies": { + "bath-es5": "^3.0.3", + "dereference-json-schema": "^0.2.1", + "openapi-types": "^12.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/anttiviljami" + }, + "peerDependencies": { + "axios": ">=0.25.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/openapi-client-axios-typegen": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/openapi-client-axios-typegen/-/openapi-client-axios-typegen-7.6.2.tgz", + "integrity": "sha512-92iJbnKKA+F/qS7YhBsQFtgnu4WqLXYGlGo9zSVZxmDbzMM8ujtMEy+l8dPBLus73qXYj3dW1MDQ9uKvc4l/aQ==", + "dev": true, + "dependencies": { + "@anttiviljami/dtsgenerator": "^3.20.0", + "@apidevtools/json-schema-ref-parser": "^11.2.0", + "axios": ">=0.25.0", + "indent-string": "^4.0.0", + "lodash": "^4.17.21", + "openapi-client-axios": "^7.5.5", + "openapi-types": "^12.1.0", + "yargs": "^17.3.0" + }, + "bin": { + "typegen": "typegen" + }, + "funding": { + "url": "https://github.com/sponsors/anttiviljami" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", diff --git a/package.json b/package.json index 47c6aae8..1000f9d7 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build:swagger": "npx ts-node -r tsconfig-paths/register apps/api/src/build-openapi.ts", "build:metadata": "npx ts-node apps/api/src/generate-metadata.ts", "generate-swagger-ui": "npx --yes @redocly/cli build-docs swagger.json --output=./docs/index.html", + "generate-webhook-types": "npx openapi-client-axios-typegen graph-webhooks.openapi.yaml > libs/common/src/types/webhook-types.d.ts", "start:api": "nest start api", "start:api:watch": "nest start api --watch", "start:api:prod": "node dist/apps/api/main.js", @@ -92,6 +93,7 @@ "ioredis-mock": "^8.9.0", "jest": "^29.7.0", "license-report": "^6.5.0", + "openapi-client-axios-typegen": "^7.6.2", "prettier": "^3.2.5", "supertest": "^7.0.0", "ts-jest": "^29.1.2", @@ -138,6 +140,7 @@ "^#lib/dtos(|/.*)$": "/libs/common/src/dtos/$1", "^#lib/interfaces(|/.*)$": "/libs/common/src/interfaces/$1", "^#lib/services(|/.*)$": "/libs/common/src/services/$1", + "^#lib/types(|/.*)$": "/libs/common/src/types/$1", "^#lib/utils(|/.*)$": "/libs/common/src/utils/$1" } } diff --git a/scripts/run-e2e.sh b/scripts/run-e2e.sh new file mode 100755 index 00000000..aa3cca97 --- /dev/null +++ b/scripts/run-e2e.sh @@ -0,0 +1,22 @@ +#!/bin/bash + + export COMPOSE_PROJECT_NAME=graph-service-e2e + +# Clear existing volumes + docker volume rm ${COMPOSE_PROJECT_NAME}_redis_data 2>/dev/null + docker volume rm ${COMPOSE_PROJECT_NAME}_chainstorage 2>/dev/null + +# Start chain & cache +docker compose up -d frequency redis + +# Initialize chain +npm run chain-setup + +# Start API +docker compose up -d api + +# Run E2E tests +npm run test:e2e + +# Stop containers +docker compose down diff --git a/swagger.json b/swagger.json index a28d7e30..5bb3bef5 100644 --- a/swagger.json +++ b/swagger.json @@ -483,6 +483,10 @@ "items": { "$ref": "#/components/schemas/GraphKeyPairDto" } + }, + "webhookUrl": { + "type": "string", + "description": "Optional URL of a webhook to invoke when the request is complete" } }, "required": [ @@ -525,7 +529,6 @@ } }, "required": [ - "dsnpIds", "webhookEndpoint" ] } diff --git a/test-setup/main.ts b/test-setup/main.ts index cd547ff2..da5c68b6 100644 --- a/test-setup/main.ts +++ b/test-setup/main.ts @@ -1,18 +1,97 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import log from 'loglevel'; +import { + initialize, + provisionProvider, + ensureProviderStake, + ChainUser, + initializeLocalUsers, + SchemaBuilder, + provisionLocalUserCreationExtrinsics, + provisionUserGraphResets, + provisionUserGraphEncryptionKeys, + ChainEventHandler, + ExtrinsicHelper, + provisionUsersOnChain, +} from '@amplica-labs/frequency-scenario-template'; import { cryptoWaitReady } from '@polkadot/util-crypto'; -import { initialize, provisionProvider, initializeLocalUsers, ExtrinsicHelper } from '@amplica-labs/frequency-scenario-template'; +import { EnvironmentType, Graph, ImportBundleBuilder } from '@dsnp/graph-sdk'; -const BASE_SEED_PHRASE = process.env.PROVIDER_SEED_PHRASE || '//Alice'; -const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://0.0.0.0:9944'; +const FREQUENCY_URL = process.env.FREQUENCY_URL || 'ws://127.0.0.1:9944'; -async function setup() { +const CAPACITY_AMOUNT_TO_STAKE = 2000000000000000n; + +const BASE_SEED_PHRASE = process.env.SEED_PHRASE || '//Alice'; + +async function main() { await cryptoWaitReady(); + console.log('Connecting...'); await initialize(FREQUENCY_URL); + log.setLevel('trace'); + + // Create provider + console.log('Creating/resolving provider...'); + const provider = await provisionProvider(`${BASE_SEED_PHRASE}`, 'Alice'); + console.log(`Provider ID is: ${provider.msaId!.toString()}`); + + // Ensure provider is staked + await ensureProviderStake(provider.keypair, CAPACITY_AMOUNT_TO_STAKE, provider.msaId!); + + // Delegations + const delegators: ChainUser[] = await initializeLocalUsers(`${BASE_SEED_PHRASE}//users`, 256); + + const builder = new SchemaBuilder().withAutoDetectExistingSchema(); + const updateSchema = await builder.withName('dsnp', 'update').resolve(); + const publicKeySchema = await builder.withName('dsnp', 'public-key-key-agreement').resolve(); + const publicFollowsSchema = await builder.withName('dsnp', 'public-follows').resolve(); + const privateFollowsSchema = await builder.withName('dsnp', 'private-follows').resolve(); + const privateConnectionsSchema = await builder.withName('dsnp', 'private-connections').resolve(); + + const schemaIds = [ + updateSchema!.id.toNumber(), + publicKeySchema!.id.toNumber(), + publicFollowsSchema!.id.toNumber(), + privateFollowsSchema!.id.toNumber(), + privateConnectionsSchema!.id.toNumber(), + ]; + + // Create followers + await provisionLocalUserCreationExtrinsics(provider, [...delegators.values()], { schemaIds, allocateHandle: false }); + await provisionUserGraphResets([...delegators.values()]); + await provisionUserGraphEncryptionKeys([...delegators.values()], true); + const eventHandler: ChainEventHandler = (events) => { + events.forEach((eventRecord) => { + const { event } = eventRecord; + if (event && ExtrinsicHelper.apiPromise.events.msa.MsaCreated.is(event)) { + const { msaId, key } = event.data; + const address = key.toString(); + const delegator = delegators.find((d) => d.keypair.address === address); + if (delegator) { + delegator.msaId = msaId; + } else { + console.error('Cannot find delegator ', address); + } + } + }); + }; + + await provisionUsersOnChain(provider.keypair, [...delegators.values()], [eventHandler]); - // Get keys and MSA IDs for users provisioned in setup - await provisionProvider(BASE_SEED_PHRASE, 'Alice'); - await initializeLocalUsers(`${BASE_SEED_PHRASE}//users`, 4); + console.log(`Created Provider ${provider.msaId?.toString()} as Alice`); + console.log( + 'Created delegated MSAs: ', + delegators.map((d) => d.msaId!.toString()), + ); - await ExtrinsicHelper.disconnect(); + const graph: Graph = new Graph({ environmentType: EnvironmentType.Mainnet }); + graph.applyActions([{ type: 'Connect', ownerDsnpUserId: delegators[0].msaId!.toString(), connection: { dsnpUserId: delegators[1].msaId!.toString(), schemaId: publicFollowsSchema!.id.toNumber() }}]); + const exportBundles = graph.exportUpdates(); + console.log('Setup complete'); } -setup().catch((err) => console.log(err)); +main() + .catch((r) => { + console.error(r); + process.exit(1); + }) + .finally(process.exit); diff --git a/tsconfig.json b/tsconfig.json index 7c07e09a..9adb9b0f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -59,6 +59,12 @@ "#lib/services/*": [ "libs/common/src/services/*" ], + "#lib/types": [ + "libs/common/src/types" + ], + "#lib/types/*": [ + "libs/common/src/types/*" + ], "#lib/utils": [ "libs/common/src/utils" ], From 47e3e2afd121ba33e49c22bd8d00c4930ba9f204 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:09:54 -0400 Subject: [PATCH 49/53] Bump typescript-eslint from 7.9.0 to 7.16.1 (#120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 7.9.0 to 7.16.1.
Release notes

Sourced from typescript-eslint's releases.

v7.16.1

7.16.1 (2024-07-15)

🩹 Fixes

  • eslint-plugin: [no-unnecessary-type-parameters] descend into all parts of mapped types in no-unnecessary-type-parameters (#9530)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

v7.16.0

7.16.0 (2024-07-08)

🚀 Features

  • ast-spec: add parent property to AccessorProperty node types (#9487)
  • eslint-plugin: [no-unnecessary-type-parameters] port from v8 to v7 (#9473)
  • eslint-plugin: [no-unnecessary-parameter-property-assignment] add new rule (#8903)
  • eslint-plugin: add support for nested namespaces to unsafe-member-access (#9478)
  • eslint-plugin: [no-floating-promises] add checkThenables option (#9263)
  • rule-tester: stricter rule test validations (#9086)

🩹 Fixes

  • deps: update dependency @​eslint-community/regexpp to v4.11.0 (#9497)
  • eslint-plugin: [no-floating-promises] add suggestions to tests from #9263 checkThenables (#9515, #9263)
  • eslint-plugin: [restrict-template-expressions] don't report tuples if allowArray option is enabled (#9492)
  • utils: context.parserPath may be undefined (#9486)
  • website: react key error on internal pages of website (#9506)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

v7.15.0

7.15.0 (2024-07-01)

... (truncated)

Changelog

Sourced from typescript-eslint's changelog.

7.16.1 (2024-07-15)

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

You can read about our versioning strategy and releases on our website.

7.16.0 (2024-07-08)

🚀 Features

  • eslint-plugin: [no-unnecessary-parameter-property-assignment] add new rule

🩹 Fixes

  • deps: update dependency @​eslint-community/regexpp to v4.11.0

  • website: react key error on internal pages of website

❤️ Thank You

  • Abraham Guo
  • auvred
  • Josh Goldberg ✨
  • Juan Sanchez
  • Vinccool96
  • YeonJuan
  • Yukihiro Hasegawa

You can read about our versioning strategy and releases on our website.

7.15.0 (2024-07-01)

🚀 Features

  • eslint-plugin: back-port new rules around empty object types from v8

🩹 Fixes

  • disable EXPERIMENTAL_useProjectService in disabled-type-checked shared config

❤️ Thank You

  • auvred
  • Kim Sang Du

... (truncated)

Commits
  • d1d0ba5 chore(release): publish 7.16.1
  • e803c50 chore(release): publish 7.16.0
  • 451e738 feat(eslint-plugin): [no-unnecessary-parameter-property-assignment] add new r...
  • 88dd828 feat(eslint-plugin): [no-unnecessary-type-parameters] port from v8 to v7 (#9473)
  • 2865d31 chore(release): publish 7.15.0
  • 2671de5 feat(eslint-plugin): back-port new rules around empty object types from v8 (#...
  • a466e07 fix: disable EXPERIMENTAL_useProjectService in disabled-type-checked shar...
  • b4fe94f chore(release): publish 7.14.1
  • dfc4469 chore(release): publish 7.14.0
  • 1212a8f chore(release): publish 7.13.1
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript-eslint&package-manager=npm_and_yarn&previous-version=7.9.0&new-version=7.16.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 116 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e6b7d82..710dd7d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,7 @@ "tsconfig-paths": "^4.2.0", "tsx": "^4.15.7", "typescript": "^5.4.5", - "typescript-eslint": "^7.8.0" + "typescript-eslint": "^7.16.1" } }, "node_modules/@amplica-labs/frequency-scenario-template": { @@ -5350,16 +5350,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", - "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", + "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/type-utils": "7.9.0", - "@typescript-eslint/utils": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/type-utils": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -5383,15 +5383,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", - "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", + "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4" }, "engines": { @@ -5434,13 +5434,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", - "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", + "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0" + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5451,13 +5451,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", - "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", + "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/utils": "7.16.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -5478,9 +5478,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -5501,9 +5501,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5514,13 +5514,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", - "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5551,9 +5551,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -5568,9 +5568,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5589,15 +5589,15 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", - "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", + "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0" + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5611,12 +5611,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", + "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/types": "7.16.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -13316,14 +13316,14 @@ } }, "node_modules/typescript-eslint": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.9.0.tgz", - "integrity": "sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.16.1.tgz", + "integrity": "sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "7.9.0", - "@typescript-eslint/parser": "7.9.0", - "@typescript-eslint/utils": "7.9.0" + "@typescript-eslint/eslint-plugin": "7.16.1", + "@typescript-eslint/parser": "7.16.1", + "@typescript-eslint/utils": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" diff --git a/package.json b/package.json index 1000f9d7..a3aceff9 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "tsconfig-paths": "^4.2.0", "tsx": "^4.15.7", "typescript": "^5.4.5", - "typescript-eslint": "^7.8.0" + "typescript-eslint": "^7.16.1" }, "jest": { "moduleFileExtensions": [ From 743da34c1b5df0bbffd0400a721607f4f31985c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:12:51 -0400 Subject: [PATCH 50/53] Bump @nestjs/cli from 10.3.2 to 10.4.2 (#107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@nestjs/cli](https://github.com/nestjs/nest-cli) from 10.3.2 to 10.4.2.
Release notes

Sourced from @​nestjs/cli's releases.

Release 10.4.2

  • Merge pull request #2627 from micalevisk/fix-issue-2421 (952da4bb)
  • Merge pull request #2630 from micalevisk/fix-issue-2629 (682e7dd7)
  • fix: npm-script clean not working due to missing dependency (b5dba00d)
  • chore(deps): remove source-map-support hard dependency (5dafd628)
  • feat: drop 'source-map-support' injection in favor of nodejs flag (d857d9b6)
  • chore(deps): update dependency @​swc/core to v1.6.7 (d87405a0)
  • refactor: remove redundand try-catch block (f48ce24d)
  • style: fix formatting (b59436a2)
  • fix: do not ignoring webpack config loading errors (285980e4)
  • Merge pull request #2624 from nestjs/revert-2622-renovate/typescript-5.x (28bbb723)
  • Revert "fix(deps): update dependency typescript to v5.5.3" (4961cc4a)

Release 10.4.1

  • Merge pull request #2622 from nestjs/renovate/typescript-5.x (0abced2f)
  • Merge pull request #2620 from nestjs/renovate/nest-monorepo (f8fe10e6)
  • Merge pull request #2623 from micalevisk/less-confusing-missing-packages-error-msg (f9f9d4cd)
  • fix(deps): update dependency typescript to v5.5.3 (40ab797e)
  • chore(deps): update typescript-eslint monorepo to v7.15.0 (a97ab8ef)
  • fix(deps): update dependency @​nestjs/schematics to v10.1.2 (bc7a9f3e)
  • feat: less verbose 'missing packages' error message (f16f5b93)

Release 10.4.0

  • Merge pull request #2618 from nestjs/renovate/release-it-17.x (d37735f7)
  • Merge pull request #2619 from nestjs/renovate/swc-monorepo (aa4f52d0)
  • chore(deps): update swc monorepo (eb9284f9)
  • chore(deps): update dependency release-it to v17.4.1 (dc42ddd1)
  • Merge pull request #2553 from CustomEntity/fix-assets-copying (38128523)
  • Merge pull request #2616 from nestjs/renovate/node-20.x (ad18939c)
  • Merge pull request #2617 from nestjs/renovate/prettier-3.x (c592de30)
  • chore(deps): update dependency prettier to v3.3.2 (3e693cf8)
  • chore(deps): update dependency @​types/node to v20.14.9 (f8e28028)
  • Merge branch 'Phillip9587-remove-shelljs' (8c2523b3)
  • chore: resolve conflicts (2f2acdfc)
  • Merge pull request #2525 from Phillip9587/replace-rimraf (7dacbd00)
  • Merge pull request #2614 from nestjs/renovate/lint-staged-15.x (252f7ee6)
  • Merge pull request #2615 from nestjs/renovate/ts-jest-29.x (bd5440bc)
  • chore(deps): update dependency ts-jest to v29.1.5 (53f5a635)
  • chore(deps): update dependency lint-staged to v15.2.7 (c2b97aa2)
  • chore(deps): revert typescript version (81b026b7)
  • Merge pull request #2515 from nestjs/renovate/webpack-5.x (ca931383)
  • fix(deps): update dependency webpack to v5.92.1 (fc676632)
  • Merge pull request #2504 from nestjs/renovate/nest-monorepo (6fcb954e)
  • Merge pull request #2505 from nestjs/renovate/angular-cli-monorepo (829a8782)
  • Merge pull request #2537 from nestjs/renovate/typescript-5.x (71de177e)
  • Merge pull request #2552 from nestjs/renovate/cli-table3-0.x (6bcb9c79)
  • Merge pull request #2559 from nestjs/renovate/glob-10.x (cdf44bfa)
  • Merge pull request #2588 from nestjs/renovate/cimg-node-22.x (e5ddd706)
  • fix(deps): update dependency typescript to v5.5.3 (e89998a1)
  • chore(deps): update node.js to v22 (844874b1)

... (truncated)

Commits
  • 8824eb2 chore(): release v10.4.2
  • 952da4b Merge pull request #2627 from micalevisk/fix-issue-2421
  • 682e7dd Merge pull request #2630 from micalevisk/fix-issue-2629
  • b5dba00 fix: npm-script clean not working due to missing dependency
  • 5dafd62 chore(deps): remove source-map-support hard dependency
  • d857d9b feat: drop 'source-map-support' injection in favor of nodejs flag
  • d87405a chore(deps): update dependency @​swc/core to v1.6.7
  • f48ce24 refactor: remove redundand try-catch block
  • b59436a style: fix formatting
  • 285980e fix: do not ignoring webpack config loading errors
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@nestjs/cli&package-manager=npm_and_yarn&previous-version=10.3.2&new-version=10.4.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 465 +++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 194 insertions(+), 273 deletions(-) diff --git a/package-lock.json b/package-lock.json index 710dd7d6..6e34b0c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@frequency-chain/api-augment": "1.11.1", "@multiformats/blake2": "^1.0.13", "@nestjs/bullmq": "^10.1.1", - "@nestjs/cli": "^10.3.2", + "@nestjs/cli": "^10.4.2", "@nestjs/common": "^10.3.8", "@nestjs/config": "^3.2.2", "@nestjs/core": "^10.3.8", @@ -155,14 +155,14 @@ } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.1.2.tgz", - "integrity": "sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.3.8.tgz", + "integrity": "sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==", "dependencies": { - "@angular-devkit/core": "17.1.2", - "@angular-devkit/schematics": "17.1.2", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", "ansi-colors": "4.1.3", - "inquirer": "9.2.12", + "inquirer": "9.2.15", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, @@ -175,6 +175,49 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -194,44 +237,18 @@ "node": ">= 12" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular-devkit/schematics-cli/node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", - "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", "dependencies": { - "@ljharb/through": "^2.3.11", + "@ljharb/through": "^2.3.12", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", - "figures": "^5.0.0", + "figures": "^3.2.0", "lodash": "^4.17.21", "mute-stream": "1.0.0", "ora": "^5.4.1", @@ -242,18 +259,23 @@ "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/@angular-devkit/schematics-cli/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@angular-devkit/schematics-cli/node_modules/mute-stream": { @@ -264,6 +286,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@angular-devkit/schematics-cli/node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", @@ -3159,31 +3192,28 @@ } }, "node_modules/@nestjs/cli": { - "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.3.2.tgz", - "integrity": "sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.2.tgz", + "integrity": "sha512-fQexIfLHfp6GUgX+CO4fOg+AEwV5ox/LHotQhyZi9wXUQDyIqS0NTTbumr//62EcX35qV4nU0359nYnuEdzG+A==", "dependencies": { - "@angular-devkit/core": "17.1.2", - "@angular-devkit/schematics": "17.1.2", - "@angular-devkit/schematics-cli": "17.1.2", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "@angular-devkit/schematics-cli": "17.3.8", "@nestjs/schematics": "^10.0.1", "chalk": "4.1.2", "chokidar": "3.6.0", - "cli-table3": "0.6.3", + "cli-table3": "0.6.5", "commander": "4.1.1", "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.3.10", + "glob": "10.4.2", "inquirer": "8.2.6", "node-emoji": "1.11.0", "ora": "5.4.1", - "rimraf": "4.4.1", - "shelljs": "0.8.5", - "source-map-support": "0.5.21", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", "typescript": "5.3.3", - "webpack": "5.90.1", + "webpack": "5.92.1", "webpack-node-externals": "3.0.0" }, "bin": { @@ -3193,7 +3223,7 @@ "node": ">= 16.14" }, "peerDependencies": { - "@swc/cli": "^0.1.62 || ^0.3.0", + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0", "@swc/core": "^1.3.62" }, "peerDependenciesMeta": { @@ -3205,24 +3235,74 @@ } } }, - "node_modules/@nestjs/cli/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/@nestjs/cli/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": ">=8.0.0" + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@nestjs/cli/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@nestjs/cli/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=4.0" + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/cli/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, + "node_modules/@nestjs/cli/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nestjs/cli/node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@nestjs/cli/node_modules/typescript": { @@ -3237,52 +3317,6 @@ "node": ">=14.17" } }, - "node_modules/@nestjs/cli/node_modules/webpack": { - "version": "5.90.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", - "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/@nestjs/common": { "version": "10.3.8", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.8.tgz", @@ -5797,10 +5831,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "peerDependencies": { "acorn": "^8" } @@ -6685,9 +6719,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dependencies": { "string-width": "^4.2.0" }, @@ -7361,9 +7395,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", - "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8274,7 +8308,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -8376,21 +8411,22 @@ } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8856,6 +8892,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8913,14 +8950,6 @@ "multihashes": "^4.0.2" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/ioredis": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", @@ -9329,15 +9358,12 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -10593,9 +10619,9 @@ } }, "node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -10982,6 +11008,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -11150,6 +11177,11 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -11203,6 +11235,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11809,17 +11842,6 @@ "node": ">= 0.8.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -12001,70 +12023,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -12291,41 +12249,6 @@ "node": ">=8" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -13559,10 +13482,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "peer": true, + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -13570,10 +13492,10 @@ "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -13625,7 +13547,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -13638,7 +13559,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true, "engines": { "node": ">=4.0" } @@ -13708,7 +13628,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/write-file-atomic": { "version": "4.0.2", diff --git a/package.json b/package.json index a3aceff9..47a47581 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@frequency-chain/api-augment": "1.11.1", "@multiformats/blake2": "^1.0.13", "@nestjs/bullmq": "^10.1.1", - "@nestjs/cli": "^10.3.2", + "@nestjs/cli": "^10.4.2", "@nestjs/common": "^10.3.8", "@nestjs/config": "^3.2.2", "@nestjs/core": "^10.3.8", From 1cedd65563faf870d29ce255e512c55e9c08b03a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:15:24 -0400 Subject: [PATCH 51/53] Bump @nestjs/testing from 10.3.8 to 10.3.10 (#110) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@nestjs/testing](https://github.com/nestjs/nest/tree/HEAD/packages/testing) from 10.3.8 to 10.3.10.
Release notes

Sourced from @​nestjs/testing's releases.

v10.3.10 (2024-07-01)

Bug fixes

Enhancements

  • platform-fastify

Dependencies

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@nestjs/testing&package-manager=npm_and_yarn&previous-version=10.3.8&new-version=10.3.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 +++++++++++----- package.json | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e34b0c8..d4cc68ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "devDependencies": { "@amplica-labs/frequency-scenario-template": "^1.1.4", "@jest/globals": "^29.7.0", - "@nestjs/testing": "^10.3.8", + "@nestjs/testing": "^10.3.10", "@types/express": "^4.17.21", "@types/jest": "^29.5.12", "@types/node": "^20.12.10", @@ -3514,12 +3514,12 @@ } }, "node_modules/@nestjs/testing": { - "version": "10.3.8", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.8.tgz", - "integrity": "sha512-hpX9das2TdFTKQ4/2ojhjI6YgXtCfXRKui3A4Qaj54VVzc5+mtK502Jj18Vzji98o9MVS6skmYu+S/UvW3U6Fw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.10.tgz", + "integrity": "sha512-i3HAtVQJijxNxJq1k39aelyJlyEIBRONys7IipH/4r8W0J+M1V+y5EKDOyi4j1SdNSb/vmNyWpZ2/ewZjl3kRA==", "dev": true, "dependencies": { - "tslib": "2.6.2" + "tslib": "2.6.3" }, "funding": { "type": "opencollective", @@ -3540,6 +3540,12 @@ } } }, + "node_modules/@nestjs/testing/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, "node_modules/@noble/curves": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", diff --git a/package.json b/package.json index 47a47581..827022c5 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "devDependencies": { "@amplica-labs/frequency-scenario-template": "^1.1.4", "@jest/globals": "^29.7.0", - "@nestjs/testing": "^10.3.8", + "@nestjs/testing": "^10.3.10", "@types/express": "^4.17.21", "@types/jest": "^29.5.12", "@types/node": "^20.12.10", From bf558ee78107ef66bc7f08f254f654c3c9ba9036 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:20:33 -0400 Subject: [PATCH 52/53] Bump multiformats from 9.9.0 to 13.1.3 (#108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [multiformats](https://github.com/multiformats/js-multiformats) from 9.9.0 to 13.1.3.
Release notes

Sourced from multiformats's releases.

v13.1.3

13.1.3 (2024-07-02)

Dependencies

  • dev: bump @​stablelib/sha512 from 1.0.1 to 2.0.0 (3091935)

v13.1.2

13.1.2 (2024-07-02)

Dependencies

  • dev: bump @​stablelib/sha256 from 1.0.1 to 2.0.0 (bc7f8a5)

v13.1.1

13.1.1 (2024-06-01)

Dependencies

  • dev: bump aegir from 42.2.11 to 43.0.1 (bc14c48)

v13.1.0

13.1.0 (2024-02-15)

Features

Trivial Changes

  • Update .github/dependabot.yml [skip ci] (aa9c730)

v13.0.1

13.0.1 (2024-01-10)

Dependencies

  • dev: bump aegir from 41.3.5 to 42.1.0 (12c8686)

v13.0.0

13.0.0 (2023-12-20)

⚠ BREAKING CHANGES

... (truncated)

Changelog

Sourced from multiformats's changelog.

13.1.3 (2024-07-02)

Dependencies

  • dev: bump @​stablelib/sha512 from 1.0.1 to 2.0.0 (3091935)

13.1.2 (2024-07-02)

Dependencies

  • dev: bump @​stablelib/sha256 from 1.0.1 to 2.0.0 (bc7f8a5)

13.1.1 (2024-06-01)

Dependencies

  • dev: bump aegir from 42.2.11 to 43.0.1 (bc14c48)

13.1.0 (2024-02-15)

Features

Trivial Changes

  • Update .github/dependabot.yml [skip ci] (aa9c730)

13.0.1 (2024-01-10)

Dependencies

  • dev: bump aegir from 41.3.5 to 42.1.0 (12c8686)

13.0.0 (2023-12-20)

⚠ BREAKING CHANGES

  • this module is now TypeScript - the API has not changed but releasing as a major for saftey

Features

... (truncated)

Commits
  • 38f1046 chore(release): 13.1.3 [skip ci]
  • 3091935 deps(dev): bump @​stablelib/sha512 from 1.0.1 to 2.0.0
  • a3b2f8c chore(release): 13.1.2 [skip ci]
  • bc7f8a5 deps(dev): bump @​stablelib/sha256 from 1.0.1 to 2.0.0
  • dba6462 chore(release): 13.1.1 [skip ci]
  • bc14c48 deps(dev): bump aegir from 42.2.11 to 43.0.1
  • 5e2159a ci: uci/copy-templates (#288)
  • dcbd5d7 chore(release): 13.1.0 [skip ci]
  • e7f3272 feat: support decoding ArrayBuffers (#287)
  • aa9c730 chore: Update .github/dependabot.yml [skip ci]
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=multiformats&package-manager=npm_and_yarn&previous-version=9.9.0&new-version=13.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Joe Caputo --- .github/workflows/build.yml | 2 +- package-lock.json | 43 +++++++++++++++++++++++++++++++++---- package.json | 2 +- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8400b729..0fc774bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,4 +59,4 @@ jobs: run: npm ci - name: License Check # List all the licenses and error out if it is not one of the supported licenses - run: npx license-report --fields=name --fields=licenseType | jq 'map(select(.licenseType | IN("MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "(Apache-2.0 AND MIT)") | not)) | if length == 0 then halt else halt_error(1) end' + run: npx license-report --fields=name --fields=licenseType | jq 'map(select(.licenseType | IN("MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "(Apache-2.0 AND MIT)", "Apache-2.0 OR MIT") | not)) | if length == 0 then halt else halt_error(1) end' diff --git a/package-lock.json b/package-lock.json index d4cc68ae..cc20fc5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "ipfs-only-hash": "^4.0.0", "joi": "^17.13.1", "mime-types": "^2.1.35", - "multiformats": "9.9.0", + "multiformats": "13.1.3", "rxjs": "^7.8.1", "time-constants": "^1.0.3" }, @@ -3165,6 +3165,11 @@ "multiformats": "^9.5.4" } }, + "node_modules/@multiformats/blake2/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/@nestjs/bull-shared": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-10.1.1.tgz", @@ -6673,6 +6678,11 @@ "npm": ">=3.0.0" } }, + "node_modules/cids/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/cids/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -8571,6 +8581,11 @@ "npm": ">=6.0.0" } }, + "node_modules/hamt-sharding/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/hamt-sharding/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -10725,6 +10740,11 @@ "varint": "^6.0.0" } }, + "node_modules/multicodec/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/multicodec/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -10734,9 +10754,9 @@ } }, "node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.3.tgz", + "integrity": "sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==" }, "node_modules/multihashes": { "version": "4.0.3", @@ -10752,6 +10772,11 @@ "npm": ">=6.0.0" } }, + "node_modules/multihashes/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/multihashes/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -10782,6 +10807,11 @@ "npm": ">=6.0.0" } }, + "node_modules/multihashing-async/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/multihashing-async/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -13289,6 +13319,11 @@ "multiformats": "^9.4.2" } }, + "node_modules/uint8arrays/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", diff --git a/package.json b/package.json index 827022c5..8d930e46 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "ipfs-only-hash": "^4.0.0", "joi": "^17.13.1", "mime-types": "^2.1.35", - "multiformats": "9.9.0", + "multiformats": "13.1.3", "rxjs": "^7.8.1", "time-constants": "^1.0.3" }, From 0920871d8246204074069647f0cbd99b727c294c Mon Sep 17 00:00:00 2001 From: Wil Wade Date: Fri, 19 Jul 2024 18:56:09 +0000 Subject: [PATCH 53/53] Move Graph Service files to subdirectoy --- .env.dev | 58 ------------------ .github/dependabot.yml | 6 +- .../workflows/{build.yml => build-graph.yml} | 23 ++++--- .../common/is-full-release/action.yml | 22 ------- .github/workflows/deploy-gh-pages.yml | 51 --------------- .../{release.yml => release-graph.yml} | 19 +++--- .gitignore copy | 6 -- .dockerignore => services/graph/.dockerignore | 0 .../graph/.eslintrc.json | 0 .gitignore => services/graph/.gitignore | 0 .prettierrc => services/graph/.prettierrc | 0 .../graph/.tool-versions | 0 .../graph/.vscode}/launch.json | 0 Dockerfile => services/graph/Dockerfile | 0 .../graph/ENVIRONMENT.md | 0 LICENSE => services/graph/LICENSE | 0 Makefile => services/graph/Makefile | 0 README.md => services/graph/README.md | 0 .../graph/apps}/api/src/api.module.ts | 0 .../graph/apps}/api/src/api.service.ts | 0 .../graph/apps}/api/src/build-openapi.ts | 0 .../api/src/controllers/health.controller.ts | 0 .../src/controllers/v1/graph-v1.controller.ts | 0 .../controllers/v1/webhooks-v1.controller.ts | 0 .../graph/apps}/api/src/generate-metadata.ts | 0 {apps => services/graph/apps}/api/src/main.ts | 0 .../graph/apps}/api/src/metadata.ts | 0 .../graph/apps}/api/test/app.e2e-spec.ts | 0 .../apps}/api/test/e2e-setup.mock.spec.ts | 0 .../apps}/api/test/setup/package-lock.json | 0 .../graph/apps}/api/test/setup/package.json | 0 .../graph/apps}/api/tsconfig.app.json | 0 .../graph/apps}/worker/src/BaseConsumer.ts | 0 .../graph.monitor.processor.module.ts | 0 .../graph.monitor.processor.service.ts | 0 .../graph.publisher.processor.module.ts | 0 .../graph.publisher.processor.service.ts | 0 .../graph/apps}/worker/src/main.ts | 0 .../graph.reconnection.processor.module.ts | 0 .../graph.reconnection.processor.service.ts | 0 .../request.processor.module.ts | 0 .../request.processor.service.ts | 0 .../graph/apps}/worker/src/worker.module.ts | 0 .../graph/apps}/worker/tsconfig.app.json | 0 .../graph/dev.Dockerfile | 0 .../graph/docker-compose.yaml | 0 .../graph/docs}/graph_service_arch.drawio | 0 .../graph/docs}/graph_service_arch.drawio.png | Bin env.template => services/graph/env.template | 0 .../graph/eslint.config.mjs | 0 .../graph/graph-webhooks.openapi.yaml | 0 .../graph/k6-test}/.openapi-generator-ignore | 0 .../graph/k6-test}/.openapi-generator/FILES | 0 .../graph/k6-test}/.openapi-generator/VERSION | 0 {k6-test => services/graph/k6-test}/README.md | 0 {k6-test => services/graph/k6-test}/script.js | 0 .../src/blockchain/blockchain-constants.ts | 0 .../src/blockchain/blockchain.module.ts | 0 .../src/blockchain/blockchain.service.spec.ts | 0 .../src/blockchain/blockchain.service.ts | 0 .../common/src/blockchain/create-keys.ts | 0 .../common/src/blockchain/event-error.ts | 0 .../libs}/common/src/blockchain/extrinsic.ts | 0 .../libs}/common/src/blockchain/index.ts | 0 .../libs}/common/src/config/config.module.ts | 0 .../common/src/config/config.service.spec.ts | 0 .../libs}/common/src/config/config.service.ts | 0 .../libs}/common/src/config/env.config.ts | 0 .../graph/libs}/common/src/config/index.ts | 0 .../libs}/common/src/config/swagger_config.ts | 0 .../graph/libs}/common/src/constants.ts | 0 .../common/src/dtos/connection-type.enum.ts | 0 .../libs}/common/src/dtos/connection.dto.ts | 0 .../libs}/common/src/dtos/direction.enum.ts | 0 .../common/src/dtos/dsnp-graph-edge.dto.ts | 0 .../src/dtos/graph-change-response.dto.ts | 0 .../common/src/dtos/graph-key-pair.dto.ts | 0 .../common/src/dtos/graph-query-params.dto.ts | 0 .../common/src/dtos/graph.notifier.job.ts | 0 .../libs}/common/src/dtos/graph.update.job.ts | 0 .../graph/libs}/common/src/dtos/index.ts | 0 .../libs}/common/src/dtos/key-type.enum.ts | 0 .../common/src/dtos/privacy-type.enum.ts | 0 .../common/src/dtos/provider-graph.dto.ts | 0 .../libs}/common/src/dtos/user-graph.dto.ts | 0 .../libs}/common/src/dtos/watch-graphs.dto.ts | 0 .../graph/libs}/common/src/index.ts | 0 .../interfaces/capacity-limit.interface.ts | 0 .../interfaces/graph-update-job.interface.ts | 0 .../libs}/common/src/interfaces/index.ts | 0 .../provider.graph.update-job.interface.ts | 0 .../common/src/services/async_debouncer.ts | 0 .../services/blockchain-scanner.service.ts | 0 .../src/services/graph-state-manager.ts | 0 .../graph/libs}/common/src/services/index.ts | 0 .../common/src/services/nonce.service.ts | 0 .../src/services/provider-webhook.service.ts | 0 .../graph/libs}/common/src/types/index.ts | 0 .../libs}/common/src/types/webhook-types.d.ts | 0 .../libs}/common/src/utils/base-consumer.ts | 0 .../graph/libs}/common/src/utils/index.ts | 0 .../libs}/common/src/utils/processing.ts | 0 .../graph/libs}/common/src/utils/queues.ts | 0 .../graph/libs}/common/src/utils/redis.ts | 0 .../graph/libs}/common/tsconfig.lib.json | 0 {lua => services/graph/lua}/addToBatch.lua | 0 .../graph/lua}/incrementNonce.lua | 0 {lua => services/graph/lua}/lockBatch.lua | 0 .../graph/lua}/updateLastProcessed.lua | 0 nest-cli.json => services/graph/nest-cli.json | 0 .../graph/package-lock.json | 0 package.json => services/graph/package.json | 0 .../graph/scripts}/docker-entrypoint.sh | 0 .../graph/scripts}/run-e2e.sh | 0 swagger.json => services/graph/swagger.json | 0 .../graph/test-setup}/main.ts | 0 .../graph/tsconfig.build.json | 0 tsconfig.json => services/graph/tsconfig.json | 0 118 files changed, 26 insertions(+), 159 deletions(-) delete mode 100644 .env.dev rename .github/workflows/{build.yml => build-graph.yml} (77%) delete mode 100644 .github/workflows/common/is-full-release/action.yml delete mode 100644 .github/workflows/deploy-gh-pages.yml rename .github/workflows/{release.yml => release-graph.yml} (78%) delete mode 100644 .gitignore copy rename .dockerignore => services/graph/.dockerignore (100%) rename .eslintrc.json => services/graph/.eslintrc.json (100%) rename .gitignore => services/graph/.gitignore (100%) rename .prettierrc => services/graph/.prettierrc (100%) rename .tool-versions => services/graph/.tool-versions (100%) rename {.vscode => services/graph/.vscode}/launch.json (100%) rename Dockerfile => services/graph/Dockerfile (100%) rename ENVIRONMENT.md => services/graph/ENVIRONMENT.md (100%) rename LICENSE => services/graph/LICENSE (100%) rename Makefile => services/graph/Makefile (100%) rename README.md => services/graph/README.md (100%) rename {apps => services/graph/apps}/api/src/api.module.ts (100%) rename {apps => services/graph/apps}/api/src/api.service.ts (100%) rename {apps => services/graph/apps}/api/src/build-openapi.ts (100%) rename {apps => services/graph/apps}/api/src/controllers/health.controller.ts (100%) rename {apps => services/graph/apps}/api/src/controllers/v1/graph-v1.controller.ts (100%) rename {apps => services/graph/apps}/api/src/controllers/v1/webhooks-v1.controller.ts (100%) rename {apps => services/graph/apps}/api/src/generate-metadata.ts (100%) rename {apps => services/graph/apps}/api/src/main.ts (100%) rename {apps => services/graph/apps}/api/src/metadata.ts (100%) rename {apps => services/graph/apps}/api/test/app.e2e-spec.ts (100%) rename {apps => services/graph/apps}/api/test/e2e-setup.mock.spec.ts (100%) rename {apps => services/graph/apps}/api/test/setup/package-lock.json (100%) rename {apps => services/graph/apps}/api/test/setup/package.json (100%) rename {apps => services/graph/apps}/api/tsconfig.app.json (100%) rename {apps => services/graph/apps}/worker/src/BaseConsumer.ts (100%) rename {apps => services/graph/apps}/worker/src/graph_notifier/graph.monitor.processor.module.ts (100%) rename {apps => services/graph/apps}/worker/src/graph_notifier/graph.monitor.processor.service.ts (100%) rename {apps => services/graph/apps}/worker/src/graph_publisher/graph.publisher.processor.module.ts (100%) rename {apps => services/graph/apps}/worker/src/graph_publisher/graph.publisher.processor.service.ts (100%) rename {apps => services/graph/apps}/worker/src/main.ts (100%) rename {apps => services/graph/apps}/worker/src/reconnection_processor/graph.reconnection.processor.module.ts (100%) rename {apps => services/graph/apps}/worker/src/reconnection_processor/graph.reconnection.processor.service.ts (100%) rename {apps => services/graph/apps}/worker/src/request_processor/request.processor.module.ts (100%) rename {apps => services/graph/apps}/worker/src/request_processor/request.processor.service.ts (100%) rename {apps => services/graph/apps}/worker/src/worker.module.ts (100%) rename {apps => services/graph/apps}/worker/tsconfig.app.json (100%) rename dev.Dockerfile => services/graph/dev.Dockerfile (100%) rename docker-compose.yaml => services/graph/docker-compose.yaml (100%) rename {docs => services/graph/docs}/graph_service_arch.drawio (100%) rename {docs => services/graph/docs}/graph_service_arch.drawio.png (100%) rename env.template => services/graph/env.template (100%) rename eslint.config.mjs => services/graph/eslint.config.mjs (100%) rename graph-webhooks.openapi.yaml => services/graph/graph-webhooks.openapi.yaml (100%) rename {k6-test => services/graph/k6-test}/.openapi-generator-ignore (100%) rename {k6-test => services/graph/k6-test}/.openapi-generator/FILES (100%) rename {k6-test => services/graph/k6-test}/.openapi-generator/VERSION (100%) rename {k6-test => services/graph/k6-test}/README.md (100%) rename {k6-test => services/graph/k6-test}/script.js (100%) rename {libs => services/graph/libs}/common/src/blockchain/blockchain-constants.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/blockchain.module.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/blockchain.service.spec.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/blockchain.service.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/create-keys.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/event-error.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/extrinsic.ts (100%) rename {libs => services/graph/libs}/common/src/blockchain/index.ts (100%) rename {libs => services/graph/libs}/common/src/config/config.module.ts (100%) rename {libs => services/graph/libs}/common/src/config/config.service.spec.ts (100%) rename {libs => services/graph/libs}/common/src/config/config.service.ts (100%) rename {libs => services/graph/libs}/common/src/config/env.config.ts (100%) rename {libs => services/graph/libs}/common/src/config/index.ts (100%) rename {libs => services/graph/libs}/common/src/config/swagger_config.ts (100%) rename {libs => services/graph/libs}/common/src/constants.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/connection-type.enum.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/connection.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/direction.enum.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/dsnp-graph-edge.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/graph-change-response.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/graph-key-pair.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/graph-query-params.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/graph.notifier.job.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/graph.update.job.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/index.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/key-type.enum.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/privacy-type.enum.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/provider-graph.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/user-graph.dto.ts (100%) rename {libs => services/graph/libs}/common/src/dtos/watch-graphs.dto.ts (100%) rename {libs => services/graph/libs}/common/src/index.ts (100%) rename {libs => services/graph/libs}/common/src/interfaces/capacity-limit.interface.ts (100%) rename {libs => services/graph/libs}/common/src/interfaces/graph-update-job.interface.ts (100%) rename {libs => services/graph/libs}/common/src/interfaces/index.ts (100%) rename {libs => services/graph/libs}/common/src/interfaces/provider.graph.update-job.interface.ts (100%) rename {libs => services/graph/libs}/common/src/services/async_debouncer.ts (100%) rename {libs => services/graph/libs}/common/src/services/blockchain-scanner.service.ts (100%) rename {libs => services/graph/libs}/common/src/services/graph-state-manager.ts (100%) rename {libs => services/graph/libs}/common/src/services/index.ts (100%) rename {libs => services/graph/libs}/common/src/services/nonce.service.ts (100%) rename {libs => services/graph/libs}/common/src/services/provider-webhook.service.ts (100%) rename {libs => services/graph/libs}/common/src/types/index.ts (100%) rename {libs => services/graph/libs}/common/src/types/webhook-types.d.ts (100%) rename {libs => services/graph/libs}/common/src/utils/base-consumer.ts (100%) rename {libs => services/graph/libs}/common/src/utils/index.ts (100%) rename {libs => services/graph/libs}/common/src/utils/processing.ts (100%) rename {libs => services/graph/libs}/common/src/utils/queues.ts (100%) rename {libs => services/graph/libs}/common/src/utils/redis.ts (100%) rename {libs => services/graph/libs}/common/tsconfig.lib.json (100%) rename {lua => services/graph/lua}/addToBatch.lua (100%) rename {lua => services/graph/lua}/incrementNonce.lua (100%) rename {lua => services/graph/lua}/lockBatch.lua (100%) rename {lua => services/graph/lua}/updateLastProcessed.lua (100%) rename nest-cli.json => services/graph/nest-cli.json (100%) rename package-lock.json => services/graph/package-lock.json (100%) rename package.json => services/graph/package.json (100%) rename {scripts => services/graph/scripts}/docker-entrypoint.sh (100%) rename {scripts => services/graph/scripts}/run-e2e.sh (100%) rename swagger.json => services/graph/swagger.json (100%) rename {test-setup => services/graph/test-setup}/main.ts (100%) rename tsconfig.build.json => services/graph/tsconfig.build.json (100%) rename tsconfig.json => services/graph/tsconfig.json (100%) diff --git a/.env.dev b/.env.dev deleted file mode 100644 index ff7a0421..00000000 --- a/.env.dev +++ /dev/null @@ -1,58 +0,0 @@ -# Copy this file to ".env.dev" and ".env.docker.dev", and then tweak values for local development -FREQUENCY_URL=ws://localhost:9944 -REDIS_URL=redis://localhost:6379 -QUEUE_HIGH_WATER=1000 -API_PORT=3000 -DEBOUNCE_SECONDS=10 - -# Configure the amount of capacity Graph Service can use. -CAPACITY_LIMIT='{"type":"percentage", "value":80}' - -# Add the graph environment type. This can be 'Dev' or 'Rococo' or 'Mainnet'. -GRAPH_ENVIRONMENT_TYPE=Dev - -# [NOTE]: The following config is only used for Dev environments. -# Add the graph environment config in JSON format only used for Dev environments. -# Be careful to escape any inner quotes as this is in a .env file. -GRAPH_ENVIRONMENT_DEV_CONFIG='{ - "sdkMaxStaleFriendshipDays": 100, - "maxPageId": 100, - "dsnpVersions": [ - "1.0" - ], - "maxGraphPageSizeBytes": 100, - "maxKeyPageSizeBytes": 100, - "schemaMap": { - "1": { - "dsnpVersion": "1.0", - "connectionType": "follow", - "privacyType": "public" - }, - "2": { - "dsnpVersion": "1.0", - "connectionType": "follow", - "privacyType": "private" - }, - "3": { - "dsnpVersion": "1.0", - "connectionType": "friendship", - "privacyType": "private" - } - }, - "graphPublicKeySchemaId": 4 -} -' -PROVIDER_ACCOUNT_SEED_PHRASE="//Alice" -PROVIDER_ID=1 - -# following are optional if reconnection service is is required -PROVIDER_BASE_URL="http://localhost:3000" # this is optional if reconnection service is not required -PROVIDER_ACCESS_TOKEN="api-key" # this is optional if reconnection service if PROVIDER_BASE_URL requires an access token -PAGE_SIZE=100 -RECONNECTION_SERVICE_REQUIRED=false -BLOCKCHAIN_SCAN_INTERVAL_MINUTES=5 -WEBHOOK_FAILURE_THRESHOLD=3 -HEALTH_CHECK_SUCCESS_THRESHOLD=10 -WEBHOOK_RETRY_INTERVAL_SECONDS=10 -HEALTH_CHECK_MAX_RETRY_INTERVAL_SECONDS=10 -HEALTH_CHECK_MAX_RETRIES=4 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d91a92ad..525eeada 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,7 @@ version: 2 updates: - - package-ecosystem: 'npm' # See documentation for possible values - directory: '/' # Location of package manifests + - package-ecosystem: "npm" # See documentation for possible values + directory: "/services/graph" # Location of package manifests schedule: - interval: 'weekly' + interval: "weekly" diff --git a/.github/workflows/build.yml b/.github/workflows/build-graph.yml similarity index 77% rename from .github/workflows/build.yml rename to .github/workflows/build-graph.yml index 0fc774bc..70e0196b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build-graph.yml @@ -1,4 +1,4 @@ -name: Build And Test Graph Service +name: "[Graph] Build And Test" concurrency: group: ${{github.workflow}}-${{github.ref}} cancel-in-progress: true @@ -12,7 +12,7 @@ on: jobs: build: - name: 'Build' + name: "Build" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -20,15 +20,15 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20 - cache: 'npm' - registry-url: 'https://registry.npmjs.org' + cache: "npm" + registry-url: "https://registry.npmjs.org" cache-dependency-path: package-lock.json - name: Install dependencies run: npm ci - name: Build NestJS run: npm run build test_jest: - name: 'Test' + name: "Test" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -36,27 +36,30 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20 - cache: 'npm' - registry-url: 'https://registry.npmjs.org' + cache: "npm" + registry-url: "https://registry.npmjs.org" cache-dependency-path: package-lock.json - name: Install dependencies run: npm ci - name: Run Jest run: npm run test check_licenses: - name: 'Dependency License Check' + name: "Dependency License Check" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Node.js uses: actions/setup-node@v4 with: + working-directory: services/graph node-version: 20 - cache: 'npm' - registry-url: 'https://registry.npmjs.org' + cache: "npm" + registry-url: "https://registry.npmjs.org" cache-dependency-path: package-lock.json - name: Install dependencies + working-directory: services/graph run: npm ci - name: License Check + working-directory: services/graph # List all the licenses and error out if it is not one of the supported licenses run: npx license-report --fields=name --fields=licenseType | jq 'map(select(.licenseType | IN("MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "(Apache-2.0 AND MIT)", "Apache-2.0 OR MIT") | not)) | if length == 0 then halt else halt_error(1) end' diff --git a/.github/workflows/common/is-full-release/action.yml b/.github/workflows/common/is-full-release/action.yml deleted file mode 100644 index 9e17770c..00000000 --- a/.github/workflows/common/is-full-release/action.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Is Full Release? -description: Determines whether the version tag represents a full release -inputs: - version-tag: - description: "Version tag in v#.#.#[-*] format" - required: true -outputs: - is-full-release: - description: "'true' if full release, 'false' otherwise" - value: ${{steps.is-full-release.outputs.is_full_release}} -runs: - using: "composite" - steps: - - name: Full Release? - id: is-full-release - shell: bash - run: | - version_tag=${{inputs.version-tag}} - is_full_release=$([[ "$version_tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]] && \ - echo 'true' || echo 'false') - echo "is_full_release: $is_full_release" - echo "is_full_release=$is_full_release" >> $GITHUB_OUTPUT diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml deleted file mode 100644 index 660b20dd..00000000 --- a/.github/workflows/deploy-gh-pages.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Build and Publish OpenAPI UI to Pages -concurrency: - group: ${{github.workflow}}-${{github.ref}} - cancel-in-progress: true -on: - workflow_dispatch: - push: - branches: - - main - -permissions: - contents: read - pages: write - id-token: write - -jobs: - build: - name: 'Build Pages Artifact' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Generate Swagger UI - run: npm run generate-swagger-ui - - - name: Setup Pages - id: pages - uses: actions/configure-pages@v4 - - - name: Publish generated swagger.html to GitHub Pages - uses: actions/upload-pages-artifact@v3 - with: - path: ./docs - - # Deployment job - deploy: - name: 'Deploy to Pages' - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release-graph.yml similarity index 78% rename from .github/workflows/release.yml rename to .github/workflows/release-graph.yml index d67dbc68..64360167 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release-graph.yml @@ -1,24 +1,24 @@ -name: Release -run-name: Cut Release ${{github.event.inputs.release-version || github.ref_name}} +name: "[Graph] Release" +run-name: "[Graph] Cut Service Release ${{github.event.inputs.release-version || github.ref_name}}" concurrency: group: ${{github.workflow}}-${{github.ref}} cancel-in-progress: true on: push: tags: - - 'v[0-9]+.[0-9]+.[0-9]+' # ex. v1.0.0 - - 'v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+' # ex. v1.1.0-rc1 - - 'v0.0.1' # used for testing only - - 'v0.0.1-rc[0-9]+' # used for testing only + - "graph-v[0-9]+.[0-9]+.[0-9]+" # ex. v1.0.0 + - "graph-v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+" # ex. v1.1.0-rc1 + - "graph-v0.0.1" # used for testing only + - "graph-v0.0.1-rc[0-9]+" # used for testing only workflow_dispatch: inputs: release-version: - description: 'Release version (v#.#.#[-rc#])' + description: "Release version (graph-v#.#.#[-rc#])" required: true env: NEW_RELEASE_TAG_FROM_UI: ${{github.event.inputs.release-version}} - TEST_RUN: ${{startsWith(github.event.inputs.release-version || github.ref_name, 'v0.0.1')}} + TEST_RUN: ${{startsWith(github.event.inputs.release-version || github.ref_name, 'graph-v0.0.1')}} DOCKER_HUB_PROFILE: amplicalabs IMAGE_NAME: graph-service @@ -33,7 +33,7 @@ jobs: run: | version=${{env.NEW_RELEASE_TAG_FROM_UI}} echo "Release version entered in UI: $version" - regex='^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-rc[1-9]\d*)?$' + regex='^graph-v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-rc[1-9]\d*)?$' if [[ ! $version =~ $regex ]]; then echo "ERROR: Entered version $version is not valid." echo "Please use v#.#.#[-rc#] format." @@ -69,6 +69,7 @@ jobs: - name: Build and Push graph-service-service Image uses: docker/build-push-action@v5 with: + working-directory: services/graph context: . platforms: linux/amd64 push: ${{env.TEST_RUN != 'true'}} diff --git a/.gitignore copy b/.gitignore copy deleted file mode 100644 index b859bff7..00000000 --- a/.gitignore copy +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -dist -.env -.vscode -coverage -.idea diff --git a/.dockerignore b/services/graph/.dockerignore similarity index 100% rename from .dockerignore rename to services/graph/.dockerignore diff --git a/.eslintrc.json b/services/graph/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to services/graph/.eslintrc.json diff --git a/.gitignore b/services/graph/.gitignore similarity index 100% rename from .gitignore rename to services/graph/.gitignore diff --git a/.prettierrc b/services/graph/.prettierrc similarity index 100% rename from .prettierrc rename to services/graph/.prettierrc diff --git a/.tool-versions b/services/graph/.tool-versions similarity index 100% rename from .tool-versions rename to services/graph/.tool-versions diff --git a/.vscode/launch.json b/services/graph/.vscode/launch.json similarity index 100% rename from .vscode/launch.json rename to services/graph/.vscode/launch.json diff --git a/Dockerfile b/services/graph/Dockerfile similarity index 100% rename from Dockerfile rename to services/graph/Dockerfile diff --git a/ENVIRONMENT.md b/services/graph/ENVIRONMENT.md similarity index 100% rename from ENVIRONMENT.md rename to services/graph/ENVIRONMENT.md diff --git a/LICENSE b/services/graph/LICENSE similarity index 100% rename from LICENSE rename to services/graph/LICENSE diff --git a/Makefile b/services/graph/Makefile similarity index 100% rename from Makefile rename to services/graph/Makefile diff --git a/README.md b/services/graph/README.md similarity index 100% rename from README.md rename to services/graph/README.md diff --git a/apps/api/src/api.module.ts b/services/graph/apps/api/src/api.module.ts similarity index 100% rename from apps/api/src/api.module.ts rename to services/graph/apps/api/src/api.module.ts diff --git a/apps/api/src/api.service.ts b/services/graph/apps/api/src/api.service.ts similarity index 100% rename from apps/api/src/api.service.ts rename to services/graph/apps/api/src/api.service.ts diff --git a/apps/api/src/build-openapi.ts b/services/graph/apps/api/src/build-openapi.ts similarity index 100% rename from apps/api/src/build-openapi.ts rename to services/graph/apps/api/src/build-openapi.ts diff --git a/apps/api/src/controllers/health.controller.ts b/services/graph/apps/api/src/controllers/health.controller.ts similarity index 100% rename from apps/api/src/controllers/health.controller.ts rename to services/graph/apps/api/src/controllers/health.controller.ts diff --git a/apps/api/src/controllers/v1/graph-v1.controller.ts b/services/graph/apps/api/src/controllers/v1/graph-v1.controller.ts similarity index 100% rename from apps/api/src/controllers/v1/graph-v1.controller.ts rename to services/graph/apps/api/src/controllers/v1/graph-v1.controller.ts diff --git a/apps/api/src/controllers/v1/webhooks-v1.controller.ts b/services/graph/apps/api/src/controllers/v1/webhooks-v1.controller.ts similarity index 100% rename from apps/api/src/controllers/v1/webhooks-v1.controller.ts rename to services/graph/apps/api/src/controllers/v1/webhooks-v1.controller.ts diff --git a/apps/api/src/generate-metadata.ts b/services/graph/apps/api/src/generate-metadata.ts similarity index 100% rename from apps/api/src/generate-metadata.ts rename to services/graph/apps/api/src/generate-metadata.ts diff --git a/apps/api/src/main.ts b/services/graph/apps/api/src/main.ts similarity index 100% rename from apps/api/src/main.ts rename to services/graph/apps/api/src/main.ts diff --git a/apps/api/src/metadata.ts b/services/graph/apps/api/src/metadata.ts similarity index 100% rename from apps/api/src/metadata.ts rename to services/graph/apps/api/src/metadata.ts diff --git a/apps/api/test/app.e2e-spec.ts b/services/graph/apps/api/test/app.e2e-spec.ts similarity index 100% rename from apps/api/test/app.e2e-spec.ts rename to services/graph/apps/api/test/app.e2e-spec.ts diff --git a/apps/api/test/e2e-setup.mock.spec.ts b/services/graph/apps/api/test/e2e-setup.mock.spec.ts similarity index 100% rename from apps/api/test/e2e-setup.mock.spec.ts rename to services/graph/apps/api/test/e2e-setup.mock.spec.ts diff --git a/apps/api/test/setup/package-lock.json b/services/graph/apps/api/test/setup/package-lock.json similarity index 100% rename from apps/api/test/setup/package-lock.json rename to services/graph/apps/api/test/setup/package-lock.json diff --git a/apps/api/test/setup/package.json b/services/graph/apps/api/test/setup/package.json similarity index 100% rename from apps/api/test/setup/package.json rename to services/graph/apps/api/test/setup/package.json diff --git a/apps/api/tsconfig.app.json b/services/graph/apps/api/tsconfig.app.json similarity index 100% rename from apps/api/tsconfig.app.json rename to services/graph/apps/api/tsconfig.app.json diff --git a/apps/worker/src/BaseConsumer.ts b/services/graph/apps/worker/src/BaseConsumer.ts similarity index 100% rename from apps/worker/src/BaseConsumer.ts rename to services/graph/apps/worker/src/BaseConsumer.ts diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts b/services/graph/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts similarity index 100% rename from apps/worker/src/graph_notifier/graph.monitor.processor.module.ts rename to services/graph/apps/worker/src/graph_notifier/graph.monitor.processor.module.ts diff --git a/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts b/services/graph/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts similarity index 100% rename from apps/worker/src/graph_notifier/graph.monitor.processor.service.ts rename to services/graph/apps/worker/src/graph_notifier/graph.monitor.processor.service.ts diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts b/services/graph/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts similarity index 100% rename from apps/worker/src/graph_publisher/graph.publisher.processor.module.ts rename to services/graph/apps/worker/src/graph_publisher/graph.publisher.processor.module.ts diff --git a/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts b/services/graph/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts similarity index 100% rename from apps/worker/src/graph_publisher/graph.publisher.processor.service.ts rename to services/graph/apps/worker/src/graph_publisher/graph.publisher.processor.service.ts diff --git a/apps/worker/src/main.ts b/services/graph/apps/worker/src/main.ts similarity index 100% rename from apps/worker/src/main.ts rename to services/graph/apps/worker/src/main.ts diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts b/services/graph/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts similarity index 100% rename from apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts rename to services/graph/apps/worker/src/reconnection_processor/graph.reconnection.processor.module.ts diff --git a/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts b/services/graph/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts similarity index 100% rename from apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts rename to services/graph/apps/worker/src/reconnection_processor/graph.reconnection.processor.service.ts diff --git a/apps/worker/src/request_processor/request.processor.module.ts b/services/graph/apps/worker/src/request_processor/request.processor.module.ts similarity index 100% rename from apps/worker/src/request_processor/request.processor.module.ts rename to services/graph/apps/worker/src/request_processor/request.processor.module.ts diff --git a/apps/worker/src/request_processor/request.processor.service.ts b/services/graph/apps/worker/src/request_processor/request.processor.service.ts similarity index 100% rename from apps/worker/src/request_processor/request.processor.service.ts rename to services/graph/apps/worker/src/request_processor/request.processor.service.ts diff --git a/apps/worker/src/worker.module.ts b/services/graph/apps/worker/src/worker.module.ts similarity index 100% rename from apps/worker/src/worker.module.ts rename to services/graph/apps/worker/src/worker.module.ts diff --git a/apps/worker/tsconfig.app.json b/services/graph/apps/worker/tsconfig.app.json similarity index 100% rename from apps/worker/tsconfig.app.json rename to services/graph/apps/worker/tsconfig.app.json diff --git a/dev.Dockerfile b/services/graph/dev.Dockerfile similarity index 100% rename from dev.Dockerfile rename to services/graph/dev.Dockerfile diff --git a/docker-compose.yaml b/services/graph/docker-compose.yaml similarity index 100% rename from docker-compose.yaml rename to services/graph/docker-compose.yaml diff --git a/docs/graph_service_arch.drawio b/services/graph/docs/graph_service_arch.drawio similarity index 100% rename from docs/graph_service_arch.drawio rename to services/graph/docs/graph_service_arch.drawio diff --git a/docs/graph_service_arch.drawio.png b/services/graph/docs/graph_service_arch.drawio.png similarity index 100% rename from docs/graph_service_arch.drawio.png rename to services/graph/docs/graph_service_arch.drawio.png diff --git a/env.template b/services/graph/env.template similarity index 100% rename from env.template rename to services/graph/env.template diff --git a/eslint.config.mjs b/services/graph/eslint.config.mjs similarity index 100% rename from eslint.config.mjs rename to services/graph/eslint.config.mjs diff --git a/graph-webhooks.openapi.yaml b/services/graph/graph-webhooks.openapi.yaml similarity index 100% rename from graph-webhooks.openapi.yaml rename to services/graph/graph-webhooks.openapi.yaml diff --git a/k6-test/.openapi-generator-ignore b/services/graph/k6-test/.openapi-generator-ignore similarity index 100% rename from k6-test/.openapi-generator-ignore rename to services/graph/k6-test/.openapi-generator-ignore diff --git a/k6-test/.openapi-generator/FILES b/services/graph/k6-test/.openapi-generator/FILES similarity index 100% rename from k6-test/.openapi-generator/FILES rename to services/graph/k6-test/.openapi-generator/FILES diff --git a/k6-test/.openapi-generator/VERSION b/services/graph/k6-test/.openapi-generator/VERSION similarity index 100% rename from k6-test/.openapi-generator/VERSION rename to services/graph/k6-test/.openapi-generator/VERSION diff --git a/k6-test/README.md b/services/graph/k6-test/README.md similarity index 100% rename from k6-test/README.md rename to services/graph/k6-test/README.md diff --git a/k6-test/script.js b/services/graph/k6-test/script.js similarity index 100% rename from k6-test/script.js rename to services/graph/k6-test/script.js diff --git a/libs/common/src/blockchain/blockchain-constants.ts b/services/graph/libs/common/src/blockchain/blockchain-constants.ts similarity index 100% rename from libs/common/src/blockchain/blockchain-constants.ts rename to services/graph/libs/common/src/blockchain/blockchain-constants.ts diff --git a/libs/common/src/blockchain/blockchain.module.ts b/services/graph/libs/common/src/blockchain/blockchain.module.ts similarity index 100% rename from libs/common/src/blockchain/blockchain.module.ts rename to services/graph/libs/common/src/blockchain/blockchain.module.ts diff --git a/libs/common/src/blockchain/blockchain.service.spec.ts b/services/graph/libs/common/src/blockchain/blockchain.service.spec.ts similarity index 100% rename from libs/common/src/blockchain/blockchain.service.spec.ts rename to services/graph/libs/common/src/blockchain/blockchain.service.spec.ts diff --git a/libs/common/src/blockchain/blockchain.service.ts b/services/graph/libs/common/src/blockchain/blockchain.service.ts similarity index 100% rename from libs/common/src/blockchain/blockchain.service.ts rename to services/graph/libs/common/src/blockchain/blockchain.service.ts diff --git a/libs/common/src/blockchain/create-keys.ts b/services/graph/libs/common/src/blockchain/create-keys.ts similarity index 100% rename from libs/common/src/blockchain/create-keys.ts rename to services/graph/libs/common/src/blockchain/create-keys.ts diff --git a/libs/common/src/blockchain/event-error.ts b/services/graph/libs/common/src/blockchain/event-error.ts similarity index 100% rename from libs/common/src/blockchain/event-error.ts rename to services/graph/libs/common/src/blockchain/event-error.ts diff --git a/libs/common/src/blockchain/extrinsic.ts b/services/graph/libs/common/src/blockchain/extrinsic.ts similarity index 100% rename from libs/common/src/blockchain/extrinsic.ts rename to services/graph/libs/common/src/blockchain/extrinsic.ts diff --git a/libs/common/src/blockchain/index.ts b/services/graph/libs/common/src/blockchain/index.ts similarity index 100% rename from libs/common/src/blockchain/index.ts rename to services/graph/libs/common/src/blockchain/index.ts diff --git a/libs/common/src/config/config.module.ts b/services/graph/libs/common/src/config/config.module.ts similarity index 100% rename from libs/common/src/config/config.module.ts rename to services/graph/libs/common/src/config/config.module.ts diff --git a/libs/common/src/config/config.service.spec.ts b/services/graph/libs/common/src/config/config.service.spec.ts similarity index 100% rename from libs/common/src/config/config.service.spec.ts rename to services/graph/libs/common/src/config/config.service.spec.ts diff --git a/libs/common/src/config/config.service.ts b/services/graph/libs/common/src/config/config.service.ts similarity index 100% rename from libs/common/src/config/config.service.ts rename to services/graph/libs/common/src/config/config.service.ts diff --git a/libs/common/src/config/env.config.ts b/services/graph/libs/common/src/config/env.config.ts similarity index 100% rename from libs/common/src/config/env.config.ts rename to services/graph/libs/common/src/config/env.config.ts diff --git a/libs/common/src/config/index.ts b/services/graph/libs/common/src/config/index.ts similarity index 100% rename from libs/common/src/config/index.ts rename to services/graph/libs/common/src/config/index.ts diff --git a/libs/common/src/config/swagger_config.ts b/services/graph/libs/common/src/config/swagger_config.ts similarity index 100% rename from libs/common/src/config/swagger_config.ts rename to services/graph/libs/common/src/config/swagger_config.ts diff --git a/libs/common/src/constants.ts b/services/graph/libs/common/src/constants.ts similarity index 100% rename from libs/common/src/constants.ts rename to services/graph/libs/common/src/constants.ts diff --git a/libs/common/src/dtos/connection-type.enum.ts b/services/graph/libs/common/src/dtos/connection-type.enum.ts similarity index 100% rename from libs/common/src/dtos/connection-type.enum.ts rename to services/graph/libs/common/src/dtos/connection-type.enum.ts diff --git a/libs/common/src/dtos/connection.dto.ts b/services/graph/libs/common/src/dtos/connection.dto.ts similarity index 100% rename from libs/common/src/dtos/connection.dto.ts rename to services/graph/libs/common/src/dtos/connection.dto.ts diff --git a/libs/common/src/dtos/direction.enum.ts b/services/graph/libs/common/src/dtos/direction.enum.ts similarity index 100% rename from libs/common/src/dtos/direction.enum.ts rename to services/graph/libs/common/src/dtos/direction.enum.ts diff --git a/libs/common/src/dtos/dsnp-graph-edge.dto.ts b/services/graph/libs/common/src/dtos/dsnp-graph-edge.dto.ts similarity index 100% rename from libs/common/src/dtos/dsnp-graph-edge.dto.ts rename to services/graph/libs/common/src/dtos/dsnp-graph-edge.dto.ts diff --git a/libs/common/src/dtos/graph-change-response.dto.ts b/services/graph/libs/common/src/dtos/graph-change-response.dto.ts similarity index 100% rename from libs/common/src/dtos/graph-change-response.dto.ts rename to services/graph/libs/common/src/dtos/graph-change-response.dto.ts diff --git a/libs/common/src/dtos/graph-key-pair.dto.ts b/services/graph/libs/common/src/dtos/graph-key-pair.dto.ts similarity index 100% rename from libs/common/src/dtos/graph-key-pair.dto.ts rename to services/graph/libs/common/src/dtos/graph-key-pair.dto.ts diff --git a/libs/common/src/dtos/graph-query-params.dto.ts b/services/graph/libs/common/src/dtos/graph-query-params.dto.ts similarity index 100% rename from libs/common/src/dtos/graph-query-params.dto.ts rename to services/graph/libs/common/src/dtos/graph-query-params.dto.ts diff --git a/libs/common/src/dtos/graph.notifier.job.ts b/services/graph/libs/common/src/dtos/graph.notifier.job.ts similarity index 100% rename from libs/common/src/dtos/graph.notifier.job.ts rename to services/graph/libs/common/src/dtos/graph.notifier.job.ts diff --git a/libs/common/src/dtos/graph.update.job.ts b/services/graph/libs/common/src/dtos/graph.update.job.ts similarity index 100% rename from libs/common/src/dtos/graph.update.job.ts rename to services/graph/libs/common/src/dtos/graph.update.job.ts diff --git a/libs/common/src/dtos/index.ts b/services/graph/libs/common/src/dtos/index.ts similarity index 100% rename from libs/common/src/dtos/index.ts rename to services/graph/libs/common/src/dtos/index.ts diff --git a/libs/common/src/dtos/key-type.enum.ts b/services/graph/libs/common/src/dtos/key-type.enum.ts similarity index 100% rename from libs/common/src/dtos/key-type.enum.ts rename to services/graph/libs/common/src/dtos/key-type.enum.ts diff --git a/libs/common/src/dtos/privacy-type.enum.ts b/services/graph/libs/common/src/dtos/privacy-type.enum.ts similarity index 100% rename from libs/common/src/dtos/privacy-type.enum.ts rename to services/graph/libs/common/src/dtos/privacy-type.enum.ts diff --git a/libs/common/src/dtos/provider-graph.dto.ts b/services/graph/libs/common/src/dtos/provider-graph.dto.ts similarity index 100% rename from libs/common/src/dtos/provider-graph.dto.ts rename to services/graph/libs/common/src/dtos/provider-graph.dto.ts diff --git a/libs/common/src/dtos/user-graph.dto.ts b/services/graph/libs/common/src/dtos/user-graph.dto.ts similarity index 100% rename from libs/common/src/dtos/user-graph.dto.ts rename to services/graph/libs/common/src/dtos/user-graph.dto.ts diff --git a/libs/common/src/dtos/watch-graphs.dto.ts b/services/graph/libs/common/src/dtos/watch-graphs.dto.ts similarity index 100% rename from libs/common/src/dtos/watch-graphs.dto.ts rename to services/graph/libs/common/src/dtos/watch-graphs.dto.ts diff --git a/libs/common/src/index.ts b/services/graph/libs/common/src/index.ts similarity index 100% rename from libs/common/src/index.ts rename to services/graph/libs/common/src/index.ts diff --git a/libs/common/src/interfaces/capacity-limit.interface.ts b/services/graph/libs/common/src/interfaces/capacity-limit.interface.ts similarity index 100% rename from libs/common/src/interfaces/capacity-limit.interface.ts rename to services/graph/libs/common/src/interfaces/capacity-limit.interface.ts diff --git a/libs/common/src/interfaces/graph-update-job.interface.ts b/services/graph/libs/common/src/interfaces/graph-update-job.interface.ts similarity index 100% rename from libs/common/src/interfaces/graph-update-job.interface.ts rename to services/graph/libs/common/src/interfaces/graph-update-job.interface.ts diff --git a/libs/common/src/interfaces/index.ts b/services/graph/libs/common/src/interfaces/index.ts similarity index 100% rename from libs/common/src/interfaces/index.ts rename to services/graph/libs/common/src/interfaces/index.ts diff --git a/libs/common/src/interfaces/provider.graph.update-job.interface.ts b/services/graph/libs/common/src/interfaces/provider.graph.update-job.interface.ts similarity index 100% rename from libs/common/src/interfaces/provider.graph.update-job.interface.ts rename to services/graph/libs/common/src/interfaces/provider.graph.update-job.interface.ts diff --git a/libs/common/src/services/async_debouncer.ts b/services/graph/libs/common/src/services/async_debouncer.ts similarity index 100% rename from libs/common/src/services/async_debouncer.ts rename to services/graph/libs/common/src/services/async_debouncer.ts diff --git a/libs/common/src/services/blockchain-scanner.service.ts b/services/graph/libs/common/src/services/blockchain-scanner.service.ts similarity index 100% rename from libs/common/src/services/blockchain-scanner.service.ts rename to services/graph/libs/common/src/services/blockchain-scanner.service.ts diff --git a/libs/common/src/services/graph-state-manager.ts b/services/graph/libs/common/src/services/graph-state-manager.ts similarity index 100% rename from libs/common/src/services/graph-state-manager.ts rename to services/graph/libs/common/src/services/graph-state-manager.ts diff --git a/libs/common/src/services/index.ts b/services/graph/libs/common/src/services/index.ts similarity index 100% rename from libs/common/src/services/index.ts rename to services/graph/libs/common/src/services/index.ts diff --git a/libs/common/src/services/nonce.service.ts b/services/graph/libs/common/src/services/nonce.service.ts similarity index 100% rename from libs/common/src/services/nonce.service.ts rename to services/graph/libs/common/src/services/nonce.service.ts diff --git a/libs/common/src/services/provider-webhook.service.ts b/services/graph/libs/common/src/services/provider-webhook.service.ts similarity index 100% rename from libs/common/src/services/provider-webhook.service.ts rename to services/graph/libs/common/src/services/provider-webhook.service.ts diff --git a/libs/common/src/types/index.ts b/services/graph/libs/common/src/types/index.ts similarity index 100% rename from libs/common/src/types/index.ts rename to services/graph/libs/common/src/types/index.ts diff --git a/libs/common/src/types/webhook-types.d.ts b/services/graph/libs/common/src/types/webhook-types.d.ts similarity index 100% rename from libs/common/src/types/webhook-types.d.ts rename to services/graph/libs/common/src/types/webhook-types.d.ts diff --git a/libs/common/src/utils/base-consumer.ts b/services/graph/libs/common/src/utils/base-consumer.ts similarity index 100% rename from libs/common/src/utils/base-consumer.ts rename to services/graph/libs/common/src/utils/base-consumer.ts diff --git a/libs/common/src/utils/index.ts b/services/graph/libs/common/src/utils/index.ts similarity index 100% rename from libs/common/src/utils/index.ts rename to services/graph/libs/common/src/utils/index.ts diff --git a/libs/common/src/utils/processing.ts b/services/graph/libs/common/src/utils/processing.ts similarity index 100% rename from libs/common/src/utils/processing.ts rename to services/graph/libs/common/src/utils/processing.ts diff --git a/libs/common/src/utils/queues.ts b/services/graph/libs/common/src/utils/queues.ts similarity index 100% rename from libs/common/src/utils/queues.ts rename to services/graph/libs/common/src/utils/queues.ts diff --git a/libs/common/src/utils/redis.ts b/services/graph/libs/common/src/utils/redis.ts similarity index 100% rename from libs/common/src/utils/redis.ts rename to services/graph/libs/common/src/utils/redis.ts diff --git a/libs/common/tsconfig.lib.json b/services/graph/libs/common/tsconfig.lib.json similarity index 100% rename from libs/common/tsconfig.lib.json rename to services/graph/libs/common/tsconfig.lib.json diff --git a/lua/addToBatch.lua b/services/graph/lua/addToBatch.lua similarity index 100% rename from lua/addToBatch.lua rename to services/graph/lua/addToBatch.lua diff --git a/lua/incrementNonce.lua b/services/graph/lua/incrementNonce.lua similarity index 100% rename from lua/incrementNonce.lua rename to services/graph/lua/incrementNonce.lua diff --git a/lua/lockBatch.lua b/services/graph/lua/lockBatch.lua similarity index 100% rename from lua/lockBatch.lua rename to services/graph/lua/lockBatch.lua diff --git a/lua/updateLastProcessed.lua b/services/graph/lua/updateLastProcessed.lua similarity index 100% rename from lua/updateLastProcessed.lua rename to services/graph/lua/updateLastProcessed.lua diff --git a/nest-cli.json b/services/graph/nest-cli.json similarity index 100% rename from nest-cli.json rename to services/graph/nest-cli.json diff --git a/package-lock.json b/services/graph/package-lock.json similarity index 100% rename from package-lock.json rename to services/graph/package-lock.json diff --git a/package.json b/services/graph/package.json similarity index 100% rename from package.json rename to services/graph/package.json diff --git a/scripts/docker-entrypoint.sh b/services/graph/scripts/docker-entrypoint.sh similarity index 100% rename from scripts/docker-entrypoint.sh rename to services/graph/scripts/docker-entrypoint.sh diff --git a/scripts/run-e2e.sh b/services/graph/scripts/run-e2e.sh similarity index 100% rename from scripts/run-e2e.sh rename to services/graph/scripts/run-e2e.sh diff --git a/swagger.json b/services/graph/swagger.json similarity index 100% rename from swagger.json rename to services/graph/swagger.json diff --git a/test-setup/main.ts b/services/graph/test-setup/main.ts similarity index 100% rename from test-setup/main.ts rename to services/graph/test-setup/main.ts diff --git a/tsconfig.build.json b/services/graph/tsconfig.build.json similarity index 100% rename from tsconfig.build.json rename to services/graph/tsconfig.build.json diff --git a/tsconfig.json b/services/graph/tsconfig.json similarity index 100% rename from tsconfig.json rename to services/graph/tsconfig.json