diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6..00000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index 87d5fd09..00000000 --- a/.changeset/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [["@iroha2/crypto-target-*"], ["@iroha2/client", "@iroha2/data-model", "@iroha2/data-model-schema"]], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch" -} diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index ffc5669a..00000000 --- a/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -dist -dist-tsc -/packages/data-model/src/__generated__.ts - -/packages/crypto/crypto-rs/wasm-pkg-* -/packages/crypto/crypto-rs/target -/packages/data-model-rust-samples/target - diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 13645a09..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,59 +0,0 @@ -module.exports = { - extends: ['alloy', 'alloy/typescript'], - parserOptions: { - project: './tsconfig.eslint.json', - }, - rules: { - 'no-promise-executor-return': 'off', - 'spaced-comment': ['error', 'always', { markers: ['/'] }], - 'sort-imports': [ - 'warn', - { - ignoreCase: false, - ignoreDeclarationSort: true, - ignoreMemberSort: false, - memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], - allowSeparatedGroups: false, - }, - ], - }, - globals: { - BigInt: true, - globalThis: true - }, - overrides: [ - { - files: ['**/test/integration/test-web/cypress/**/*.{js,ts}'], - plugins: ['cypress'], - env: { - 'cypress/globals': true, - }, - }, - // ESLint Vue from web tests - { - files: ['**/packages/client/test/integration/test-web/src/**/*.vue'], - extends: [ - 'plugin:vue/vue3-recommended', - // no real need to apply type checked linting rules for integration tests - 'plugin:@typescript-eslint/disable-type-checked', - ], - parserOptions: { - ecmaVersion: 2020, - parser: '@typescript-eslint/parser', - extraFileExtensions: ['.vue'], - }, - rules: { - 'vue/html-indent': ['warn', 2], - }, - }, - // Jakefiles - { - files: ['packages/crypto/etc/jakefile.ts', 'etc/jakefile.ts'], - globals: { - desc: true, - task: true, - namespace: true, - }, - }, - ], -} diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 00000000..33ab8ddc --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,131 @@ +name: Unified CI/CD +on: + pull_request: + branches: [main] + push: + branches: [main] +env: + IROHA_GIT: https://github.com/0x009922/iroha.git + IROHA_REV: 5302-expose-signature-payload +jobs: + prep-crypto-wasm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + id: prep-cache + with: + path: | + prep/crypto-wasm + key: ${{ runner.os }}-${{ hashFiles('crypto-wasm/*') }} + - uses: actions-rust-lang/setup-rust-toolchain@v1 + if: steps.prep-cache.outputs.cache-hit != 'true' + with: + cache: 'false' + toolchain: 'nightly-2024-09-09,stable' + target: 'wasm32-unknown-unknown' + components: rust-src + - uses: jetli/wasm-pack-action@v0.4.0 + if: steps.prep-cache.outputs.cache-hit != 'true' + with: + version: 'v0.13.1' + - uses: denoland/setup-deno@v2 + if: steps.prep-cache.outputs.cache-hit != 'true' + with: + deno-version: v2.x + - name: Build packages + if: steps.prep-cache.outputs.cache-hit != 'true' + run: deno task prep:crypto-wasm + + prep-iroha: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + id: prep-cache + with: + path: | + prep/iroha + key: ${{ runner.os }}-${{ env.IROHA_GIT }}-${{ env.IROHA_REV }} + - uses: actions-rust-lang/setup-rust-toolchain@v1 + if: steps.prep-cache.outputs.cache-hit != 'true' + with: + toolchain: 'nightly-2024-09-09' + target: 'wasm32-unknown-unknown' + components: rust-src + cache: 'false' + - uses: denoland/setup-deno@v2 + if: steps.prep-cache.outputs.cache-hit != 'true' + with: + deno-version: v2.x + - name: Prepare Iroha artifacts + if: steps.prep-cache.outputs.cache-hit != 'true' + run: | + deno task prep:iroha --git $IROHA_GIT --git-rev $IROHA_REV + deno task prep:iroha:build + + check: + needs: ['prep-crypto-wasm', 'prep-iroha'] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/cache/restore@v4 + with: + fail-on-cache-miss: true + key: ${{ runner.os }}-${{ env.IROHA_GIT }}-${{ env.IROHA_REV }} + path: | + prep/iroha + - uses: actions/cache/restore@v4 + with: + fail-on-cache-miss: true + key: ${{ runner.os }}-${{ hashFiles('crypto-wasm/*') }} + path: | + prep/crypto-wasm + - uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + - uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Enable pnpm via Corepack + run: | + echo "Before: corepack version => $(corepack --version || echo 'not installed')" + npm install -g corepack@latest + echo "After : corepack version => $(corepack --version)" + corepack enable pnpm + - name: Deno install + run: deno task install + - name: Deno check + run: deno task check:all + - name: Deno lint, fmt + run: | + deno lint + deno fmt --check + - name: Test + run: deno task test + + publish: + if: github.event_name == 'push' + needs: [check] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/cache/restore@v4 + with: + fail-on-cache-miss: true + key: ${{ runner.os }}-${{ env.IROHA_GIT }}-${{ env.IROHA_REV }} + path: | + prep/iroha + - uses: actions/cache/restore@v4 + with: + fail-on-cache-miss: true + key: ${{ runner.os }}-${{ hashFiles('crypto-wasm/*') }} + path: | + prep/crypto-wasm + - uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + - name: Publish + run: deno task publish --token $JSR_TOKEN + env: + JSR_TOKEN: 'TODO' diff --git a/.gitignore b/.gitignore index 727f094b..a70dbf7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,17 @@ +.vite node_modules .DS_Store -dist -dist-tsc -/etc/api/tmp -/docs/api + esbuild-kit v8-compile-cache-0 .pnpm-debug.log .idea +.vscode + +/prep +/.iroha +/packages/crypto-target-*/wasm-target +/packages/core/crypto/wasm-target +**/*_generated_.ts + diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 847a1a5e..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -publish-branch=iroha2 diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 217974a8..00000000 --- a/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -dist -dist-tsc -node_modules -**/data-model/src/__generated__.ts -**/data-model-schema/src/__schema__.json -etc/api/**/* -packages/crypto/crypto-rs/wasm-pkg-* diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index e83938e3..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,51 +0,0 @@ -module.exports = { - // max 120 characters per line - printWidth: 120, - // use 24spaces for indentation - tabWidth: 2, - // use spaces instead of indentations - useTabs: false, - // semicolon at the end of the line - semi: false, - // use single quotes - singleQuote: true, - // object's key is quoted only when necessary - quoteProps: 'as-needed', - // use double quotes instead of single quotes in jsx - jsxSingleQuote: false, - // no comma at the end - trailingComma: 'all', - // spaces are required at the beginning and end of the braces - bracketSpacing: true, - // end tag of jsx need to wrap - jsxBracketSameLine: false, - // brackets are required for arrow function parameter, even when there is only one parameter - arrowParens: 'always', - // format the entire contents of the file - rangeStart: 0, - rangeEnd: Infinity, - // no need to write the beginning @prettier of the file - requirePragma: false, - // No need to automatically insert @prettier at the beginning of the file - insertPragma: false, - // use default break criteria - proseWrap: 'preserve', - // decide whether to break the html according to the display style - htmlWhitespaceSensitivity: 'css', - // vue files script and style tags indentation - vueIndentScriptAndStyle: false, - // lf for newline - endOfLine: 'lf', - // formats quoted code embedded - embeddedLanguageFormatting: 'auto', - overrides: [ - { - files: 'packages/docs-recipes/src/**/*.ts', - options: { - // decrease printWidth to fit code into snippets in the vitepress - printWidth: 90, - tabWidth: 2, - }, - }, - ], -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5bb9367a..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "*.json": "jsonc" - } -} diff --git a/README.md b/README.md index b1c2bf69..1a8d73b9 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,5 @@ -# Iroha2 JavaScript +# Iroha JavaScript -JavaScript SDK for [Iroha 2](https://github.com/hyperledger/iroha/tree/iroha2/). +This is a JavaScript (TypeScript) SDK for Iroha 2. -The Iroha 2 JavaScript library includes the following packages: - -- [`@iroha2/client`](./packages/client/) submits requests to the Iroha peer -- [`@iroha2/crypto-*`](./packages/crypto/): - - [`@iroha2/crypto-core`](./packages/crypto/packages/core/) provides unified crypto interface for Iroha 2 - - [`@iroha2/crypto-target-node`](./packages/crypto/packages/target-node/) provides compiled crypto WASM for the Node.js environment - - [`@iroha2/crypto-target-web`](./packages/crypto/packages/target-web/) provides compiled crypto WASM for native Web (ESM) - - [`@iroha2/crypto-target-bundler`](./packages/crypto/packages/target-bundler/) provides compiled crypto WASM to use with bundlers such as Webpack -- [`@iroha2/data-model`](./packages/data-model/) provides SCALE codecs for Iroha 2 data model - -Other packages you can find in this repository: - -- [`@iroha2/docs-recipes`](./packages/docs-recipes/) contains code samples used in documentation -- [`@iroha2/data-model-schema`](./packages/data-model-schema/) contains Iroha 2 Schema -- [`@iroha2/i64-fixnum`](./packages/i64-fixnum/) handles operations with fixed-point numbers - -## Installation - -The packages are published under the `@iroha2` scope into Iroha Nexus Registry. To install them using `npm`/`pnpm`, follow these steps: - -1. Configure your package manager to fetch scoped packages from Nexus Registry: - - ```ini - # FILE: .npmrc - @iroha2:registry=https://nexus.iroha.tech/repository/npm-group/ - ``` - -2. Install these packages as any other NPM package: - - ```shell - npm i @iroha2/client - yarn add @iroha2/data-model - pnpm add @iroha2/crypto-target-web - ``` - -## Get Started - -Check out [Hyperledger Iroha 2 Tutorial](https://hyperledger.github.io/iroha-2-docs/) that introduces you to Iroha 2 concepts and features and provides you with a step-by-step guide for JavaScript/TypeScript. - -## Maintenance - -Make sure you have installed **Node.js v16.17 or v18**. As for a package manager, this project uses [PNPM](https://pnpm.io/). - -Also make sure you have installed the following version of **Rust toolchain**: - -```bash -rustup default nightly-2023-06-25 -``` - -Before working with the repository, install the necessary packages: - -```bash -pnpm install -``` - -### Scripts - -Most tasks are defined via [Jake](https://github.com/jakejs/jake), a JavaScript build tool. To explore available tasks, run: - -```bash -pnpm jake -t -``` - -However, some tasks are defined directly in `package.json` and could be run with `pnpm run`: - -- Check or fix lint errors: - - ```bash - pnpm lint - pnpm lint --fix - ``` - -- Fix formatting: - - ```bash - pnpm format:fix - ``` - -Each monorepo package might have its own scripts and tasks. You can find the package details in a README for that package. - -### Manually update reference Iroha version - -1. Update `packages/iroha-source/config.js`: - - ```js - export default { - origin: 'https://github.com/hyperledger/iroha.git', - rev: '52dc18cd81bdc1d1906ffeecb666dd9b2eb27955', - } - ``` - -2. Perform full-featured repo check, running: - - ```bash - pnpm jake run-all-checks - ``` - -3. If something is broken, fix it! - -4. If you are going to publish updated SDK, update `packages/client/README.md` and `packages/data-model/README.md`. In the beginning they have the following note: - - > This package targets `hyperledger/iroha` at current `iroha2-lts` branch, which has a hash `b783f10fa7de26ed1fdd4c526bd162f8636f1a65`. - - Put here a new Iroha 2 reference commit information. - -### SDK Compatibility Matrix Tests - -There are certain integration tests -that are part of the [Compatibility Matrix](https://hyperledger.github.io/iroha-2-docs/reference/compatibility-matrix.html) endeavour. -To read more about it, follow the [client Node integration tests](./packages/client/test/integration/test-node). +TODO diff --git a/SECURITY.md b/SECURITY.md index 2f4eba8a..a132025b 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,22 +2,16 @@ ## Reporting a Security Bug -If you think you have discovered a security issue in any of the Hyperledger -projects, we'd love to hear from you. We will take all security bugs -seriously and if confirmed upon investigation we will patch it within a -reasonable amount of time and release a public security bulletin discussing -the impact and credit the discoverer. +If you think you have discovered a security issue in any of the Hyperledger projects, we'd love to hear from you. We +will take all security bugs seriously and if confirmed upon investigation we will patch it within a reasonable amount of +time and release a public security bulletin discussing the impact and credit the discoverer. -There are two ways to report a security bug. The easiest is to email a -description of the flaw and any related information (e.g. reproduction -steps, version) to -[security at hyperledger dot org](mailto:security@hyperledger.org). +There are two ways to report a security bug. The easiest is to email a description of the flaw and any related +information (e.g. reproduction steps, version) to [security at hyperledger dot org](mailto:security@hyperledger.org). -The other way is to file a confidential security bug in our -[JIRA bug tracking system](https://jira.hyperledger.org). -Be sure to set the “Security Level” to “Security issue”. +The other way is to file a confidential security bug in our [JIRA bug tracking system](https://jira.hyperledger.org). Be +sure to set the “Security Level” to “Security issue”. -The process by which the Hyperledger Security Team handles security bugs -is documented further in our -[Defect Response](https://wiki.hyperledger.org/display/HYP/Defect+Response) -page on our [wiki](https://wiki.hyperledger.org). +The process by which the Hyperledger Security Team handles security bugs is documented further in our +[Defect Response](https://wiki.hyperledger.org/display/HYP/Defect+Response) page on our +[wiki](https://wiki.hyperledger.org). diff --git a/packages/crypto/crypto-rs/.cargo/config.toml b/crypto-wasm/.cargo/config.toml similarity index 100% rename from packages/crypto/crypto-rs/.cargo/config.toml rename to crypto-wasm/.cargo/config.toml diff --git a/packages/crypto/crypto-rs/.gitignore b/crypto-wasm/.gitignore similarity index 79% rename from packages/crypto/crypto-rs/.gitignore rename to crypto-wasm/.gitignore index 890a4596..fd7af921 100644 --- a/packages/crypto/crypto-rs/.gitignore +++ b/crypto-wasm/.gitignore @@ -1,6 +1,6 @@ /target **/*.rs.bk -Cargo.lock +# Cargo.lock bin/ pkg/ wasm-pack.log diff --git a/packages/crypto/crypto-rs/Cargo.lock b/crypto-wasm/Cargo.lock similarity index 80% rename from packages/crypto/crypto-rs/Cargo.lock rename to crypto-wasm/Cargo.lock index 1d1d364b..62da7853 100644 --- a/packages/crypto/crypto-rs/Cargo.lock +++ b/crypto-wasm/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" @@ -167,9 +167,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "base16ct" @@ -179,9 +179,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -209,9 +209,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.2" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b1be7772ee4501dba05acbe66bb1e8760f6a6c474a36035631638e4415f130" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "num-traits", "serde", @@ -331,16 +331,15 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if 1.0.0", "cpufeatures", "curve25519-dalek-derive", "digest", "fiat-crypto", - "platforms", "rustc_version", "subtle", "zeroize", @@ -354,14 +353,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "darling" -version = "0.20.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -369,34 +368,34 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "darling_macro" -version = "0.20.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -424,13 +423,13 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.76", ] [[package]] @@ -447,15 +446,21 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] +[[package]] +name = "drop_bomb" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1" + [[package]] name = "ecdsa" version = "0.16.9" @@ -497,9 +502,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "elliptic-curve" @@ -538,9 +543,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fnv" @@ -561,9 +566,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -606,9 +611,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hex" @@ -656,12 +661,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -675,8 +680,8 @@ dependencies = [ [[package]] name = "iroha_crypto" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "aead", "arrayref", @@ -727,28 +732,42 @@ dependencies = [ [[package]] name = "iroha_derive" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "darling", + "iroha_macro_utils", "manyhow", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "iroha_macro" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "iroha_derive", ] +[[package]] +name = "iroha_macro_utils" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" +dependencies = [ + "darling", + "drop_bomb", + "manyhow", + "proc-macro2", + "quote", + "syn 2.0.76", +] + [[package]] name = "iroha_numeric" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "derive_more", "displaydoc", @@ -761,8 +780,8 @@ dependencies = [ [[package]] name = "iroha_primitives" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "derive_more", "displaydoc", @@ -772,6 +791,7 @@ dependencies = [ "iroha_schema", "parity-scale-codec", "serde", + "serde_json", "serde_with", "smallstr", "smallvec", @@ -779,20 +799,20 @@ dependencies = [ [[package]] name = "iroha_primitives_derive" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "iroha_numeric", "manyhow", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "iroha_schema" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "iroha_schema_derive", "serde", @@ -800,14 +820,15 @@ dependencies = [ [[package]] name = "iroha_schema_derive" -version = "2.0.0-pre-rc.20" -source = "git+https://github.com/hyperledger/iroha.git?rev=7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb#7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb" +version = "2.0.0-rc.1.0" +source = "git+https://github.com/0x009922/iroha.git?branch=5302-expose-signature-payload#62884674440e95b706ef67f7aa5ba962858dc5bf" dependencies = [ "darling", + "iroha_macro_utils", "manyhow", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] @@ -830,15 +851,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -866,15 +887,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "manyhow" @@ -886,7 +907,7 @@ dependencies = [ "manyhow-macros", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] @@ -902,9 +923,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memory_units" @@ -914,11 +935,10 @@ checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -940,9 +960,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -955,15 +975,15 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "byte-slice-cast", @@ -973,9 +993,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -985,9 +1005,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pkcs8" @@ -999,12 +1019,6 @@ dependencies = [ "spki", ] -[[package]] -name = "platforms" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" - [[package]] name = "poly1305" version = "0.8.0" @@ -1030,11 +1044,10 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_datetime", "toml_edit", ] @@ -1075,18 +1088,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1132,9 +1145,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.34.3" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" dependencies = [ "arrayvec", "num-traits", @@ -1152,9 +1165,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scoped-tls" @@ -1178,24 +1191,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde-wasm-bindgen" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b713f70513ae1f8d92665bbbbda5c295c2cf1da5542881ae5eefe20c9af132" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" dependencies = [ "js-sys", "serde", @@ -1204,31 +1217,32 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.6.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" dependencies = [ "base64", "chrono", @@ -1242,14 +1256,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.6.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] @@ -1295,9 +1309,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" dependencies = [ "serde", ] @@ -1314,15 +1328,15 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "0d0208408ba0c3df17ed26eb06992cb1a1268d41b2c0e12e65203fbe3972cee5" [[package]] name = "syn" @@ -1337,9 +1351,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" dependencies = [ "proc-macro2", "quote", @@ -1348,29 +1362,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "num-conv", @@ -1387,15 +1401,15 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", @@ -1432,9 +1446,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "w3f-bls" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +checksum = "9c5da5fa2c6afa2c9158eaa7cd9aee249765eb32b5fb0c63ad8b9e79336a47ec" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -1462,9 +1476,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -1472,24 +1486,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1499,9 +1513,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1509,28 +1523,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-bindgen-test" -version = "0.3.41" +version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143ddeb4f833e2ed0d252e618986e18bfc7b0e52f2d28d77d05b2f045dd8eb61" +checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b" dependencies = [ "console_error_panic_hook", "js-sys", @@ -1542,20 +1556,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.41" +version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5211b7550606857312bba1d978a8ec75692eae187becc5e680444fffc5e6f89" +checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -1616,29 +1630,29 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -1651,5 +1665,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.76", ] diff --git a/packages/crypto/crypto-rs/Cargo.toml b/crypto-wasm/Cargo.toml similarity index 81% rename from packages/crypto/crypto-rs/Cargo.toml rename to crypto-wasm/Cargo.toml index d048dfcf..acd4a096 100644 --- a/packages/crypto/crypto-rs/Cargo.toml +++ b/crypto-wasm/Cargo.toml @@ -11,8 +11,8 @@ crate-type = ["cdylib", "rlib"] default = ["console_error_panic_hook"] [dependencies] -# `iroha2-dev` as of 2024-03-13 -iroha_crypto = { git = "https://github.com/hyperledger/iroha.git", rev = "7014f535d41ff3f2ebe96bae4c8d5bd1b49de5fb", default-features = false, features = ["rand"] } +# iroha_crypto = { path = "../.iroha/crates/iroha_crypto", default-features = false, features = ["rand"] } +iroha_crypto = { git = "https://github.com/0x009922/iroha.git", branch = "5302-expose-signature-payload", default-features = false, features = ["rand"] } getrandom = { version = "0.2", features = ["js"] } diff --git a/packages/crypto/crypto-rs/README.md b/crypto-wasm/README.md similarity index 71% rename from packages/crypto/crypto-rs/README.md rename to crypto-wasm/README.md index 8495e641..74d10d60 100644 --- a/packages/crypto/crypto-rs/README.md +++ b/crypto-wasm/README.md @@ -1,6 +1,7 @@ # Iroha Crypto WASM (Rust sources) -This Cargo project is a port of [`iroha_crypto` crate](https://github.com/hyperledger/iroha/tree/iroha2-lts/crypto) with `wasm_bindgen`s. +This Cargo project is a port of [`iroha_crypto` crate](https://github.com/hyperledger/iroha/tree/iroha2-lts/crypto) with +`wasm_bindgen`s. ## Rebuild WASMs @@ -32,7 +33,8 @@ fn foo_from_bar(bar: Bar) -> Foo { } ``` -After you compile this code to WASM and try to use it in JavaScript, your code will panic because `bar` is used **after it was moved to `foo_from_bar`**: +After you compile this code to WASM and try to use it in JavaScript, your code will panic because `bar` is used **after +it was moved to `foo_from_bar`**: ```js const bar = create_bar() @@ -45,9 +47,10 @@ const foo2 = foo_from_bar(bar) // ^^^ `bar` cannot be used second time ``` -In Rust, using `bar` after moving it to `foo_from_bar` causes compilation error. However, in JavaScript there is no way to prevent violation of borrowing rules. +In Rust, using `bar` after moving it to `foo_from_bar` causes compilation error. However, in JavaScript there is no way +to prevent violation of borrowing rules. -Thus, the crypto API doesn't expose any methods that *move* structs passed into them. Instead, the methods borrow them: +Thus, the crypto API doesn't expose any methods that _move_ structs passed into them. Instead, the methods borrow them: ```diff #[wasm_bindgen] @@ -56,6 +59,8 @@ Thus, the crypto API doesn't expose any methods that *move* structs passed into Foo(bar.0 - 16) } ``` + It makes the API safer. The cost of it is a higher number of clones and allocations. -You can read more details in [the PR's description](https://github.com/hyperledger/iroha-javascript/pull/69#issue-963187691). +You can read more details in +[the PR's description](https://github.com/hyperledger/iroha-javascript/pull/69#issue-963187691). diff --git a/crypto-wasm/rust-toolchain.toml b/crypto-wasm/rust-toolchain.toml new file mode 100644 index 00000000..b2a53a7c --- /dev/null +++ b/crypto-wasm/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly-2024-09-09" diff --git a/packages/crypto/crypto-rs/src/lib.rs b/crypto-wasm/src/lib.rs similarity index 69% rename from packages/crypto/crypto-rs/src/lib.rs rename to crypto-wasm/src/lib.rs index 88a5954d..e88f1191 100644 --- a/packages/crypto/crypto-rs/src/lib.rs +++ b/crypto-wasm/src/lib.rs @@ -29,24 +29,7 @@ export type Algorithm = "; #[wasm_bindgen(typescript_custom_section)] -const TS_TYPES: &str = r#" -export interface PrivateKeyJson { - algorithm: string - /** Hex-encoded bytes */ - payload: string -} - -export interface KeyPairJson { - public_key: string - private_key: PrivateKeyJson -} - -export interface SignatureJson { - public_key: string - /** Hex-encoded bytes */ - payload: string -} - +const TS_TYPES: &str = r#" export type VerifyResult = | { t: 'ok' } | { t: 'err', error: string } @@ -149,11 +132,6 @@ impl PublicKey { format!("{}", self.0) } - /// Equivalent to [`Self::to_multihash_hex`] - pub fn to_json(&self) -> String { - todo!() - } - #[wasm_bindgen(getter)] pub fn algorithm(&self) -> AlgorithmJsStr { self.0.algorithm().into() @@ -173,37 +151,13 @@ impl PublicKey { #[wasm_bindgen] pub struct PrivateKey(pub(crate) iroha_crypto::PrivateKey); -#[wasm_bindgen] -extern "C" { - #[wasm_bindgen(typescript_type = "PrivateKeyJson")] - pub type PrivateKeyJson; -} - -impl TryFrom for PrivateKey { - type Error = JsError; - - fn try_from(value: PrivateKeyJson) -> Result { - let inner: iroha_crypto::PrivateKey = serde_wasm_bindgen::from_value(value.obj)?; - Ok(Self(inner)) - } -} - -impl TryFrom<&PrivateKey> for PrivateKeyJson { - type Error = JsError; - - fn try_from(value: &PrivateKey) -> Result { - Ok(PrivateKeyJson { - obj: serde_wasm_bindgen::to_value(&value.0)?, - }) - } -} - #[wasm_bindgen] impl PrivateKey { /// # Errors - /// Fails if serialization fails - pub fn from_json(value: PrivateKeyJson) -> JsResult { - Self::try_from(value) + /// Fails if multihash parsing fails + pub fn from_multihash_hex(multihash: &str) -> JsResult { + let inner = iroha_crypto::PrivateKey::from_str(multihash).wrap_js_error()?; + Ok(Self(inner)) } /// # Errors @@ -228,10 +182,9 @@ impl PrivateKey { hex::encode(self.payload()) } - /// # Errors - /// Fails is serialisation fails - pub fn to_json(&self) -> JsResult { - self.try_into() + pub fn to_multihash_hex(&self) -> String { + // FIXME: cloning + format!("{}", iroha_crypto::ExposedPrivateKey(self.0.clone())) } } @@ -240,39 +193,8 @@ impl PrivateKey { #[wasm_bindgen] pub struct KeyPair(iroha_crypto::KeyPair); -#[wasm_bindgen] -extern "C" { - #[wasm_bindgen(typescript_type = "KeyPairJson")] - pub type KeyPairJson; -} - -impl TryFrom<&KeyPair> for KeyPairJson { - type Error = JsError; - - fn try_from(value: &KeyPair) -> Result { - Ok(KeyPairJson { - obj: serde_wasm_bindgen::to_value(&value.0)?, - }) - } -} - -impl TryFrom for KeyPair { - type Error = JsError; - - fn try_from(value: KeyPairJson) -> Result { - let inner: iroha_crypto::KeyPair = serde_wasm_bindgen::from_value(value.obj)?; - Ok(Self(inner)) - } -} - #[wasm_bindgen] impl KeyPair { - /// # Errors - /// Fails if deserialization fails - pub fn from_json(value: KeyPairJson) -> JsResult { - Self::try_from(value) - } - /// Generate a random key pair /// /// # Errors @@ -324,12 +246,6 @@ impl KeyPair { let inner = self.0.private_key().clone(); PrivateKey(inner) } - - /// # Errors - /// Fails if serialisation fails - pub fn to_json(&self) -> JsResult { - self.try_into() - } } /// Represents the signature of the data @@ -337,46 +253,15 @@ impl KeyPair { #[wasm_bindgen] pub struct Signature(iroha_crypto::Signature); -#[wasm_bindgen] -extern "C" { - #[wasm_bindgen(typescript_type = "SignatureJson")] - pub type SignatureJson; -} - -impl TryFrom for Signature { - type Error = JsError; - - fn try_from(value: SignatureJson) -> Result { - let inner: iroha_crypto::Signature = serde_wasm_bindgen::from_value(value.obj)?; - Ok(Self(inner)) - } -} - -impl TryFrom<&Signature> for SignatureJson { - type Error = JsError; - - fn try_from(value: &Signature) -> Result { - Ok(SignatureJson { - obj: serde_wasm_bindgen::to_value(&value.0)?, - }) - } -} - #[wasm_bindgen] impl Signature { - /// # Errors - /// If failed to deserialise JSON - pub fn from_json(value: SignatureJson) -> JsResult { - Self::try_from(value) - } - /// Construct the signature from raw components received from elsewhere /// /// # Errors /// - Invalid bytes input - pub fn from_bytes(public_key: &PublicKey, payload: BytesJs) -> JsResult { + pub fn from_bytes(payload: BytesJs) -> JsResult { let payload: Vec = payload.try_into()?; - let inner = iroha_crypto::Signature::from_bytes(public_key.0.clone(), &payload); + let inner = iroha_crypto::Signature::from_bytes(&payload); Ok(Self(inner)) } @@ -385,28 +270,23 @@ impl Signature { /// # Errors /// If parsing bytes input fails #[wasm_bindgen(constructor)] - pub fn new(key_pair: &KeyPair, payload: BytesJs) -> JsResult { + pub fn new(private_key: &PrivateKey, payload: BytesJs) -> JsResult { let payload: Vec = payload.try_into()?; - let inner = iroha_crypto::Signature::new(&key_pair.0, &payload); + let inner = iroha_crypto::Signature::new(&private_key.0, &payload); Ok(Self(inner)) } - /// Verify `payload` using signed data and the signature's public key + /// Verify that the signature is signed by the given public key /// /// # Errors /// - If parsing of bytes input fails /// - If failed to construct verify error - pub fn verify(&self, payload: BytesJs) -> JsResult { + pub fn verify(&self, public_key: &PublicKey, payload: BytesJs) -> JsResult { let payload: Vec<_> = payload.try_into()?; - let result = self.0.verify(&payload).try_into()?; + let result = self.0.verify(&public_key.0, &payload).try_into()?; Ok(result) } - pub fn public_key(&self) -> PublicKey { - let inner = self.0.public_key().clone(); - PublicKey(inner) - } - pub fn payload(&self) -> Vec { self.0.payload().to_vec() } @@ -414,12 +294,6 @@ impl Signature { pub fn payload_hex(&self) -> String { hex::encode(self.0.payload()) } - - /// # Errors - /// If conversion fails - pub fn to_json(&self) -> JsResult { - self.try_into() - } } #[wasm_bindgen] diff --git a/packages/crypto/crypto-rs/src/utils.rs b/crypto-wasm/src/utils.rs similarity index 97% rename from packages/crypto/crypto-rs/src/utils.rs rename to crypto-wasm/src/utils.rs index 4851262b..e33b0db1 100644 --- a/packages/crypto/crypto-rs/src/utils.rs +++ b/crypto-wasm/src/utils.rs @@ -27,7 +27,7 @@ impl JsErrorResultExt for Result { #[wasm_bindgen] extern "C" { - #[wasm_bindgen(typescript_type = "Binary")] + #[wasm_bindgen(typescript_type = "Bytes")] pub type BytesJs; } diff --git a/packages/crypto/crypto-rs/tests/web.rs b/crypto-wasm/tests/web.rs similarity index 100% rename from packages/crypto/crypto-rs/tests/web.rs rename to crypto-wasm/tests/web.rs diff --git a/deno.jsonc b/deno.jsonc new file mode 100644 index 00000000..1fefa3c1 --- /dev/null +++ b/deno.jsonc @@ -0,0 +1,104 @@ +{ + "nodeModulesDir": "auto", + "workspace": [ + "./packages/core", + "./packages/crypto-target-node", + "./packages/crypto-target-web", + "./packages/client", + + "./tests/support/test-configuration", + "./tests/support/test-peer", + "./tests/node", + "./tests/browser" + ], + "tasks": { + "install": "deno install --allow-scripts=npm:cypress,npm:@parcel/watcher,npm:vue-demi", + "prep:iroha": "deno run --allow-all ./etc/task-prep-iroha.ts", + "prep:iroha:check": { + "description": "Ensure that Iroha is built", + "command": "deno task prep:iroha --check" + }, + "prep:iroha:build": { + "description": "Build Iroha artifacts and produce `/prep/iroha` directory", + "command": "deno task prep:iroha --build" + }, + "prep:crypto-wasm": "deno run --allow-read --allow-env --allow-run --allow-write ./etc/task-prep-crypto-wasm.ts", + "prep:crypto-wasm:copy": "deno task prep:crypto-wasm --onlyCopy", + "prep:codegen": "deno run --allow-write --allow-read ./etc/task-codegen.ts", + "prep:codegen:watch": "watchexec -e ts deno task prep:codegen", + "prep:ensure-ready": { + "dependencies": ["prep:codegen", "prep:crypto-wasm:copy", "prep:iroha:check"] + }, + "check:all": { + "command": "deno check .", + "dependencies": ["prep:ensure-ready"] + }, + "test:vitest": { + "dependencies": ["prep:ensure-ready"], + "description": "Run Vitest", + "command": "vitest run" + }, + "test:integration:node": { + "dependencies": ["prep:ensure-ready"], + "command": "cd tests/node && deno task test" + }, + "test:integration:browser": { + "dependencies": ["prep:ensure-ready"], + "command": "cd tests/browser && deno task test" + }, + "test": { + "description": "Run all tests, from unit to integration", + "command": "deno task test:vitest && deno task test:integration:node && deno task test:integration:browser" + }, + "dev:run-test-peer": { + "dependencies": ["prep:ensure-ready"], + "command": "cd tests/support/test-peer && deno task run" + }, + "publish": { + // https://github.com/denoland/deno/issues/28096 + "description": "Publish workspace packages", + "command": "deno run --allow-read --allow-run --allow-env ./etc/task-publish.ts", + "dependencies": ["check:all"] + } + }, + "fmt": { + "include": ["."], + "exclude": ["**/*_generated_.ts"], + "semiColons": false, + "lineWidth": 120, + "singleQuote": true + }, + "lint": { + "include": ["."], + "rules": { + "tags": ["recommended", "jsr"], + "exclude": ["no-explicit-any", "require-await"] + } + }, + "imports": { + "@deno/vite-plugin": "npm:@deno/vite-plugin@^1.0.3", + "@std/assert": "jsr:@std/assert@^1.0.11", + "@std/async": "jsr:@std/async@^1.0.10", + "@std/encoding": "jsr:@std/encoding@^1.0.7", + "@std/fmt": "jsr:@std/fmt@^1.0.5", + "@std/toml": "jsr:@std/toml@^1.0.2", + "change-case": "npm:change-case@^5.4.4", + "dprint-node": "npm:dprint-node@^1.0.8", + "fast-equals": "npm:fast-equals@^5.2.2", + "get-port": "npm:get-port@^7.1.0", + "immutable": "npm:immutable@^5.0.3", + "jake": "npm:jake@^10.9.2", + "remeda": "npm:remeda@^2.20.1", + "ts-pattern": "npm:ts-pattern@^5.6.2", + "type-fest": "npm:type-fest@^4.33.0", + "vitest": "npm:vitest@^3.0.5", + "zx": "npm:zx@^8.3.2", + "iroha-build-utils": "./etc/iroha-build-utils.ts" + }, + "publish": { + "exclude": [ + "!**/*_generated_.ts", + "!packages/crypto-target-*/wasm-target" + ] + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 00000000..1c8d3912 --- /dev/null +++ b/deno.lock @@ -0,0 +1,2990 @@ +{ + "version": "4", + "specifiers": { + "jsr:@david/dax@*": "0.42.0", + "jsr:@david/path@0.2": "0.2.0", + "jsr:@david/which@~0.4.1": "0.4.1", + "jsr:@dprint/formatter@*": "0.4.1", + "jsr:@std/assert@0.221": "0.221.0", + "jsr:@std/assert@^1.0.11": "1.0.11", + "jsr:@std/async@^1.0.10": "1.0.10", + "jsr:@std/bytes@0.221": "0.221.0", + "jsr:@std/cli@*": "1.0.12", + "jsr:@std/collections@^1.0.9": "1.0.10", + "jsr:@std/crypto@*": "1.0.4", + "jsr:@std/encoding@*": "1.0.7", + "jsr:@std/encoding@^1.0.7": "1.0.7", + "jsr:@std/expect@*": "1.0.13", + "jsr:@std/fmt@*": "1.0.5", + "jsr:@std/fmt@1": "1.0.5", + "jsr:@std/fmt@^1.0.5": "1.0.5", + "jsr:@std/fs@*": "1.0.11", + "jsr:@std/fs@1": "1.0.11", + "jsr:@std/internal@^1.0.5": "1.0.5", + "jsr:@std/io@0.221": "0.221.0", + "jsr:@std/path@*": "1.0.8", + "jsr:@std/path@1": "1.0.8", + "jsr:@std/path@^1.0.8": "1.0.8", + "jsr:@std/streams@0.221": "0.221.0", + "jsr:@std/text@*": "1.0.10", + "jsr:@std/toml@^1.0.2": "1.0.2", + "npm:@bahmutov/cypress-esbuild-preprocessor@^2.2.0": "2.2.4_esbuild@0.24.2", + "npm:@deno/vite-plugin@^1.0.3": "1.0.3_vite@6.1.0__sass@1.84.0_sass@1.84.0", + "npm:@dprint/typescript@*": "0.93.3", + "npm:@scale-codec/core@^2.0.1": "2.0.1", + "npm:@types/node@*": "22.5.4", + "npm:@vitejs/plugin-vue@^5.0.4": "5.2.1_vite@6.1.0__sass@1.84.0_vue@3.5.13_sass@1.84.0", + "npm:@vue-kakuyaku/core@~0.4.3": "0.4.3_vue@3.5.13", + "npm:@vueuse/core@^8.0.1": "8.9.4_vue@3.5.13", + "npm:change-case@^5.4.4": "5.4.4", + "npm:cypress@^13.12.0": "13.17.0_enquirer@2.4.1", + "npm:debug@*": "4.4.0", + "npm:debug@^4.4.0": "4.4.0", + "npm:dprint-node@^1.0.8": "1.0.8", + "npm:emittery@^1.1.0": "1.1.0", + "npm:esbuild@~0.24.2": "0.24.2", + "npm:fast-equals@*": "5.2.2", + "npm:fast-equals@^5.2.2": "5.2.2", + "npm:get-port@^7.1.0": "7.1.0", + "npm:h3@^1.15.0": "1.15.0", + "npm:immutable@^5.0.3": "5.0.3", + "npm:jake@^10.9.2": "10.9.2", + "npm:listhen@^1.9.0": "1.9.0", + "npm:npm-run-all@^4.1.5": "4.1.5", + "npm:p-defer@^4.0.1": "4.0.1", + "npm:remeda@^2.20.1": "2.20.1", + "npm:sass@^1.52.1": "1.84.0", + "npm:tempy@^3.1.0": "3.1.0", + "npm:ts-pattern@^5.6.2": "5.6.2", + "npm:type-fest@^4.33.0": "4.33.0", + "npm:vite@^6.1.0": "6.1.0_sass@1.84.0", + "npm:vitest@*": "3.0.5_vite@6.1.0__sass@1.84.0_sass@1.84.0", + "npm:vitest@3.0.5": "3.0.5_vite@6.1.0__sass@1.84.0_sass@1.84.0", + "npm:vitest@^3.0.5": "3.0.5_vite@6.1.0__sass@1.84.0_sass@1.84.0", + "npm:vue@^3.2.47": "3.5.13", + "npm:ws@^8.18.0": "8.18.0", + "npm:zx@^8.3.2": "8.3.2" + }, + "jsr": { + "@david/dax@0.42.0": { + "integrity": "0c547c9a20577a6072b90def194c159c9ddab82280285ebfd8268a4ebefbd80b", + "dependencies": [ + "jsr:@david/path", + "jsr:@david/which", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", + "jsr:@std/io", + "jsr:@std/path@1", + "jsr:@std/streams" + ] + }, + "@david/path@0.2.0": { + "integrity": "f2d7aa7f02ce5a55e27c09f9f1381794acb09d328f8d3c8a2e3ab3ffc294dccd", + "dependencies": [ + "jsr:@std/fs@1", + "jsr:@std/path@1" + ] + }, + "@david/which@0.4.1": { + "integrity": "896a682b111f92ab866cc70c5b4afab2f5899d2f9bde31ed00203b9c250f225e" + }, + "@dprint/formatter@0.4.1": { + "integrity": "96449ab83aa9f72df98caa5030d3f4a921c5c29d9b0e0d0da83d79e2024a9637" + }, + "@std/assert@0.221.0": { + "integrity": "a5f1aa6e7909dbea271754fd4ab3f4e687aeff4873b4cef9a320af813adb489a" + }, + "@std/assert@1.0.11": { + "integrity": "2461ef3c368fe88bc60e186e7744a93112f16fd110022e113a0849e94d1c83c1", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/async@1.0.10": { + "integrity": "2ff1b1c7d33d1416159989b0f69e59ec7ee8cb58510df01e454def2108b3dbec" + }, + "@std/bytes@0.221.0": { + "integrity": "64a047011cf833890a4a2ab7293ac55a1b4f5a050624ebc6a0159c357de91966" + }, + "@std/cli@1.0.12": { + "integrity": "e5cfb7814d189da174ecd7a34fbbd63f3513e24a1b307feb2fcd5da47a070d90" + }, + "@std/collections@1.0.10": { + "integrity": "903af106a3d92970d74e20f7ebff77d9658af9bef4403f1dc42a7801c0575899" + }, + "@std/crypto@1.0.4": { + "integrity": "cee245c453bd5366207f4d8aa25ea3e9c86cecad2be3fefcaa6cb17203d79340" + }, + "@std/encoding@1.0.7": { + "integrity": "f631247c1698fef289f2de9e2a33d571e46133b38d042905e3eac3715030a82d" + }, + "@std/expect@1.0.13": { + "integrity": "d8e236c7089cd9fcf5e6032f27dadc3db6349d0aee48c15bc71d717bca5baa42", + "dependencies": [ + "jsr:@std/assert@^1.0.11", + "jsr:@std/internal" + ] + }, + "@std/fmt@1.0.5": { + "integrity": "0cfab43364bc36650d83c425cd6d99910fc20c4576631149f0f987eddede1a4d" + }, + "@std/fs@1.0.11": { + "integrity": "ba674672693340c5ebdd018b4fe1af46cb08741f42b4c538154e97d217b55bdd", + "dependencies": [ + "jsr:@std/path@^1.0.8" + ] + }, + "@std/internal@1.0.5": { + "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" + }, + "@std/io@0.221.0": { + "integrity": "faf7f8700d46ab527fa05cc6167f4b97701a06c413024431c6b4d207caa010da", + "dependencies": [ + "jsr:@std/assert@0.221", + "jsr:@std/bytes" + ] + }, + "@std/path@1.0.8": { + "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + }, + "@std/streams@0.221.0": { + "integrity": "47f2f74634b47449277c0ee79fe878da4424b66bd8975c032e3afdca88986e61", + "dependencies": [ + "jsr:@std/io" + ] + }, + "@std/text@1.0.10": { + "integrity": "9dcab377450253c0efa9a9a0c731040bfd4e1c03f8303b5934381467b7954338" + }, + "@std/toml@1.0.2": { + "integrity": "5892ba489c5b512265a384238a8fe8dddbbb9498b4b210ef1b9f0336a423a39b", + "dependencies": [ + "jsr:@std/collections" + ] + } + }, + "npm": { + "@babel/helper-string-parser@7.25.9": { + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + }, + "@babel/helper-validator-identifier@7.25.9": { + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + }, + "@babel/parser@7.26.7": { + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/types@7.26.7": { + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "dependencies": [ + "@babel/helper-string-parser", + "@babel/helper-validator-identifier" + ] + }, + "@bahmutov/cypress-esbuild-preprocessor@2.2.4_esbuild@0.24.2": { + "integrity": "sha512-t5xOKK+a6PlsxgRBtZDzayUcPJGDLKJt1pwKK/Y8szuDPPF+DbEsrqL8fbKgE1+koPvOVaYMX4ggwQwqfk99hA==", + "dependencies": [ + "debug@4.4.0", + "esbuild" + ] + }, + "@colors/colors@1.5.0": { + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@cypress/request@3.0.7": { + "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", + "dependencies": [ + "aws-sign2", + "aws4", + "caseless", + "combined-stream", + "extend", + "forever-agent", + "form-data", + "http-signature", + "is-typedarray", + "isstream", + "json-stringify-safe", + "mime-types", + "performance-now", + "qs", + "safe-buffer", + "tough-cookie", + "tunnel-agent", + "uuid" + ] + }, + "@cypress/xvfb@1.2.4": { + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dependencies": [ + "debug@3.2.7", + "lodash.once" + ] + }, + "@deno/vite-plugin@1.0.3_vite@6.1.0__sass@1.84.0_sass@1.84.0": { + "integrity": "sha512-As059Zjde6oaUw7+WXhu2WpnjnBzjUCs5+j21S1ilQRIorN+sCrArXpdSDsCXXnHQbCU1SHjVrjcca49YOuwIg==", + "dependencies": [ + "vite" + ] + }, + "@dprint/typescript@0.93.3": { + "integrity": "sha512-P/AAHYDyUG+5hih8knuk3s9n2wrCD1LSh0YsLlJMx6+v0Wsjf0PpcVRn+xDvHCtwPUctB5WBkZT2U8mu6Cm7RQ==" + }, + "@esbuild/aix-ppc64@0.24.2": { + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==" + }, + "@esbuild/android-arm64@0.24.2": { + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==" + }, + "@esbuild/android-arm@0.24.2": { + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==" + }, + "@esbuild/android-x64@0.24.2": { + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==" + }, + "@esbuild/darwin-arm64@0.24.2": { + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==" + }, + "@esbuild/darwin-x64@0.24.2": { + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==" + }, + "@esbuild/freebsd-arm64@0.24.2": { + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==" + }, + "@esbuild/freebsd-x64@0.24.2": { + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==" + }, + "@esbuild/linux-arm64@0.24.2": { + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==" + }, + "@esbuild/linux-arm@0.24.2": { + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==" + }, + "@esbuild/linux-ia32@0.24.2": { + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==" + }, + "@esbuild/linux-loong64@0.24.2": { + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==" + }, + "@esbuild/linux-mips64el@0.24.2": { + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==" + }, + "@esbuild/linux-ppc64@0.24.2": { + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==" + }, + "@esbuild/linux-riscv64@0.24.2": { + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==" + }, + "@esbuild/linux-s390x@0.24.2": { + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==" + }, + "@esbuild/linux-x64@0.24.2": { + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==" + }, + "@esbuild/netbsd-arm64@0.24.2": { + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==" + }, + "@esbuild/netbsd-x64@0.24.2": { + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==" + }, + "@esbuild/openbsd-arm64@0.24.2": { + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==" + }, + "@esbuild/openbsd-x64@0.24.2": { + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==" + }, + "@esbuild/sunos-x64@0.24.2": { + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==" + }, + "@esbuild/win32-arm64@0.24.2": { + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==" + }, + "@esbuild/win32-ia32@0.24.2": { + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==" + }, + "@esbuild/win32-x64@0.24.2": { + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==" + }, + "@jridgewell/sourcemap-codec@1.5.0": { + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@parcel/watcher-android-arm64@2.5.1": { + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==" + }, + "@parcel/watcher-darwin-arm64@2.5.1": { + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==" + }, + "@parcel/watcher-darwin-x64@2.5.1": { + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==" + }, + "@parcel/watcher-freebsd-x64@2.5.1": { + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==" + }, + "@parcel/watcher-linux-arm-glibc@2.5.1": { + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==" + }, + "@parcel/watcher-linux-arm-musl@2.5.1": { + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==" + }, + "@parcel/watcher-linux-arm64-glibc@2.5.1": { + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==" + }, + "@parcel/watcher-linux-arm64-musl@2.5.1": { + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==" + }, + "@parcel/watcher-linux-x64-glibc@2.5.1": { + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==" + }, + "@parcel/watcher-linux-x64-musl@2.5.1": { + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==" + }, + "@parcel/watcher-wasm@2.5.1": { + "integrity": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==", + "dependencies": [ + "is-glob", + "micromatch", + "napi-wasm" + ] + }, + "@parcel/watcher-win32-arm64@2.5.1": { + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==" + }, + "@parcel/watcher-win32-ia32@2.5.1": { + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==" + }, + "@parcel/watcher-win32-x64@2.5.1": { + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==" + }, + "@parcel/watcher@2.5.1": { + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dependencies": [ + "@parcel/watcher-android-arm64", + "@parcel/watcher-darwin-arm64", + "@parcel/watcher-darwin-x64", + "@parcel/watcher-freebsd-x64", + "@parcel/watcher-linux-arm-glibc", + "@parcel/watcher-linux-arm-musl", + "@parcel/watcher-linux-arm64-glibc", + "@parcel/watcher-linux-arm64-musl", + "@parcel/watcher-linux-x64-glibc", + "@parcel/watcher-linux-x64-musl", + "@parcel/watcher-win32-arm64", + "@parcel/watcher-win32-ia32", + "@parcel/watcher-win32-x64", + "detect-libc", + "is-glob", + "micromatch", + "node-addon-api" + ] + }, + "@rollup/rollup-android-arm-eabi@4.34.4": { + "integrity": "sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==" + }, + "@rollup/rollup-android-arm64@4.34.4": { + "integrity": "sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==" + }, + "@rollup/rollup-darwin-arm64@4.34.4": { + "integrity": "sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==" + }, + "@rollup/rollup-darwin-x64@4.34.4": { + "integrity": "sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==" + }, + "@rollup/rollup-freebsd-arm64@4.34.4": { + "integrity": "sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==" + }, + "@rollup/rollup-freebsd-x64@4.34.4": { + "integrity": "sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==" + }, + "@rollup/rollup-linux-arm-gnueabihf@4.34.4": { + "integrity": "sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==" + }, + "@rollup/rollup-linux-arm-musleabihf@4.34.4": { + "integrity": "sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==" + }, + "@rollup/rollup-linux-arm64-gnu@4.34.4": { + "integrity": "sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==" + }, + "@rollup/rollup-linux-arm64-musl@4.34.4": { + "integrity": "sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==" + }, + "@rollup/rollup-linux-loongarch64-gnu@4.34.4": { + "integrity": "sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==" + }, + "@rollup/rollup-linux-powerpc64le-gnu@4.34.4": { + "integrity": "sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==" + }, + "@rollup/rollup-linux-riscv64-gnu@4.34.4": { + "integrity": "sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==" + }, + "@rollup/rollup-linux-s390x-gnu@4.34.4": { + "integrity": "sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==" + }, + "@rollup/rollup-linux-x64-gnu@4.34.4": { + "integrity": "sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==" + }, + "@rollup/rollup-linux-x64-musl@4.34.4": { + "integrity": "sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==" + }, + "@rollup/rollup-win32-arm64-msvc@4.34.4": { + "integrity": "sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==" + }, + "@rollup/rollup-win32-ia32-msvc@4.34.4": { + "integrity": "sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==" + }, + "@rollup/rollup-win32-x64-msvc@4.34.4": { + "integrity": "sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==" + }, + "@scale-codec/core@2.0.1": { + "integrity": "sha512-3Ei7Gf3wNDrP5l7W/dEF9Q7Py1ttdNTFulzNNdFrqBw8v1khyC7SZIcYpsbAJ5uo/PDIhhK4FKOrK467I0vv4Q==", + "dependencies": [ + "@scale-codec/enum", + "@scale-codec/util" + ] + }, + "@scale-codec/enum@2.1.1": { + "integrity": "sha512-n5mTWxc4wbeIBn+HlIXjeU7PtzUAY1hqX3Y+BTd5OOCds83+DA/qB+bikKCDZ+NjDHBMZo1667vXudxjMTIW3g==" + }, + "@scale-codec/util@1.1.2": { + "integrity": "sha512-Aali9gWoI1vOUUwk2H1FktstiInl6x5rjrPd3Am/b1WJV603NEI9QcJ7UGM7Eh42UjLD9e6H7E1ZF0yFnlRUUQ==" + }, + "@types/estree@1.0.6": { + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "@types/fs-extra@11.0.4": { + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dependencies": [ + "@types/jsonfile", + "@types/node@22.5.4" + ] + }, + "@types/jsonfile@6.1.4": { + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dependencies": [ + "@types/node@22.5.4" + ] + }, + "@types/node@22.13.1": { + "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", + "dependencies": [ + "undici-types@6.20.0" + ] + }, + "@types/node@22.5.4": { + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dependencies": [ + "undici-types@6.19.8" + ] + }, + "@types/sinonjs__fake-timers@8.1.1": { + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" + }, + "@types/sizzle@2.3.9": { + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==" + }, + "@types/web-bluetooth@0.0.14": { + "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==" + }, + "@types/yauzl@2.10.3": { + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dependencies": [ + "@types/node@22.5.4" + ] + }, + "@vitejs/plugin-vue@5.2.1_vite@6.1.0__sass@1.84.0_vue@3.5.13_sass@1.84.0": { + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dependencies": [ + "vite", + "vue" + ] + }, + "@vitest/expect@3.0.5": { + "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "dependencies": [ + "@vitest/spy", + "@vitest/utils", + "chai", + "tinyrainbow" + ] + }, + "@vitest/mocker@3.0.5_vite@6.1.0__sass@1.84.0_sass@1.84.0": { + "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "dependencies": [ + "@vitest/spy", + "estree-walker@3.0.3", + "magic-string", + "vite" + ] + }, + "@vitest/pretty-format@3.0.5": { + "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", + "dependencies": [ + "tinyrainbow" + ] + }, + "@vitest/runner@3.0.5": { + "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", + "dependencies": [ + "@vitest/utils", + "pathe@2.0.2" + ] + }, + "@vitest/snapshot@3.0.5": { + "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", + "dependencies": [ + "@vitest/pretty-format", + "magic-string", + "pathe@2.0.2" + ] + }, + "@vitest/spy@3.0.5": { + "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", + "dependencies": [ + "tinyspy" + ] + }, + "@vitest/utils@3.0.5": { + "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", + "dependencies": [ + "@vitest/pretty-format", + "loupe", + "tinyrainbow" + ] + }, + "@vue-kakuyaku/core@0.4.3_vue@3.5.13": { + "integrity": "sha512-1+H3+7FA9/WocTV+jAlrnCD08sY5BtrKQ1Opvjkz4E5MRQaaIhiU5jF/tAgO1e25b+Q/01C8BiWX4a3bMgGIqw==", + "dependencies": [ + "@vueuse/core", + "type-fest@3.13.1", + "vue" + ] + }, + "@vue/compiler-core@3.5.13": { + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dependencies": [ + "@babel/parser", + "@vue/shared", + "entities", + "estree-walker@2.0.2", + "source-map-js" + ] + }, + "@vue/compiler-dom@3.5.13": { + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dependencies": [ + "@vue/compiler-core", + "@vue/shared" + ] + }, + "@vue/compiler-sfc@3.5.13": { + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dependencies": [ + "@babel/parser", + "@vue/compiler-core", + "@vue/compiler-dom", + "@vue/compiler-ssr", + "@vue/shared", + "estree-walker@2.0.2", + "magic-string", + "postcss", + "source-map-js" + ] + }, + "@vue/compiler-ssr@3.5.13": { + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dependencies": [ + "@vue/compiler-dom", + "@vue/shared" + ] + }, + "@vue/reactivity@3.5.13": { + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dependencies": [ + "@vue/shared" + ] + }, + "@vue/runtime-core@3.5.13": { + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dependencies": [ + "@vue/reactivity", + "@vue/shared" + ] + }, + "@vue/runtime-dom@3.5.13": { + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dependencies": [ + "@vue/reactivity", + "@vue/runtime-core", + "@vue/shared", + "csstype" + ] + }, + "@vue/server-renderer@3.5.13_vue@3.5.13": { + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dependencies": [ + "@vue/compiler-ssr", + "@vue/shared", + "vue" + ] + }, + "@vue/shared@3.5.13": { + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" + }, + "@vueuse/core@8.9.4_vue@3.5.13": { + "integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==", + "dependencies": [ + "@types/web-bluetooth", + "@vueuse/metadata", + "@vueuse/shared", + "vue", + "vue-demi" + ] + }, + "@vueuse/metadata@8.9.4": { + "integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==" + }, + "@vueuse/shared@8.9.4_vue@3.5.13": { + "integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==", + "dependencies": [ + "vue", + "vue-demi" + ] + }, + "acorn@8.14.0": { + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" + }, + "aggregate-error@3.1.0": { + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": [ + "clean-stack", + "indent-string" + ] + }, + "ansi-colors@4.1.3": { + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, + "ansi-escapes@4.3.2": { + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": [ + "type-fest@0.21.3" + ] + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles@3.2.1": { + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": [ + "color-convert@1.9.3" + ] + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert@2.0.1" + ] + }, + "arch@2.2.0": { + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + }, + "array-buffer-byte-length@1.0.2": { + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dependencies": [ + "call-bound", + "is-array-buffer" + ] + }, + "arraybuffer.prototype.slice@1.0.4": { + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": [ + "array-buffer-byte-length", + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "get-intrinsic", + "is-array-buffer" + ] + }, + "asn1@0.2.6": { + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": [ + "safer-buffer" + ] + }, + "assert-plus@1.0.0": { + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "assertion-error@2.0.1": { + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" + }, + "astral-regex@2.0.0": { + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async-function@1.0.0": { + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==" + }, + "async@3.2.6": { + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "asynckit@0.4.0": { + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node@1.0.0": { + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "available-typed-arrays@1.0.7": { + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": [ + "possible-typed-array-names" + ] + }, + "aws-sign2@0.7.0": { + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4@1.13.2": { + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt-pbkdf@1.0.2": { + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": [ + "tweetnacl" + ] + }, + "blob-util@2.0.2": { + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" + }, + "bluebird@3.7.2": { + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": [ + "balanced-match", + "concat-map" + ] + }, + "brace-expansion@2.0.1": { + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": [ + "balanced-match" + ] + }, + "braces@3.0.3": { + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": [ + "fill-range" + ] + }, + "buffer-crc32@0.2.13": { + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer@5.7.1": { + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": [ + "base64-js", + "ieee754" + ] + }, + "cac@6.7.14": { + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + }, + "cachedir@2.4.0": { + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==" + }, + "call-bind-apply-helpers@1.0.1": { + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": [ + "es-errors", + "function-bind" + ] + }, + "call-bind@1.0.8": { + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "get-intrinsic", + "set-function-length" + ] + }, + "call-bound@1.0.3": { + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": [ + "call-bind-apply-helpers", + "get-intrinsic" + ] + }, + "caseless@0.12.0": { + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "chai@5.1.2": { + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dependencies": [ + "assertion-error", + "check-error", + "deep-eql", + "loupe", + "pathval" + ] + }, + "chalk@2.4.2": { + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": [ + "ansi-styles@3.2.1", + "escape-string-regexp", + "supports-color@5.5.0" + ] + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": [ + "ansi-styles@4.3.0", + "supports-color@7.2.0" + ] + }, + "change-case@5.4.4": { + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" + }, + "check-error@2.1.1": { + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==" + }, + "check-more-types@2.24.0": { + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==" + }, + "chokidar@4.0.3": { + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": [ + "readdirp" + ] + }, + "ci-info@4.1.0": { + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==" + }, + "citty@0.1.6": { + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dependencies": [ + "consola" + ] + }, + "clean-stack@2.2.0": { + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-cursor@3.1.0": { + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": [ + "restore-cursor" + ] + }, + "cli-table3@0.6.5": { + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dependencies": [ + "@colors/colors", + "string-width" + ] + }, + "cli-truncate@2.1.0": { + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": [ + "slice-ansi@3.0.0", + "string-width" + ] + }, + "clipboardy@4.0.0": { + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", + "dependencies": [ + "execa@8.0.1", + "is-wsl", + "is64bit" + ] + }, + "color-convert@1.9.3": { + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": [ + "color-name@1.1.3" + ] + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name@1.1.4" + ] + }, + "color-name@1.1.3": { + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette@2.0.20": { + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "combined-stream@1.0.8": { + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": [ + "delayed-stream" + ] + }, + "commander@6.2.1": { + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + }, + "common-tags@1.8.2": { + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "confbox@0.1.8": { + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + }, + "consola@3.4.0": { + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==" + }, + "cookie-es@1.2.2": { + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + }, + "core-util-is@1.0.2": { + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "cross-spawn@6.0.6": { + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dependencies": [ + "nice-try", + "path-key@2.0.1", + "semver@5.7.2", + "shebang-command@1.2.0", + "which@1.3.1" + ] + }, + "cross-spawn@7.0.6": { + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": [ + "path-key@3.1.1", + "shebang-command@2.0.0", + "which@2.0.2" + ] + }, + "crossws@0.3.3": { + "integrity": "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==", + "dependencies": [ + "uncrypto" + ] + }, + "crypto-random-string@4.0.0": { + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dependencies": [ + "type-fest@1.4.0" + ] + }, + "csstype@3.1.3": { + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "cypress@13.17.0_enquirer@2.4.1": { + "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", + "dependencies": [ + "@cypress/request", + "@cypress/xvfb", + "@types/sinonjs__fake-timers", + "@types/sizzle", + "arch", + "blob-util", + "bluebird", + "buffer", + "cachedir", + "chalk@4.1.2", + "check-more-types", + "ci-info", + "cli-cursor", + "cli-table3", + "commander", + "common-tags", + "dayjs", + "debug@4.4.0", + "enquirer", + "eventemitter2", + "execa@4.1.0", + "executable", + "extract-zip", + "figures", + "fs-extra", + "getos", + "is-installed-globally", + "lazy-ass", + "listr2", + "lodash", + "log-symbols", + "minimist", + "ospath", + "pretty-bytes", + "process", + "proxy-from-env", + "request-progress", + "semver@7.7.1", + "supports-color@8.1.1", + "tmp", + "tree-kill", + "untildify", + "yauzl" + ] + }, + "dashdash@1.14.1": { + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": [ + "assert-plus" + ] + }, + "data-view-buffer@1.0.2": { + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-length@1.0.2": { + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-offset@1.0.1": { + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "dayjs@1.11.13": { + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "debug@3.2.7": { + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": [ + "ms" + ] + }, + "debug@4.4.0": { + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": [ + "ms" + ] + }, + "deep-eql@5.0.2": { + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" + }, + "define-data-property@1.1.4": { + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": [ + "es-define-property", + "es-errors", + "gopd" + ] + }, + "define-properties@1.2.1": { + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": [ + "define-data-property", + "has-property-descriptors", + "object-keys" + ] + }, + "defu@6.1.4": { + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, + "delayed-stream@1.0.0": { + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "destr@2.0.3": { + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" + }, + "detect-libc@1.0.3": { + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, + "dprint-node@1.0.8": { + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dependencies": [ + "detect-libc" + ] + }, + "dunder-proto@1.0.1": { + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": [ + "call-bind-apply-helpers", + "es-errors", + "gopd" + ] + }, + "ecc-jsbn@0.1.2": { + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": [ + "jsbn", + "safer-buffer" + ] + }, + "emittery@1.1.0": { + "integrity": "sha512-rsX7ktqARv/6UQDgMaLfIqUWAEzzbCQiVh7V9rhDXp6c37yoJcks12NVD+XPkgl4AEavmNhVfrhGoqYwIsMYYA==" + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream@1.4.4": { + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": [ + "once" + ] + }, + "enquirer@2.4.1": { + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dependencies": [ + "ansi-colors", + "strip-ansi" + ] + }, + "entities@4.5.0": { + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "error-ex@1.3.2": { + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": [ + "is-arrayish" + ] + }, + "es-abstract@1.23.9": { + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dependencies": [ + "array-buffer-byte-length", + "arraybuffer.prototype.slice", + "available-typed-arrays", + "call-bind", + "call-bound", + "data-view-buffer", + "data-view-byte-length", + "data-view-byte-offset", + "es-define-property", + "es-errors", + "es-object-atoms", + "es-set-tostringtag", + "es-to-primitive", + "function.prototype.name", + "get-intrinsic", + "get-proto", + "get-symbol-description", + "globalthis", + "gopd", + "has-property-descriptors", + "has-proto", + "has-symbols", + "hasown", + "internal-slot", + "is-array-buffer", + "is-callable", + "is-data-view", + "is-regex", + "is-shared-array-buffer", + "is-string", + "is-typed-array", + "is-weakref", + "math-intrinsics", + "object-inspect", + "object-keys", + "object.assign", + "own-keys", + "regexp.prototype.flags", + "safe-array-concat", + "safe-push-apply", + "safe-regex-test", + "set-proto", + "string.prototype.trim", + "string.prototype.trimend", + "string.prototype.trimstart", + "typed-array-buffer", + "typed-array-byte-length", + "typed-array-byte-offset", + "typed-array-length", + "unbox-primitive", + "which-typed-array" + ] + }, + "es-define-property@1.0.1": { + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors@1.3.0": { + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-module-lexer@1.6.0": { + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" + }, + "es-object-atoms@1.1.1": { + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": [ + "es-errors" + ] + }, + "es-set-tostringtag@2.1.0": { + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": [ + "es-errors", + "get-intrinsic", + "has-tostringtag", + "hasown" + ] + }, + "es-to-primitive@1.3.0": { + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": [ + "is-callable", + "is-date-object", + "is-symbol" + ] + }, + "esbuild@0.24.2": { + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-arm64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ] + }, + "escape-string-regexp@1.0.5": { + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "estree-walker@2.0.2": { + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "estree-walker@3.0.3": { + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": [ + "@types/estree" + ] + }, + "eventemitter2@6.4.7": { + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==" + }, + "execa@4.1.0": { + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": [ + "cross-spawn@7.0.6", + "get-stream@5.2.0", + "human-signals@1.1.1", + "is-stream@2.0.1", + "merge-stream", + "npm-run-path@4.0.1", + "onetime@5.1.2", + "signal-exit@3.0.7", + "strip-final-newline@2.0.0" + ] + }, + "execa@8.0.1": { + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": [ + "cross-spawn@7.0.6", + "get-stream@8.0.1", + "human-signals@5.0.0", + "is-stream@3.0.0", + "merge-stream", + "npm-run-path@5.3.0", + "onetime@6.0.0", + "signal-exit@4.1.0", + "strip-final-newline@3.0.0" + ] + }, + "executable@4.1.1": { + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dependencies": [ + "pify@2.3.0" + ] + }, + "expect-type@1.1.0": { + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==" + }, + "extend@3.0.2": { + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extract-zip@2.0.1": { + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": [ + "@types/yauzl", + "debug@4.4.0", + "get-stream@5.2.0", + "yauzl" + ] + }, + "extsprintf@1.3.0": { + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "fast-equals@5.2.2": { + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==" + }, + "fd-slicer@1.1.0": { + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": [ + "pend" + ] + }, + "figures@3.2.0": { + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": [ + "escape-string-regexp" + ] + }, + "filelist@1.0.4": { + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": [ + "minimatch@5.1.6" + ] + }, + "fill-range@7.1.1": { + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": [ + "to-regex-range" + ] + }, + "for-each@0.3.4": { + "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", + "dependencies": [ + "is-callable" + ] + }, + "forever-agent@0.6.1": { + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, + "form-data@4.0.1": { + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": [ + "asynckit", + "combined-stream", + "mime-types" + ] + }, + "fs-extra@9.1.0": { + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": [ + "at-least-node", + "graceful-fs", + "jsonfile", + "universalify" + ] + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name@1.1.8": { + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "functions-have-names", + "hasown", + "is-callable" + ] + }, + "functions-have-names@1.2.3": { + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "get-intrinsic@1.2.7": { + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "es-errors", + "es-object-atoms", + "function-bind", + "get-proto", + "gopd", + "has-symbols", + "hasown", + "math-intrinsics" + ] + }, + "get-port-please@3.1.2": { + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==" + }, + "get-port@7.1.0": { + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==" + }, + "get-proto@1.0.1": { + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": [ + "dunder-proto", + "es-object-atoms" + ] + }, + "get-stream@5.2.0": { + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": [ + "pump" + ] + }, + "get-stream@8.0.1": { + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" + }, + "get-symbol-description@1.1.0": { + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic" + ] + }, + "getos@3.2.1": { + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dependencies": [ + "async" + ] + }, + "getpass@0.1.7": { + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": [ + "assert-plus" + ] + }, + "global-dirs@3.0.1": { + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": [ + "ini" + ] + }, + "globalthis@1.0.4": { + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": [ + "define-properties", + "gopd" + ] + }, + "gopd@1.2.0": { + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "h3@1.15.0": { + "integrity": "sha512-OsjX4JW8J4XGgCgEcad20pepFQWnuKH+OwkCJjogF3C+9AZ1iYdtB4hX6vAb5DskBiu5ljEXqApINjR8CqoCMQ==", + "dependencies": [ + "cookie-es", + "crossws", + "defu", + "destr", + "iron-webcrypto", + "node-mock-http", + "ohash", + "radix3", + "ufo", + "uncrypto" + ] + }, + "has-bigints@1.1.0": { + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==" + }, + "has-flag@3.0.0": { + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors@1.0.2": { + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": [ + "es-define-property" + ] + }, + "has-proto@1.2.0": { + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": [ + "dunder-proto" + ] + }, + "has-symbols@1.1.0": { + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag@1.0.2": { + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": [ + "has-symbols" + ] + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, + "hosted-git-info@2.8.9": { + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "http-shutdown@1.2.2": { + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==" + }, + "http-signature@1.4.0": { + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dependencies": [ + "assert-plus", + "jsprim", + "sshpk" + ] + }, + "human-signals@1.1.1": { + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "human-signals@5.0.0": { + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" + }, + "ieee754@1.2.1": { + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "immutable@5.0.3": { + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==" + }, + "indent-string@4.0.0": { + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "ini@2.0.0": { + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + }, + "internal-slot@1.1.0": { + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dependencies": [ + "es-errors", + "hasown", + "side-channel" + ] + }, + "iron-webcrypto@1.2.1": { + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==" + }, + "is-array-buffer@3.0.5": { + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": [ + "call-bind", + "call-bound", + "get-intrinsic" + ] + }, + "is-arrayish@0.2.1": { + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-async-function@2.1.1": { + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dependencies": [ + "async-function", + "call-bound", + "get-proto", + "has-tostringtag", + "safe-regex-test" + ] + }, + "is-bigint@1.1.0": { + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": [ + "has-bigints" + ] + }, + "is-boolean-object@1.2.2": { + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-callable@1.2.7": { + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-core-module@2.16.1": { + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": [ + "hasown" + ] + }, + "is-data-view@1.0.2": { + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dependencies": [ + "call-bound", + "get-intrinsic", + "is-typed-array" + ] + }, + "is-date-object@1.1.0": { + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-docker@3.0.0": { + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-finalizationregistry@1.1.1": { + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": [ + "call-bound" + ] + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function@1.1.0": { + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": [ + "call-bound", + "get-proto", + "has-tostringtag", + "safe-regex-test" + ] + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": [ + "is-extglob" + ] + }, + "is-inside-container@1.0.0": { + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": [ + "is-docker" + ] + }, + "is-installed-globally@0.4.0": { + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": [ + "global-dirs", + "is-path-inside" + ] + }, + "is-map@2.0.3": { + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, + "is-number-object@1.1.1": { + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-inside@3.0.3": { + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-regex@1.2.1": { + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": [ + "call-bound", + "gopd", + "has-tostringtag", + "hasown" + ] + }, + "is-set@2.0.3": { + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer@1.0.4": { + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": [ + "call-bound" + ] + }, + "is-stream@2.0.1": { + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-stream@3.0.0": { + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "is-string@1.1.1": { + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-symbol@1.1.1": { + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": [ + "call-bound", + "has-symbols", + "safe-regex-test" + ] + }, + "is-typed-array@1.1.15": { + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": [ + "which-typed-array" + ] + }, + "is-typedarray@1.0.0": { + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-unicode-supported@0.1.0": { + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-weakmap@2.0.2": { + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakref@1.1.1": { + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dependencies": [ + "call-bound" + ] + }, + "is-weakset@2.0.4": { + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": [ + "call-bound", + "get-intrinsic" + ] + }, + "is-wsl@3.1.0": { + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dependencies": [ + "is-inside-container" + ] + }, + "is64bit@2.0.0": { + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "dependencies": [ + "system-architecture" + ] + }, + "isarray@2.0.5": { + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isstream@0.1.2": { + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "jake@10.9.2": { + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dependencies": [ + "async", + "chalk@4.1.2", + "filelist", + "minimatch@3.1.2" + ] + }, + "jiti@2.4.2": { + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==" + }, + "jsbn@0.1.1": { + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "json-parse-better-errors@1.0.2": { + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema@0.4.0": { + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-stringify-safe@5.0.1": { + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "jsonfile@6.1.0": { + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": [ + "graceful-fs", + "universalify" + ] + }, + "jsprim@2.0.2": { + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dependencies": [ + "assert-plus", + "extsprintf", + "json-schema", + "verror" + ] + }, + "lazy-ass@1.6.0": { + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==" + }, + "listhen@1.9.0": { + "integrity": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==", + "dependencies": [ + "@parcel/watcher", + "@parcel/watcher-wasm", + "citty", + "clipboardy", + "consola", + "crossws", + "defu", + "get-port-please", + "h3", + "http-shutdown", + "jiti", + "mlly", + "node-forge", + "pathe@1.1.2", + "std-env", + "ufo", + "untun", + "uqr" + ] + }, + "listr2@3.14.0_enquirer@2.4.1": { + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dependencies": [ + "cli-truncate", + "colorette", + "enquirer", + "log-update", + "p-map", + "rfdc", + "rxjs", + "through", + "wrap-ansi@7.0.0" + ] + }, + "load-json-file@4.0.0": { + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": [ + "graceful-fs", + "parse-json", + "pify@3.0.0", + "strip-bom" + ] + }, + "lodash.once@4.1.1": { + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols@4.1.0": { + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": [ + "chalk@4.1.2", + "is-unicode-supported" + ] + }, + "log-update@4.0.0": { + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": [ + "ansi-escapes", + "cli-cursor", + "slice-ansi@4.0.0", + "wrap-ansi@6.2.0" + ] + }, + "loupe@3.1.3": { + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==" + }, + "magic-string@0.30.17": { + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, + "math-intrinsics@1.1.0": { + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "memorystream@0.3.1": { + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" + }, + "merge-stream@2.0.0": { + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch@4.0.8": { + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": [ + "braces", + "picomatch" + ] + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": [ + "mime-db" + ] + }, + "mimic-fn@2.1.0": { + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-fn@4.0.0": { + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": [ + "brace-expansion@1.1.11" + ] + }, + "minimatch@5.1.6": { + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": [ + "brace-expansion@2.0.1" + ] + }, + "minimist@1.2.8": { + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mlly@1.7.4": { + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dependencies": [ + "acorn", + "pathe@2.0.2", + "pkg-types", + "ufo" + ] + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nanoid@3.3.8": { + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" + }, + "napi-wasm@1.1.3": { + "integrity": "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg==" + }, + "nice-try@1.0.5": { + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-addon-api@7.1.1": { + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + }, + "node-forge@1.3.1": { + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-mock-http@1.0.0": { + "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==" + }, + "normalize-package-data@2.5.0": { + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": [ + "hosted-git-info", + "resolve", + "semver@5.7.2", + "validate-npm-package-license" + ] + }, + "npm-run-all@4.1.5": { + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dependencies": [ + "ansi-styles@3.2.1", + "chalk@2.4.2", + "cross-spawn@6.0.6", + "memorystream", + "minimatch@3.1.2", + "pidtree", + "read-pkg", + "shell-quote", + "string.prototype.padend" + ] + }, + "npm-run-path@4.0.1": { + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": [ + "path-key@3.1.1" + ] + }, + "npm-run-path@5.3.0": { + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": [ + "path-key@4.0.0" + ] + }, + "object-inspect@1.13.4": { + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + }, + "object-keys@1.1.1": { + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign@4.1.7": { + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-object-atoms", + "has-symbols", + "object-keys" + ] + }, + "ohash@1.1.4": { + "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==" + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "onetime@5.1.2": { + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": [ + "mimic-fn@2.1.0" + ] + }, + "onetime@6.0.0": { + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": [ + "mimic-fn@4.0.0" + ] + }, + "ospath@1.2.2": { + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==" + }, + "own-keys@1.0.1": { + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dependencies": [ + "get-intrinsic", + "object-keys", + "safe-push-apply" + ] + }, + "p-defer@4.0.1": { + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==" + }, + "p-map@4.0.0": { + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": [ + "aggregate-error" + ] + }, + "parse-json@4.0.0": { + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": [ + "error-ex", + "json-parse-better-errors" + ] + }, + "path-key@2.0.1": { + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-key@4.0.0": { + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type@3.0.0": { + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": [ + "pify@3.0.0" + ] + }, + "pathe@1.1.2": { + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + }, + "pathe@2.0.2": { + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==" + }, + "pathval@2.0.0": { + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==" + }, + "pend@1.2.0": { + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "performance-now@2.1.0": { + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pidtree@0.3.1": { + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==" + }, + "pify@2.3.0": { + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pify@3.0.0": { + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + }, + "pkg-types@1.3.1": { + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dependencies": [ + "confbox", + "mlly", + "pathe@2.0.2" + ] + }, + "possible-typed-array-names@1.0.0": { + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, + "postcss@8.5.1": { + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "pretty-bytes@5.6.0": { + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "process@0.11.10": { + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "proxy-from-env@1.0.0": { + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" + }, + "pump@3.0.2": { + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": [ + "end-of-stream", + "once" + ] + }, + "qs@6.13.1": { + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dependencies": [ + "side-channel" + ] + }, + "radix3@1.1.2": { + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + }, + "read-pkg@3.0.0": { + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dependencies": [ + "load-json-file", + "normalize-package-data", + "path-type" + ] + }, + "readdirp@4.1.1": { + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==" + }, + "reflect.getprototypeof@1.0.10": { + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "es-object-atoms", + "get-intrinsic", + "get-proto", + "which-builtin-type" + ] + }, + "regexp.prototype.flags@1.5.4": { + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": [ + "call-bind", + "define-properties", + "es-errors", + "get-proto", + "gopd", + "set-function-name" + ] + }, + "remeda@2.20.1": { + "integrity": "sha512-gsEsSmjE0CHkNp6xEsWsU/6JVNWq7rqw+ZfzNMbVV4YFIPtTj/i0FfxurTRI6Z9sAnQufU9de2Cb3xHsUTFTMA==", + "dependencies": [ + "type-fest@4.33.0" + ] + }, + "request-progress@3.0.0": { + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dependencies": [ + "throttleit" + ] + }, + "resolve@1.22.10": { + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ] + }, + "restore-cursor@3.1.0": { + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": [ + "onetime@5.1.2", + "signal-exit@3.0.7" + ] + }, + "rfdc@1.4.1": { + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "rollup@4.34.4": { + "integrity": "sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==", + "dependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loongarch64-gnu", + "@rollup/rollup-linux-powerpc64le-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-msvc", + "@types/estree", + "fsevents" + ] + }, + "rxjs@7.8.1": { + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": [ + "tslib" + ] + }, + "safe-array-concat@1.1.3": { + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dependencies": [ + "call-bind", + "call-bound", + "get-intrinsic", + "has-symbols", + "isarray" + ] + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-push-apply@1.0.0": { + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": [ + "es-errors", + "isarray" + ] + }, + "safe-regex-test@1.1.0": { + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": [ + "call-bound", + "es-errors", + "is-regex" + ] + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass@1.84.0": { + "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==", + "dependencies": [ + "@parcel/watcher", + "chokidar", + "immutable", + "source-map-js" + ] + }, + "semver@5.7.2": { + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "semver@7.7.1": { + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==" + }, + "set-function-length@1.2.2": { + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": [ + "define-data-property", + "es-errors", + "function-bind", + "get-intrinsic", + "gopd", + "has-property-descriptors" + ] + }, + "set-function-name@2.0.2": { + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": [ + "define-data-property", + "es-errors", + "functions-have-names", + "has-property-descriptors" + ] + }, + "set-proto@1.0.0": { + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": [ + "dunder-proto", + "es-errors", + "es-object-atoms" + ] + }, + "shebang-command@1.2.0": { + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": [ + "shebang-regex@1.0.0" + ] + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": [ + "shebang-regex@3.0.0" + ] + }, + "shebang-regex@1.0.0": { + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote@1.8.2": { + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==" + }, + "side-channel-list@1.0.0": { + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": [ + "es-errors", + "object-inspect" + ] + }, + "side-channel-map@1.0.1": { + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect" + ] + }, + "side-channel-weakmap@1.0.2": { + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect", + "side-channel-map" + ] + }, + "side-channel@1.1.0": { + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": [ + "es-errors", + "object-inspect", + "side-channel-list", + "side-channel-map", + "side-channel-weakmap" + ] + }, + "siginfo@2.0.0": { + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, + "signal-exit@3.0.7": { + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "signal-exit@4.1.0": { + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "slice-ansi@3.0.0": { + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": [ + "ansi-styles@4.3.0", + "astral-regex", + "is-fullwidth-code-point" + ] + }, + "slice-ansi@4.0.0": { + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": [ + "ansi-styles@4.3.0", + "astral-regex", + "is-fullwidth-code-point" + ] + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "spdx-correct@3.2.0": { + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": [ + "spdx-expression-parse", + "spdx-license-ids" + ] + }, + "spdx-exceptions@2.5.0": { + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "spdx-expression-parse@3.0.1": { + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": [ + "spdx-exceptions", + "spdx-license-ids" + ] + }, + "spdx-license-ids@3.0.21": { + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + }, + "sshpk@1.18.0": { + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": [ + "asn1", + "assert-plus", + "bcrypt-pbkdf", + "dashdash", + "ecc-jsbn", + "getpass", + "jsbn", + "safer-buffer", + "tweetnacl" + ] + }, + "stackback@0.0.2": { + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, + "std-env@3.8.0": { + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": [ + "emoji-regex", + "is-fullwidth-code-point", + "strip-ansi" + ] + }, + "string.prototype.padend@3.1.6": { + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-object-atoms" + ] + }, + "string.prototype.trim@1.2.10": { + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dependencies": [ + "call-bind", + "call-bound", + "define-data-property", + "define-properties", + "es-abstract", + "es-object-atoms", + "has-property-descriptors" + ] + }, + "string.prototype.trimend@1.0.9": { + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-object-atoms" + ] + }, + "string.prototype.trimstart@1.0.8": { + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": [ + "call-bind", + "define-properties", + "es-object-atoms" + ] + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": [ + "ansi-regex" + ] + }, + "strip-bom@3.0.0": { + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, + "strip-final-newline@2.0.0": { + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-final-newline@3.0.0": { + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + }, + "supports-color@5.5.0": { + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": [ + "has-flag@3.0.0" + ] + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": [ + "has-flag@4.0.0" + ] + }, + "supports-color@8.1.1": { + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": [ + "has-flag@4.0.0" + ] + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "system-architecture@0.1.0": { + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==" + }, + "temp-dir@3.0.0": { + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==" + }, + "tempy@3.1.0": { + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dependencies": [ + "is-stream@3.0.0", + "temp-dir", + "type-fest@2.19.0", + "unique-string" + ] + }, + "throttleit@1.0.1": { + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==" + }, + "through@2.3.8": { + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "tinybench@2.9.0": { + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" + }, + "tinyexec@0.3.2": { + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + }, + "tinypool@1.0.2": { + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==" + }, + "tinyrainbow@2.0.0": { + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==" + }, + "tinyspy@3.0.2": { + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==" + }, + "tldts-core@6.1.76": { + "integrity": "sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==" + }, + "tldts@6.1.76": { + "integrity": "sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==", + "dependencies": [ + "tldts-core" + ] + }, + "tmp@0.2.3": { + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==" + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": [ + "is-number" + ] + }, + "tough-cookie@5.1.0": { + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", + "dependencies": [ + "tldts" + ] + }, + "tree-kill@1.2.2": { + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + }, + "ts-pattern@5.6.2": { + "integrity": "sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==" + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "tunnel-agent@0.6.0": { + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": [ + "safe-buffer" + ] + }, + "tweetnacl@0.14.5": { + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "type-fest@0.21.3": { + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "type-fest@1.4.0": { + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + }, + "type-fest@2.19.0": { + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "type-fest@3.13.1": { + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" + }, + "type-fest@4.33.0": { + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==" + }, + "typed-array-buffer@1.0.3": { + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": [ + "call-bound", + "es-errors", + "is-typed-array" + ] + }, + "typed-array-byte-length@1.0.3": { + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array" + ] + }, + "typed-array-byte-offset@1.0.4": { + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array", + "reflect.getprototypeof" + ] + }, + "typed-array-length@1.0.7": { + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "is-typed-array", + "possible-typed-array-names", + "reflect.getprototypeof" + ] + }, + "ufo@1.5.4": { + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" + }, + "unbox-primitive@1.1.0": { + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dependencies": [ + "call-bound", + "has-bigints", + "has-symbols", + "which-boxed-primitive" + ] + }, + "uncrypto@0.1.3": { + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "undici-types@6.19.8": { + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "undici-types@6.20.0": { + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "unique-string@3.0.0": { + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dependencies": [ + "crypto-random-string" + ] + }, + "universalify@2.0.1": { + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "untildify@4.0.0": { + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" + }, + "untun@0.1.3": { + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", + "dependencies": [ + "citty", + "consola", + "pathe@1.1.2" + ] + }, + "uqr@0.1.2": { + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" + }, + "uuid@8.3.2": { + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "validate-npm-package-license@3.0.4": { + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": [ + "spdx-correct", + "spdx-expression-parse" + ] + }, + "verror@1.10.0": { + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dependencies": [ + "assert-plus", + "core-util-is", + "extsprintf" + ] + }, + "vite-node@3.0.5_sass@1.84.0": { + "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", + "dependencies": [ + "cac", + "debug@4.4.0", + "es-module-lexer", + "pathe@2.0.2", + "vite" + ] + }, + "vite@6.1.0_sass@1.84.0": { + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", + "dependencies": [ + "esbuild", + "fsevents", + "postcss", + "rollup", + "sass" + ] + }, + "vitest@3.0.5_vite@6.1.0__sass@1.84.0_sass@1.84.0": { + "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "dependencies": [ + "@vitest/expect", + "@vitest/mocker", + "@vitest/pretty-format", + "@vitest/runner", + "@vitest/snapshot", + "@vitest/spy", + "@vitest/utils", + "chai", + "debug@4.4.0", + "expect-type", + "magic-string", + "pathe@2.0.2", + "std-env", + "tinybench", + "tinyexec", + "tinypool", + "tinyrainbow", + "vite", + "vite-node", + "why-is-node-running" + ] + }, + "vue-demi@0.14.10_vue@3.5.13": { + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dependencies": [ + "vue" + ] + }, + "vue@3.5.13": { + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dependencies": [ + "@vue/compiler-dom", + "@vue/compiler-sfc", + "@vue/runtime-dom", + "@vue/server-renderer", + "@vue/shared" + ] + }, + "which-boxed-primitive@1.1.1": { + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dependencies": [ + "is-bigint", + "is-boolean-object", + "is-number-object", + "is-string", + "is-symbol" + ] + }, + "which-builtin-type@1.2.1": { + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dependencies": [ + "call-bound", + "function.prototype.name", + "has-tostringtag", + "is-async-function", + "is-date-object", + "is-finalizationregistry", + "is-generator-function", + "is-regex", + "is-weakref", + "isarray", + "which-boxed-primitive", + "which-collection", + "which-typed-array" + ] + }, + "which-collection@1.0.2": { + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": [ + "is-map", + "is-set", + "is-weakmap", + "is-weakset" + ] + }, + "which-typed-array@1.1.18": { + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "call-bound", + "for-each", + "gopd", + "has-tostringtag" + ] + }, + "which@1.3.1": { + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": [ + "isexe" + ] + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": [ + "isexe" + ] + }, + "why-is-node-running@2.3.0": { + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dependencies": [ + "siginfo", + "stackback" + ] + }, + "wrap-ansi@6.2.0": { + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": [ + "ansi-styles@4.3.0", + "string-width", + "strip-ansi" + ] + }, + "wrap-ansi@7.0.0": { + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": [ + "ansi-styles@4.3.0", + "string-width", + "strip-ansi" + ] + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws@8.18.0": { + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + }, + "yauzl@2.10.0": { + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": [ + "buffer-crc32", + "fd-slicer" + ] + }, + "zx@8.3.2": { + "integrity": "sha512-qjTunv1NClO05jDaUjrNZfpqC9yvNCchge/bzOcQevsh1aM5qE3TG6MY24kuQKlOWx+7vNuhqO2wa9nQCIGvZA==", + "dependencies": [ + "@types/fs-extra", + "@types/node@22.13.1" + ] + } + }, + "workspace": { + "dependencies": [ + "jsr:@std/assert@^1.0.11", + "jsr:@std/async@^1.0.10", + "jsr:@std/encoding@^1.0.7", + "jsr:@std/fmt@^1.0.5", + "jsr:@std/toml@^1.0.2", + "npm:@deno/vite-plugin@^1.0.3", + "npm:change-case@^5.4.4", + "npm:dprint-node@^1.0.8", + "npm:fast-equals@^5.2.2", + "npm:get-port@^7.1.0", + "npm:immutable@^5.0.3", + "npm:jake@^10.9.2", + "npm:remeda@^2.20.1", + "npm:ts-pattern@^5.6.2", + "npm:type-fest@^4.33.0", + "npm:vitest@^3.0.5", + "npm:zx@^8.3.2" + ], + "members": { + "packages/client": { + "dependencies": [ + "npm:debug@^4.4.0", + "npm:emittery@^1.1.0", + "npm:p-defer@^4.0.1", + "npm:ws@^8.18.0" + ] + }, + "packages/core": { + "dependencies": [ + "jsr:@std/encoding@^1.0.7", + "npm:@scale-codec/core@^2.0.1", + "npm:type-fest@^4.33.0" + ] + }, + "tests/browser": { + "packageJson": { + "dependencies": [ + "npm:@bahmutov/cypress-esbuild-preprocessor@^2.2.0", + "npm:@deno/vite-plugin@^1.0.3", + "npm:@vitejs/plugin-vue@^5.0.4", + "npm:@vue-kakuyaku/core@~0.4.3", + "npm:@vueuse/core@^8.0.1", + "npm:cypress@^13.12.0", + "npm:esbuild@~0.24.2", + "npm:npm-run-all@^4.1.5", + "npm:sass@^1.52.1", + "npm:vite@^6.1.0", + "npm:vue@^3.2.47" + ] + } + }, + "tests/support/test-configuration": { + "dependencies": [ + "npm:tempy@^3.1.0" + ] + }, + "tests/support/test-peer": { + "dependencies": [ + "npm:debug@^4.4.0", + "npm:h3@^1.15.0", + "npm:listhen@^1.9.0", + "npm:tempy@^3.1.0" + ] + } + } + } +} diff --git a/etc/codegen.spec.ts b/etc/codegen.spec.ts new file mode 100644 index 00000000..0c74d17d --- /dev/null +++ b/etc/codegen.spec.ts @@ -0,0 +1,225 @@ +import { describe, expect, test } from 'vitest' +import { + type EmitCode, + type EmitsMap, + enumShortcuts, + type EnumShortcutTreeVariant, + renderShortcutsTree, +} from './codegen.ts' +import * as dprint from 'dprint-node' + +async function formatTS(code: string): Promise { + return dprint.format('whichever.ts', code, { semiColons: 'asi', quoteStyle: 'preferSingle' }) +} + +describe('enum shortcuts', () => { + const SAMPLE = { + A: { + t: 'enum', + variants: [ + { tag: 'Unit', discriminant: 0, type: { t: 'null' } }, + { tag: 'WithType', type: { t: 'local', id: 'Whichever' }, discriminant: 1 }, + { tag: 'Nested', type: { t: 'local', id: 'B' }, discriminant: 2 }, + ], + }, + B: { + t: 'enum', + variants: [ + { tag: 'Bunit', discriminant: 0, type: { t: 'null' } }, + { discriminant: 1, tag: 'Bnested', type: { t: 'local', id: 'C' } }, + ], + }, + C: { + t: 'enum', + variants: [ + { tag: 'CUnit', discriminant: 0, type: { t: 'null' } }, + { discriminant: 1, tag: 'Cfinal', type: { t: 'local', id: 'Whichever' } }, + ], + }, + Whichever: { t: 'alias', to: { t: 'lib', id: 'AccountId' } }, + } satisfies Record + + const SAMPLE_MAP = new Map(Object.entries(SAMPLE)) + + test('build shortcuts tree', () => { + const tree = enumShortcuts(SAMPLE.A.variants, SAMPLE_MAP) + + expect(tree).toMatchInlineSnapshot(` + [ + { + "name": "Unit", + "t": "unit", + }, + { + "name": "WithType", + "t": "value", + "value_ty": { + "id": "Whichever", + "t": "local", + }, + }, + { + "name": "Nested", + "t": "enum", + "tree": { + "id": "B", + "variants": [ + { + "name": "Bunit", + "t": "unit", + }, + { + "name": "Bnested", + "t": "enum", + "tree": { + "id": "C", + "variants": [ + { + "name": "CUnit", + "t": "unit", + }, + { + "name": "Cfinal", + "t": "value", + "value_ty": { + "id": "Whichever", + "t": "local", + }, + }, + ], + }, + }, + ], + }, + }, + ] + `) + }) + + test('build: takes aliases into consideration', () => { + const map: EmitsMap = new Map([ + ['Foo', { t: 'alias', to: { t: 'local', id: 'Bar' } }], + ['Bar', { t: 'enum', variants: [{ discriminant: 0, tag: 'Baz', type: { t: 'null' } }] }], + ]) + + const tree = enumShortcuts([{ discriminant: 0, tag: 'Bar', type: { t: 'local', id: 'Foo' } }], map) + + expect(tree).toMatchInlineSnapshot(` + [ + { + "name": "Bar", + "t": "enum", + "tree": { + "id": "Foo", + "variants": [ + { + "name": "Baz", + "t": "unit", + }, + ], + }, + }, + ] + `) + }) + + test('build: omits enums without variants', () => { + const map: EmitsMap = new Map([ + ['Foo', { t: 'enum', variants: [] }], + [ + 'Bar', + { + t: 'enum', + variants: [ + { discriminant: 0, tag: 'Baz', type: { t: 'null' } }, + { discriminant: 1, tag: 'Foo', type: { t: 'local', id: 'Foo' } }, + ], + }, + ], + // nested void + ['Void0', { t: 'enum', variants: [{ discriminant: 0, tag: 'Void1', type: { t: 'local', id: 'Void1' } }] }], + ['Void1', { t: 'enum', variants: [{ discriminant: 0, tag: 'Foo', type: { t: 'local', id: 'Foo' } }] }], + ]) + + const tree = enumShortcuts( + [ + { discriminant: 0, tag: 'foo', type: { t: 'local', id: 'Foo' } }, + { discriminant: 1, tag: 'bar', type: { t: 'local', id: 'Bar' } }, + { discriminant: 2, tag: 'void', type: { t: 'local', id: 'Void0' } }, + ], + map, + ) + + expect(tree).toEqual( + [ + { + name: 'bar', + t: 'enum', + tree: { + id: 'Bar', + variants: [{ name: 'Baz', t: 'unit' }], + }, + }, + ] satisfies EnumShortcutTreeVariant[], + ) + }) + + test('generate shortcut tree', async () => { + const TREE = { id: 'A', variants: enumShortcuts(SAMPLE.A.variants, SAMPLE_MAP) } + const type = renderShortcutsTree(TREE, 'type') + const value = renderShortcutsTree(TREE, 'value') + + const full = ` + type test = ${type} + const test = ${value} + ` + + expect(await formatTS(full)).toMatchInlineSnapshot( + ` + "type test = { + Unit: lib.VariantUnit<'Unit'> + WithType: (value: T) => lib.Variant<'WithType', T> + Nested: { + Bunit: lib.Variant<'Nested', lib.VariantUnit<'Bunit'>> + Bnested: { + CUnit: lib.Variant< + 'Nested', + lib.Variant<'Bnested', lib.VariantUnit<'CUnit'>> + > + Cfinal: ( + value: T, + ) => lib.Variant< + 'Nested', + lib.Variant<'Bnested', lib.Variant<'Cfinal', T>> + > + } + } + } + const test = { + Unit: Object.freeze({ kind: 'Unit' }), + WithType: ( + value: T, + ): lib.Variant<'WithType', T> => ({ kind: 'WithType', value }), + Nested: { + Bunit: Object.freeze>>({ + kind: 'Nested', + value: B.Bunit, + }), + Bnested: { + CUnit: Object.freeze< + lib.Variant<'Nested', lib.Variant<'Bnested', lib.VariantUnit<'CUnit'>>> + >({ kind: 'Nested', value: B.Bnested.CUnit }), + Cfinal: ( + value: T, + ): lib.Variant< + 'Nested', + lib.Variant<'Bnested', lib.Variant<'Cfinal', T>> + > => ({ kind: 'Nested', value: B.Bnested.Cfinal(value) }), + }, + }, + } + " + `, + ) + }) +}) diff --git a/etc/codegen.ts b/etc/codegen.ts new file mode 100644 index 00000000..ac0d3970 --- /dev/null +++ b/etc/codegen.ts @@ -0,0 +1,1384 @@ +import type { EnumDefinition, NamedStructDefinition, Schema, SchemaTypeDefinition } from '@iroha/core/data-model/schema' +import { toCamelCase as camelCase } from 'jsr:@std/text' +import { deepEqual } from 'npm:fast-equals' +import { assert as assert, fail } from '@std/assert' +import { match, P } from 'ts-pattern' + +// TODO: return HashOf<..> ? Hard. Requires all hashable items to implement Hash on instances => why not all make all types as classes, finally... + +export function generateDataModel(resolver: Resolver, libModule: string): string { + const { emits } = resolver + + const arranged = arrangeEmits(emits) + + return [ + `import * as lib from '${libModule}'`, + ...arranged.map((id) => renderEmit(id, emits)), + ...generateQueryMaps(emits), + ].join('\n\n') +} + +function unreachable(message: string): never { + throw new Error(`unreachable invariant: ${message}`) +} + +export function generateClientFindAPI(resolver: Resolver, libClient: string): string { + const queryBox = resolver.emits.get('QueryBox') + assert(queryBox && queryBox.t === 'enum') + + const iterableQueryMethods = queryBox.variants.map((x) => { + const { payload, predicate, selector } = match(x.type) + .with( + { + t: 'local', + id: 'QueryWithFilter', + params: [ + P.select('payload'), + { t: 'lib', id: 'CompoundPredicate', params: [{ t: 'local', id: P.select('predicate') }] }, + { t: 'lib', id: 'Vec', params: [{ t: 'local', id: P.select('selector') }] }, + ], + }, + (bindings) => ({ + ...bindings, + payload: match(bindings.payload) + .with({ t: 'null' }, () => null) + .with({ t: P.union('lib', 'local'), id: P.select() }, (id) => id) + .otherwise(() => unreachable('unexpected payload type')), + }), + ) + .otherwise(() => unreachable('unexpected query box variant')) + + assert(x.tag.startsWith('Find')) + const methodName = camelCase(x.tag.slice('Find'.length)) + + const payloadArg = payload ? `payload: dm.${payload}, ` : '' + const payloadArgValue = payload ? `payload` : `null` + + return ( + `/**\n* Convenience method for \`${x.tag}\` query, a variant of {@link dm.QueryBox} enum.\n` + + `* - Predicate type: {@link dm.${predicate}}\n` + + `* - Selector type: {@link dm.${selector}}\n */\n` + + ` public ${methodName}>(${payloadArg}params?: P): ` + + `client.QueryHandle> {` + + `return client.buildQueryHandle(this._executor, '${x.tag}', ${payloadArgValue}, params) }\n` + ) + }) + + const singularQueryBox = resolver.emits.get('SingularQueryBox') + assert(singularQueryBox && singularQueryBox.t === 'enum') + + const singularQueryMethods = singularQueryBox.variants.map((x) => { + assert(x.tag.startsWith('Find')) + const methodName = camelCase(x.tag.slice('Find'.length)) + + // const predicateType = + + return ( + `\n/** Convenience method for \`${x.tag}\` query, a variant of {@link dm.SingularQueryBox} enum. */` + + ` public ${methodName}(): Promise> {` + + `return client.executeSingularQuery(this._executor, '${x.tag}') }` + ) + }) + + return [ + `import * as client from '${libClient}'`, + `import type * as core from '@iroha/core'`, + `import type * as dm from '@iroha/core/data-model'`, + `export class FindAPI {`, + ` private _executor: client.QueryExecutor`, + ` public constructor(executor: client.QueryExecutor) { this._executor = executor; }`, + ...iterableQueryMethods, + ...singularQueryMethods, + `}`, + ].join('\n') +} + +export type Ident = string + +export type EmitsMap = Map + +export type EmitCode = + | { t: 'enum'; variants: EmitEnumVariant[] } + | { t: 'struct'; fields: EmitStructField[] } + | { t: 'tuple'; elements: TypeRef[] } + | { t: 'bitmap'; repr: LibType; masks: EmitBitmapMask[] } + | { t: 'alias'; to: TypeRef } + +export interface EmitStructField { + name: string + type: TypeRef +} + +export interface EmitBitmapMask { + name: string + mask: number +} + +export type TypeRefWithEmit = (TypeRef & { t: 'local'; emit?: () => EmitCode }) | Exclude + +export interface EmitEnumVariant { + tag: string + discriminant: number + /** "null" means an empty variant */ + type: TypeRef +} + +export type TypeRef = + | { t: 'local'; id: Ident; params?: TypeRef[]; lazy?: boolean } + | { t: 'lib'; id: LibType; params?: TypeRef[] } + | { t: 'lib-array'; len: number; type: TypeRef } + | { t: 'lib-b-tree-set-with-cmp'; type: TypeRef; compareFn: string } + | { t: 'param'; index: number } + | { t: 'null' } + +/** + * Types available in the library + */ +export type LibType = + | 'BytesVec' + | 'String' + | 'U8' + | 'U16' + | 'U32' + | 'U64' + | 'U128' + | 'NonZero' + | 'Option' + | 'Compact' + | 'Vec' + | 'BTreeSet' + | 'BTreeMap' + | 'Json' + | 'Bool' + | 'Timestamp' + | 'Duration' + | 'Name' + | 'CompoundPredicate' + | 'DomainId' + | `AccountId` + | `AssetDefinitionId` + | `AssetId` + | 'Algorithm' + | 'Signature' + | 'Hash' + | 'PublicKey' + +export class Resolver { + #schema: Schema + #resolved: Map = new Map() + #emits: EmitsMap = new Map() + + constructor(schema: Schema) { + this.#schema = schema + + this.resolveAll() + this.fillEmits() + this.processNeverEnums() + } + + private resolveAll() { + for (const key of Object.keys(this.#schema)) { + this.resolve(key) + } + } + + private fillEmits() { + for (const [originId, resolved] of this.#resolved) { + if (resolved.t === 'local' && resolved.emit) { + const prevEmit = this.#emits.get(resolved.id) + const newEmit = resolved.emit() + if (prevEmit) { + assert( + deepEqual(newEmit, prevEmit), + `Generic type emit differs for: ${resolved.id} (original id: ${originId})`, + ) + } else { + this.#emits.set(resolved.id, newEmit) + } + } + } + } + + private processNeverEnums() { + for (const [id, emit] of this.#emits) { + if (emit.t === 'enum') { + const tree = enumShortcuts(emit.variants, this.#emits) + if (!tree.length) { + // never type + this.#emits.set(id, { t: 'enum', variants: [] }) + } + } + } + } + + public get emits() { + return this.#emits + } + + private resolve(refOrStr: string | SchemaId): TypeRefWithEmit { + const [ref, refStr] = typeof refOrStr === 'string' + ? [SchemaId.parse(refOrStr), refOrStr] + : [refOrStr, refOrStr.toStr()] + + if (!this.#resolved.has(refStr)) { + assert(refStr in this.#schema, `Couldn't find schema for '${refStr}'`) + const schema = this.#schema[refStr] + const resolved = this.resolveInner(ref, refStr, schema) + + if (resolved.t === 'local' && CYCLE_BREAK_POINTS.has(resolved.id)) resolved.lazy = true + + this.#resolved.set(refStr, resolved) + return resolved + } + + return this.#resolved.get(refStr)! + } + + private resolveInner(ref: null | SchemaId, refStr: string, schema: SchemaTypeDefinition): TypeRefWithEmit { + return ( + match({ ref, refStr, schema }) + .returnType() + .with({ refStr: '()' }, () => ({ t: 'null' })) + // redundant unused type + .with({ ref: { id: 'MerkleTree', items: [P._] } }, () => ({ t: 'null' })) + .with({ refStr: 'bool' }, () => ({ t: 'lib', id: 'Bool' })) + .with( + { + ref: { + id: P.union( + 'String', + 'Json', + 'Name', + 'DomainId', + 'AccountId', + 'AssetId', + 'AssetDefinitionId', + 'Compact', + 'Algorithm', + ).select(), + }, + }, + (id) => ({ t: 'lib', id }), + ) + .with( + { refStr: P.union('u8', 'u16', 'u32', 'u64', 'u128').select('int'), schema: { Int: 'FixedWidth' } }, + ({ int }) => ({ + t: 'lib', + id: upcase(int), + }), + ) + .with( + { refStr: 'BlockSignature', schema: { Tuple: [P.select('index').and('u64'), P.select('signature')] } }, + ({ index, signature }) => ({ + t: 'local', + id: 'BlockSignature', + emit: () => ({ + t: 'struct', + fields: [ + { name: 'peer_topology_index', type: this.resolve(index) }, + { name: 'signature', type: this.resolve(signature) }, + ], + }), + }), + ) + .with( + { + ref: { id: P.union('Register', 'Unregister'), items: [P._] }, + schema: { Struct: [{ name: 'object', type: P.select('object') }] }, + }, + ({ object }) => this.resolve(object), + ) + .with( + { + ref: { id: P.select('id').and('SetKeyValue'), items: [P._] }, + schema: { Struct: [{ name: 'object', type: P.select('obj') }, P.select('key'), P.select('value')] }, + }, + ({ id, obj, key, value }) => ({ + t: 'local', + id, + params: [this.resolve(obj)], + emit: () => ({ + t: 'struct', + fields: [ + { name: 'object', type: { t: 'param', index: 0 } }, + ...[key, value].map((x) => ({ name: x.name, type: this.resolve(x.type) })), + ], + }), + }), + ) + .with( + { + ref: { id: P.select('id').and('RemoveKeyValue'), items: [P._] }, + schema: { Struct: [{ name: 'object', type: P.select('obj') }, P.select('key')] }, + }, + ({ id, obj, key }) => ({ + t: 'local', + id, + params: [this.resolve(obj)], + emit: () => ({ + t: 'struct', + fields: [ + { name: 'object', type: { t: 'param', index: 0 } }, + { name: key.name, type: this.resolve(key.type) }, + ], + }), + }), + ) + .with( + { + ref: { id: P.union('Mint', 'Burn', 'Grant', 'Revoke').select('id'), items: [P._, P._] }, + schema: { + Struct: [ + { name: 'object', type: P.select('obj') }, + { name: 'destination', type: P.select('dest') }, + ], + }, + }, + ({ id, obj, dest }) => ({ + t: 'local', + id, + params: [obj, dest].map((x) => this.resolve(x)), + emit: () => ({ + t: 'struct', + fields: [ + { name: 'object', type: { t: 'param', index: 0 } }, + { name: 'destination', type: { t: 'param', index: 1 } }, + ], + }), + }), + ) + .with( + { + ref: { id: 'Transfer', items: [P._, P._, P._] }, + schema: { Struct: P.select('fields', [{ name: 'source' }, { name: 'object' }, { name: 'destination' }]) }, + }, + ({ fields }) => ({ + t: 'local', + id: 'Transfer', + params: fields.map((x) => this.resolve(x.type)), + emit: () => ({ + t: 'struct', + fields: fields.map((x, i): EmitStructField => ({ ...x, type: { t: 'param', index: i } })), + }), + }), + ) + .with( + { + ref: { id: P.select('id', 'QueryWithFilter'), items: [P.select('generic')] }, + schema: { + Struct: P.select('fields', [{ name: 'query' }, { name: 'predicate' }, { name: 'selector' }]), + }, + }, + ({ id, generic, fields }): TypeRefWithEmit => { + assert(generic.toStr() === fields[0].type) + return { + t: 'local', + id, + params: fields.map((x) => this.resolve(x.type)), + emit: () => ({ + t: 'struct', + fields: fields.map((x, i) => ({ name: x.name, type: { t: 'param', index: i } })), + }), + } + }, + ) + .with( + { + ref: { + id: P.select('id'), + items: [{ id: P.union('PredicateMarker', 'SelectorMarker').select('marker'), items: [] }], + }, + schema: P.select('schema'), + }, + ({ id, marker, schema }) => ({ + t: 'local', + id: id + marker.slice(0, -'Marker'.length), + emit: (): EmitCode => + match(schema) + .with({ Struct: P.select() }, (fields): EmitCode => ({ t: 'struct', fields: this.mapFields(fields) })) + .with( + { Enum: P.select() }, + (variants): EmitCode => ({ t: 'enum', variants: this.mapVariants(variants) }), + ) + .otherwise(() => { + throw new Error(`Unexpected predicate/selector shape: ${id}`) + }), + }), + ) + .with( + { + ref: { id: 'MetadataChanged', items: [P._] }, + schema: { + Struct: [ + { name: 'target', type: P.select('target') }, + P.select('key').and({ name: 'key' }), + P.select('value').and({ name: 'value' }), + ], + }, + }, + ({ target, key, value }) => ({ + t: 'local', + id: 'MetadataChanged', + params: [this.resolve(target)], + emit: (): EmitCode => ({ + t: 'struct', + fields: [{ name: 'target', type: { t: 'param', index: 0 } }, ...this.mapFields([key, value])], + }), + }), + ) + .with( + { + ref: { id: 'SelectorTuple', items: [P._] }, + schema: P.string.select(), + }, + (target) => this.resolve(target), + ) + .with( + { + ref: P.select('ref', { id: 'CompoundPredicate', items: [P._] }), + refStr: P.select('refStr'), + schema: { + Enum: [ + { tag: 'Atom', type: P.string.select('tyAtom') }, + { tag: 'Not', type: P.string.select('tyNot') }, + { tag: 'And', type: P.string.select('tyAnd') }, + { tag: 'Or', type: P.select('tyOr') }, + ], + }, + }, + (bindings): TypeRef => { + assert(bindings.refStr === bindings.tyNot) + assert(bindings.tyAnd === bindings.tyOr) + assert(deepEqual(SchemaId.parse(bindings.tyAnd), new SchemaId('Vec', [bindings.ref]))) + return { t: 'lib', id: 'CompoundPredicate', params: [this.resolve(bindings.tyAtom)] } + }, + ) + .with( + { + ref: { id: 'Mismatch', items: [P._] }, + schema: { Struct: P.select('fields', [{ name: 'expected' }, { name: 'actual' }]) }, + }, + ({ fields }) => { + assert(fields[0].type === fields[1].type) + return { + t: 'local', + id: 'Mismatch', + params: [this.resolve(fields[0].type)], + emit: () => ({ + t: 'struct', + fields: fields.map((x) => ({ ...x, type: { t: 'param', index: 0 } })), + }), + } + }, + ) + .with( + { + ref: { id: P.union('Ipv4Addr', 'Ipv6Addr').select('ip'), items: [] }, + schema: P.string.select('arr'), + }, + ({ ip, arr }) => { + const { len, type } = match(this.resolve(arr)) + .with( + { t: 'lib-array', len: P.union(4, 8), type: { t: 'lib', id: P.union('U8', 'U16') } }, + ({ len, type }) => ({ len, type }), + ) + .otherwise(() => { + throw new Error(`Unexpected type for ${ip}`) + }) + + return { + t: 'local', + id: ip, + emit: () => ({ + t: 'tuple', + elements: Array.from({ length: len }, () => type), + }), + } + }, + ) + .with( + P.union( + { ref: { id: 'SignatureOf', items: [P._] }, schema: 'Signature' }, + { refStr: P.union('TransactionSignature', 'QuerySignature') }, + ), + () => ({ t: 'lib', id: 'Signature' }), + ) + .with({ ref: { id: 'HashOf', items: [P._] }, schema: 'Hash' }, () => ({ t: 'lib', id: 'Hash' })) + .with({ refStr: P.union('Hash', 'PublicKey', 'Signature').select() }, (id) => ({ + t: 'lib', + id, + })) + .with( + { refStr: 'FetchSize', schema: { Struct: [{ name: 'fetch_size', type: P.select() }] } }, + (type) => this.resolve(type), + ) + .with({ refStr: 'BlockSubscriptionRequest', schema: 'NonZero' }, ({ refStr, schema }) => ({ + t: 'local', + id: refStr, + emit: (): EmitCode => ({ + t: 'struct', + fields: [{ name: 'from_block_height', type: this.resolve(schema) }], + }), + })) + .with({ refStr: 'EventSubscriptionRequest', schema: P.string }, ({ refStr, schema }) => { + const filters = this.resolve(schema) + assert(filters.t === 'lib' && filters.id === 'Vec') + + return { + t: 'local', + id: refStr, + emit: (): EmitCode => ({ + t: 'struct', + fields: [{ name: 'filters', type: filters }], + }), + } + }) + .with( + { + refStr: P.select('id', 'QueryOutputBatchBoxTuple'), + schema: { Struct: [{ name: 'tuple', type: P.select('alias') }] }, + }, + ({ id, alias }) => ({ + t: 'local', + id, + emit: (): EmitCode => ({ t: 'alias', to: this.resolve(alias) }), + }), + ) + .with( + { + ref: { id: P.select('id'), items: [] }, + schema: { Struct: [{ name: 'name', type: 'Name' }] }, + }, + ({ id }) => ({ t: 'local', id, emit: () => ({ t: 'alias', to: { t: 'lib', id: 'Name' } }) }), + ) + .with( + { ref: { id: P.select('id'), items: [] }, schema: { Bitmap: { repr: 'u32', masks: P.select('masks') } } }, + ({ id, masks }) => ({ + t: 'local', + id, + emit: () => ({ + t: 'bitmap', + masks, + repr: 'U32', + }), + }), + ) + .with( + { ref: { id: 'Option', items: [P._] }, schema: { Option: P.string.select() } }, + (type): TypeRef => ({ t: 'lib', id: 'Option', params: [this.resolve(type)] }), + ) + .with({ ref: { id: 'SortedVec', items: [{ id: 'Permission' }] } }, () => ({ + t: 'local', + id: 'PermissionsSet', + emit: () => ({ + t: 'alias', + to: { + t: 'lib-b-tree-set-with-cmp', + type: this.resolve('Permission'), + compareFn: `(a, b) => { + const names = lib.ordCompare(a.name, b.name) + if (names !== 0) return names + return lib.ordCompare(a.payload, b.payload) + }`, + }, + }), + })) + .with({ ref: { id: 'Vec', items: [{ id: 'u8' }] } }, () => ({ + t: 'lib', + id: 'BytesVec', + })) + .with( + { + ref: { id: P.union('Vec', 'SortedVec').select('id'), items: [P._] }, + schema: { Vec: P.string.select('type') }, + }, + ({ id, type }): TypeRef => ({ + t: 'lib', + id: id === 'SortedVec' ? 'BTreeSet' : id, + params: [this.resolve(type)], + }), + ) + .with( + { + ref: { id: 'Array', items: [P._, P._] }, + schema: { Array: { len: P.select('len'), type: P.select('type') } }, + }, + ({ len, type }) => ({ + t: 'lib-array', + len: Number(len), + type: this.resolve(type), + }), + ) + // maps + .with( + { + ref: { id: 'SortedMap', items: [P._, P._] }, + schema: { Map: { key: P.select('key'), value: P.select('value') } }, + }, + ({ key, value }) => ({ + t: 'lib', + id: 'BTreeMap', + params: [key, value].map((x) => this.resolve(x)), + }), + ) + // non-specific structures without generics + .with( + { ref: { id: P.select('id'), items: [] }, schema: { Struct: P.select('fields') } }, + ({ id, fields }): TypeRefWithEmit => ({ + t: 'local', + id, + emit: () => ({ + t: 'struct', + fields: this.mapFields(fields), + }), + }), + ) + // non-specific enums without generics + .with( + { ref: { id: P.select('id'), items: [] }, schema: { Enum: P.select('variants') } }, + ({ id, variants }): TypeRefWithEmit => ({ + t: 'local', + id, + emit: () => ({ + t: 'enum', + variants: this.mapVariants(variants), + }), + }), + ) + .with( + { ref: { id: 'NonZero', items: [{ id: P.select('int'), items: [] }] }, schema: P.string.select('int2') }, + ({ int, int2 }) => { + assert(int === int2) + return { + t: 'lib', + id: 'NonZero', + params: [this.resolve(int)], + } + }, + ) + // lightweight aliases + .with({ ref: { id: P.select('id'), items: [] }, schema: P.string.select('target') }, ({ id, target }) => ({ + t: 'local', + id, + emit: (): EmitCode => ({ + t: 'alias', + to: this.resolve(target), + }), + })) + // null types - useless? + .with({ schema: null }, () => ({ t: 'null' })) + .otherwise(({ refStr }) => { + throw new Error(`Could not resolve "${refStr}"`) + }) + ) + } + + private produceType(ref: T): T { + this.#resolved.set(ref.id, ref) + return ref + } + + private mapFields(items: NamedStructDefinition['Struct']): EmitStructField[] { + return items.map((x): EmitStructField => { + if (x.name.endsWith('_ms')) { + const rewriteWith = match(x.name) + .returnType() + .with( + P.union('start_ms', 'creation_time_ms', 'since_ms', 'proposed_at_ms', 'expires_at_ms'), + () => 'Timestamp', + ) + .otherwise(() => 'Duration') + + const type = match([rewriteWith, this.resolve(x.type)]) + .returnType() + .with([P._, { t: 'lib', id: 'U64' }], () => ({ t: 'lib', id: rewriteWith })) + .with(['Timestamp', { t: 'lib', id: 'NonZero', params: [{ t: 'lib', id: 'U64' }] }], () => { + // FIXME + console.warn( + `Field that seems to be a timestamp is declared as NonZero: "${x.name}".\n` + + `That is an issue in the schema. Rewriting it as just Timestamp.\n` + + `Remove this code when the schema fixed.`, + ) + return { + t: 'lib', + id: rewriteWith, + } + }) + .with( + [P._, { t: 'lib', id: P.union('Option', 'NonZero').select(), params: [{ t: 'lib', id: 'U64' }] }], + (base) => ({ + t: 'lib', + id: base, + params: [{ t: 'lib', id: rewriteWith }], + }), + ) + .with( + [ + 'Duration', + { t: 'lib', id: 'Option', params: [{ t: 'lib', id: 'NonZero', params: [{ t: 'lib', id: 'U64' }] }] }, + ], + () => ({ + t: 'lib', + id: 'Option', + params: [{ t: 'lib', id: 'NonZero', params: [{ t: 'lib', id: rewriteWith }] }], + }), + ) + .otherwise(() => { + throw new Error(`Unexpected type of a field with _ms suffix: ${x.type}`) + }) + return { name: x.name.slice(0, -3), type } + } + return match(x) + .returnType() + .with({ name: 'errors', type: P.when((y) => y.includes('TransactionRejectionReason')) }, (errorsField) => { + return match(this.resolve(errorsField.type)) + .returnType() + .with( + { + t: 'lib', + id: 'BTreeMap', + params: [ + P.select('index', { t: 'lib', id: 'U64' }), + P.select('error', { t: 'local', id: 'TransactionRejectionReason' }), + ], + }, + ({ index, error }): EmitStructField => { + const errWithIndex = this.produceType({ + t: 'local', + id: 'TransactionErrorWithIndex', + emit: () => ({ + t: 'struct', + fields: [ + { name: 'index', type: index }, + { name: 'error', type: error }, + ], + }), + }) + const map = this.produceType({ + t: 'local', + id: 'TransactionErrors', + emit: () => ({ + t: 'alias', + to: { + t: 'lib-b-tree-set-with-cmp', + type: errWithIndex, + compareFn: `(a, b) => lib.ordCompare(a.index, b.index)`, + }, + }), + }) + return { + name: x.name, + type: map, + } + }, + ) + .otherwise(() => { + throw new Error(`unexpected errors shape: ${errorsField.type}`) + }) + }) + .otherwise(() => ({ name: x.name, type: this.resolve(x.type) })) + }) + } + + private mapVariants(items: EnumDefinition['Enum']): EmitEnumVariant[] { + return items.map((x) => { + if (x.tag.endsWith('Ms')) { + assert(x.type === 'u64') + return { ...x, tag: x.tag.slice(0, -2), type: { t: 'lib', id: 'Duration' } } + } + + const type = match(x) + .returnType() + .with({ type: P.string }, ({ type }) => this.resolve(type)) + .otherwise(() => ({ t: 'null' })) + return { ...x, type } + }) + } +} + +export class SchemaId { + // TODO: remove path check? + static parse(src: string): null | SchemaId { + const stack: SchemaId[] = [new SchemaId('__root__')] + + for (const [token] of src.matchAll(/(<|>|(?:[\w_]+|::)+)/gi)) { + if (token === '<') { + const lastItem = stack.at(-1)?.items.at(-1) + assert(lastItem, 'should be') + stack.push(lastItem) + } else if (token === '>') { + assert(stack.pop(), 'should be') + } else { + const head = stack.at(-1) + assert(head, 'should be') + const idWithPath = token.split('::') + const id = idWithPath.at(-1)! + // const path = idWithPath.length > 1 ? idWithPath.slice(0, -1) : undefined + head.items.push(new SchemaId(id)) + } + } + + return match(stack) + .with([{ id: '__root__', items: [P.select()] }], (trueRoot) => trueRoot) + .otherwise(() => null) + } + + id: string + items: SchemaId[] + + constructor(id: string, items: SchemaId[] = []) { + this.id = id + this.items = items + } + + eq(other: SchemaId): boolean { + return ( + this.id === other.id && + this.items.length === other.items.length && + this.items.every((child, i) => child.eq(other.items[i])) + ) + } + + toStr(): string { + return this.id + (this.items.length ? '<' + this.items.map((x) => x.toStr()).join(', ') + '>' : '') + } +} + +export interface EnumShortcutsTree { + id: string + variants: EnumShortcutTreeVariant[] +} + +export type EnumShortcutTreeVariant = + & { name: string } + & ( + | { t: 'unit' } + | { t: 'value'; value_ty: TypeRef } + | { t: 'enum'; tree: EnumShortcutsTree } + ) + +function findEnum(map: EmitsMap, id: string): null | (EmitCode & { t: 'enum' }) { + const type = map.get(id) + assert(type, 'must be in schema') + if (type.t === 'enum') return type + if (type.t === 'alias' && type.to.t === 'local') return findEnum(map, type.to.id) + return null +} + +export function enumShortcuts(variants: EmitEnumVariant[], types: EmitsMap): EnumShortcutTreeVariant[] { + return variants.flatMap((variant): (EnumShortcutTreeVariant & { name: string })[] => { + if (variant.type.t === 'null') return [{ name: variant.tag, t: 'unit' }] + if (variant.type.t === 'local') { + const found = findEnum(types, variant.type.id) + if (found) { + const variants = enumShortcuts(found.variants, types) + // there are some "never" enums, and we don't need shortcuts for them + if (!variants.length) return [] + return [ + { + t: 'enum', + name: variant.tag, + tree: { id: variant.type.id, variants }, + }, + ] + } + } + return [{ t: 'value', value_ty: variant.type, name: variant.tag }] + }) +} + +/** + * Yields each {@link TypeRef} inside a given one (and including it) + */ +function* visitRefs(ref: TypeRef): Generator { + yield ref + if ((ref.t === 'lib' || ref.t === 'local') && ref.params) { + for (const param of ref.params) { + yield* visitRefs(param) + } + } else if (ref.t === 'lib-b-tree-set-with-cmp') { + yield ref.type + } +} + +function* visitEmitRefs(emit: EmitCode): Generator { + switch (emit.t) { + case 'enum': { + for (const i of emit.variants) yield* visitRefs(i.type) + break + } + case 'struct': { + for (const i of emit.fields) yield* visitRefs(i.type) + break + } + case 'tuple': { + for (const i of emit.elements) yield* visitRefs(i) + break + } + case 'alias': { + yield* visitRefs(emit.to) + break + } + } +} + +/** + * See {@link arrangeEmits} + */ +const CYCLE_BREAK_POINTS = new Set(['InstructionBox']) + +/** + * Arranges entries in a _topological order_ using [depth-first search](https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search). + * + * The algorithm is designed for DAGs (directed **acyclic** graphs). + * However, the schema has _one_ cycle, with `InstructionBox` type. + * To resolve this, the algorithm pretends as if no one refers to `InstructionBox`. + * For this reason, **all** references to `InstructionBox` in the emitted code **must be lazy**. + */ +function arrangeEmits(map: EmitsMap): string[] { + const graph = new Map>() + for (const [key, emit] of map) { + const refs = new Set() + for (const ident of visitEmitRefs(emit)) { + if (ident.t === 'local') { + if (CYCLE_BREAK_POINTS.has(ident.id)) assert(ident.lazy, `reference from ${key} to ${ident.id} must be lazy`) + else refs.add(ident.id) + } + } + graph.set(key, refs) + } + + const temporary = new Set() + const permanent = new Set() + const sorted = new Array() + + function visit(n: string) { + if (permanent.has(n)) return + if (temporary.has(n)) throw new Error(`cycle: ${n}`) + + temporary.add(n) + for (const m of graph.get(n)!) visit(m) + + temporary.delete(n) + permanent.add(n) + sorted.push(n) + } + + for (const n of graph.keys()) { + visit(n) + } + + assert(sorted.length === map.size) + return sorted +} + +interface RefRender { + /** type-layer, `T` */ + type: string + /** expression of type `Codec` */ + codec: string + /** runtime-layer ID (e.g. for direct aliasing) when possible */ + valueId?: string +} + +function renderGetCodec(x: string) { + return `lib.getCodec(${x})` +} + +function renderRef(ref: TypeRef): RefRender { + return match(ref) + .returnType() + .with({ t: 'local', params: P.array() }, ({ id, params }) => { + const valueId = `${id}.with(${params.map((x) => renderRef(x).codec).join(', ')})` + return { + type: id + `<${params.map((x) => renderRef(x).type).join(', ')}>`, + codec: valueId, + valueId, + } + }) + .with({ t: 'local' }, ({ id, lazy }) => { + const codec = renderGetCodec(id) + return { + type: id, + codec: lazy ? `lib.lazyCodec(() => ${codec})` : codec, + valueId: lazy ? undefined : id, + } + }) + .with({ t: 'lib', params: P.array() }, ({ id, params }) => { + const typeGenerics = `<${params.map((x) => renderRef(x).type).join(', ')}>` + const valueId = `lib.${id}.with(${params.map((x) => renderRef(x).codec).join(', ')})` + + return { + type: `lib.${id}${typeGenerics}`, + codec: valueId, + } + }) + .with({ t: 'lib' }, ({ id }) => { + return { + type: `lib.${id}`, + codec: renderGetCodec(`lib.${id}`), + valueId: `lib.${id}`, + } + }) + .with({ t: 'lib-array' }, () => { + throw new Error('This type of reference exists on pre-render stage only, really') + }) + .with({ t: 'lib-b-tree-set-with-cmp' }, ({ compareFn, type }) => { + return { + type: `lib.BTreeSet<${renderRef(type).type}>`, + codec: `lib.BTreeSet.withCmp(${renderRef(type).codec}, ${compareFn})`, + } + }) + .with({ t: 'param' }, ({ index }) => { + return { + type: `T${index}`, + codec: `t${index}`, + } + }) + .with({ t: 'null' }, () => ({ + type: 'null', + codec: 'lib.nullCodec', + })) + .exhaustive() +} + +function renderBaseEnumCodec(variants: EmitEnumVariant[]): string { + const types = variants.map((variant) => + match(variant) + .with({ type: { t: 'null' } }, ({ tag }) => `${tag}: []`) + .otherwise(({ tag, type }) => `${tag}: [${renderRef(type).type}]`) + ) + const options = variants.map((variant) => + match(variant) + .with({ type: { t: 'null' } }, ({ tag, discriminant }) => `${tag}: [${discriminant}]`) + .otherwise(({ tag, discriminant, type }) => `${tag}: [${discriminant}, ${renderRef(type).codec}]`) + ) + return `lib.enumCodec<{ ${types.join(', ')} }>({ ${options.join(', ')} })` +} + +function renderSumTypes(variants: EmitEnumVariant[]) { + const mapped = variants.map((variant) => + match(variant) + .with({ type: { t: 'null' } }, ({ tag }) => `lib.VariantUnit<'${tag}'>`) + .otherwise(({ tag, type }) => `lib.Variant<'${tag}', ${renderRef(type).type}>`) + ) + + return mapped.join(' | ') +} + +export function renderShortcutsTree(root: EnumShortcutsTree, kind: 'type' | 'value'): string { + interface State { + head: { id0: string; var0: string } + chain: string[] + } + + const nextState = (stateIn: State | null, tree: EnumShortcutsTree, variant: EnumShortcutTreeVariant): State => + match(stateIn) + .returnType() + .with(null, () => ({ head: { id0: tree.id, var0: variant.name }, chain: [] })) + .with({ chain: [] }, ({ head }) => ({ head, chain: [tree.id, variant.name] })) + .otherwise(({ head, chain }) => ({ head, chain: [...chain, variant.name] })) + + const genChain = (chain: string[]) => chain.join('.') + const genConcreteType = ( + state: State, + variant: Pick, 't' | 'name'>, + ): string => { + const last = match(variant) + .with({ t: 'unit' }, ({ name }) => `lib.VariantUnit<'${name}'>`) + .with({ t: 'value' }, ({ name }) => `lib.Variant<'${name}', T>`) + .exhaustive() + + const first = match(state) + .returnType() + .with({ chain: [] }, () => []) + .otherwise(({ head: { var0 }, chain: [_head, ...tail] }) => [var0, ...tail.slice(0, -1)]) + first.reverse() + + return first.reduce((acc, item) => `lib.Variant<'${item}', ${acc}>`, last) + } + + function iter(tree: EnumShortcutsTree, stateIn: State | null = null) { + const items = tree.variants + .map((variant): string => { + const state = nextState(stateIn, tree, variant) + + const { type, value } = match(variant) + .returnType<{ type: string; value: string }>() + .with({ t: 'unit' }, (variant) => + match(state) + .with( + { chain: [] }, + ({ head }) => ({ + value: `${variant.name}: Object.freeze({ kind: '${head.var0}' })`, + type: `${variant.name}: ` + genConcreteType(state, variant), + }), + ) + .otherwise( + ({ head, chain }) => ({ + value: `${variant.name}: Object.freeze<${ + genConcreteType(state, variant) + }>({ kind: '${head.var0}', value: ${ + genChain( + chain, + ) + } })`, + type: `${variant.name}: ` + genConcreteType(state, variant), + }), + )) + .with({ t: 'value' }, (variant) => { + const valueFnBody = match(state) + .with({ chain: [] }, ({ head }) => `({ kind: '${head.var0}', value })`) + .otherwise(({ head, chain }) => `({ kind: '${head.var0}', value: ${genChain(chain)}(value) })`) + + const valueTy = renderRef(variant.value_ty).type + const returnTy = genConcreteType( + state, + variant, + ) + + const type = `${variant.name}: (value: T) => ${returnTy}` + const value = `${variant.name}: (value: T): ${returnTy} => ${valueFnBody}` + + return { type, value } + }) + .with({ t: 'enum' }, ({ tree }) => { + const nested = iter(tree, state) + const type = `${variant.name}: ${nested}` + return { + type, + value: type, + } + }) + .exhaustive() + + return kind === 'type' ? type : value + }) + + return `{ ${items.join(', ')} }` + } + + return iter(root) +} + +function renderJsDoc(lines: string[]): string { + return `/**\n` + lines.map((x) => ` * ${x}\n`).join('') + ` */` +} + +function renderEmit(id: string, map: EmitsMap): string { + const emit = map.get(id) + assert(emit) + return match(emit) + .returnType() + .with({ t: 'enum', variants: [] }, () => [ + renderJsDoc([ + `This type could not be constructed.`, + ``, + `It is a enumeration without any variants that could be created _at this time_. However,`, + `in future it is possible that this type will be extended with actual constructable variants.`, + ]), + `export type ${id} = never`, + renderJsDoc([ + `Codec for {@link ${id}}. `, + ``, + `Since the type is \`never\`, this codec does nothing and throws an error if actually called.`, + ]), + `export const ${id}: lib.CodecContainer = lib.defineCodec(lib.neverCodec)`, + ]) + .with({ t: 'enum' }, ({ variants }) => { + const tree = { id, variants: enumShortcuts(variants, map) } + const shortcutsValue = renderShortcutsTree(tree, 'value') + const shortcutsType = renderShortcutsTree(tree, 'type') + + const codec = renderBaseEnumCodec(variants) + `.discriminated()` + + const explicitType = `lib.CodecContainer<${id}> & ${shortcutsType}` + + return [ + renderJsDoc([ + `Enumeration (discriminated union). Represented as one of the following variants:`, + ``, + ...variants.map((x) => `- \`${x.tag}\``), + '', + `TODO how to construct, how to use`, + ]), + `export type ${id} = ${renderSumTypes(variants)}`, + renderJsDoc([`Codec and constructors for enumeration {@link ${id}}.`]), + `export const ${id}: ${explicitType} = { ...${shortcutsValue}, ...lib.defineCodec(${codec}) }`, + ] + }) + .with({ t: 'struct' }, ({ fields }) => { + let maxGenericsIndex = -1 + for (const field of fields) { + for (const ty of visitRefs(field.type)) { + if (ty.t === 'param') maxGenericsIndex = Math.max(maxGenericsIndex, ty.index) + } + } + + const typeFields = fields.map((x) => `${camelCase(x.name)}: ${renderRef(x.type).type}`).join(', ') + const codecFieldsOrder = '[' + fields.map((x) => `'${camelCase(x.name)}'`).join(', ') + ']' + const codecFieldsMap = '{' + fields.map((x) => `${camelCase(x.name)}: ${renderRef(x.type).codec}`).join(', ') + + '}' + const codec = (codecTy: string) => `lib.structCodec<${codecTy}>(${codecFieldsOrder}, ${codecFieldsMap})` + + if (maxGenericsIndex >= 0) { + const generics = Array.from({ length: maxGenericsIndex + 1 }, (_v, i) => renderRef({ t: 'param', index: i })) + + const genericTypes = generics.map((x) => x.type).join(', ') + const withArgs = generics.map((x) => `${x.codec}: lib.GenCodec<${x.type}>`).join(', ') + const withRet = codec(`${id}<${genericTypes}>`) + + return [ + renderJsDoc([`Structure with named fields and generic parameters.`]), + `export interface ${id}<${genericTypes}> { ${typeFields} }`, + renderJsDoc([`Codec constructor for the structure with generic parameters.`]), + `export const ${id} = { ` + renderJsDoc([`Create a codec with the actual codecs for generic parameters.`]), + `with: <${genericTypes}>(${withArgs}): lib.GenCodec<${id}<${genericTypes}>> => ${withRet} }`, + ] + } else { + return [ + renderJsDoc([`Structure with named fields.`]), + `export interface ${id} { ${typeFields} }`, + renderJsDoc([`Codec of the structure.`]), + `export const ${id}: lib.CodecContainer<${id}> = lib.defineCodec(${codec(id)})`, + ] + } + }) + .with({ t: 'tuple' }, ({ elements }) => { + const typeElements = elements.map((x) => renderRef(x).type) + const codecElements = elements.map((x) => renderRef(x).codec) + const codec = `lib.tupleCodec([${codecElements.join(', ')}])` + return [ + `export type ${id} = [${typeElements.join(', ')}]`, + `export const ${id}: lib.CodecContainer<${id}> = lib.defineCodec(${codec})`, + ] + }) + .with({ t: 'bitmap' }, ({ masks, repr }) => { + assert(repr === 'U32') + + const typeLiterals = masks.map((x) => `'${x.name}'`) + const codecMasks = masks.map(({ name, mask }) => `${name}: ${mask}`) + const codec = `lib.bitmapCodec<${id} extends Set ? T : never>({ ${codecMasks.join(', ')} })` + + return [ + `export type ${id} = Set<${typeLiterals.join(' | ')}>`, + `export const ${id}: lib.CodecContainer<${id}> = lib.defineCodec(${codec})`, + ] + }) + .with({ t: 'alias' }, ({ to }) => { + const rendered = renderRef(to) + const value = rendered.valueId ?? `lib.defineCodec(${rendered.codec})` + const explicitType = rendered.valueId ? `` : `: lib.CodecContainer<${id}>` + return [`export type ${id} = ${rendered.type}`, `export const ${id}${explicitType} = ${value}`] + }) + .exhaustive() + .join('\n') +} + +function upcase(s: S): Uppercase { + return s.toUpperCase() as Uppercase +} + +function takeSelectorTypeName(selector: string): string | null { + const SELECTOR_SUFFIX = 'ProjectionSelector' + if (!selector.endsWith(SELECTOR_SUFFIX)) return null + return selector.slice(0, -SELECTOR_SUFFIX.length) +} + +function buildQuerySelectorMapEntries(emits: EmitsMap): { query: string; selector: string }[] { + const schema = emits.get('QueryBox') + assert(schema && schema.t === 'enum') + return schema.variants.map((variant) => { + const selector = match(variant.type) + .with( + { + t: 'local', + id: 'QueryWithFilter', + params: [P._, P._, { t: 'lib', id: 'Vec', params: [{ t: 'local', id: P.select() }] }], + }, + (x) => takeSelectorTypeName(x), + ) + .otherwise(() => fail('unexpected query box value')) + + assert(selector) + + return { + query: variant.tag, + selector, + } + }) +} + +function expectNestedSelector(type: TypeRef) { + assert(type.t === 'local') + const selector = takeSelectorTypeName(type.id) + assert(selector) + if (selector === 'MetadataKey') return 'Json' + return selector +} + +/** + * _Most_ of the selectors match directly with the variant in `QueryOutputBatchBox`. + * For example, `AccountProjectionSelector` (selector = `Account`) matches directly with + * `QueryOutputBatchBox::Account` (variant = `Account`). + * + * However, there are some mismatches, e.g. `PeerId` selector will in fact return `Peer`. + * + * This function resolves these exceptions + */ +function resolveSelectorAtomOutputBoxTag(selector: string) { + return match(selector) + .returnType() + .with('PeerId', () => 'Peer') + .with('SignedBlock', () => 'Block') + .with('TransactionError', () => 'TransactionRejectionReason') + .otherwise(() => selector) +} + +function buildSelectorOutputMapEntries( + emits: EmitsMap, +): { selector: string; entries: { name: string; value: string }[] }[] { + return [...emits].reduce( + (acc, [key, value]) => { + const selector = takeSelectorTypeName(key) + if (selector && selector !== 'MetadataKey') { + assert(value.t === 'enum', `not an enum: ${selector} (selector)`) + acc.push({ + selector, + entries: value.variants.map((variant) => ({ + name: variant.tag, + value: variant.tag === 'Atom' + ? resolveSelectorAtomOutputBoxTag(selector) + : expectNestedSelector(variant.type), + })), + }) + } + return acc + }, + [] as ReturnType, + ) +} + +/** + * Properties of the output to test: + * - all values in query output map point to some key in the selector output map + * - all `Atom` variants for each selector in selector output map point to some variant of + * query output batch box + */ +function generateQueryMaps(emits: EmitsMap): string[] { + const querySelectorMap = buildQuerySelectorMapEntries(emits) + .map((x) => `${x.query}: '${x.selector}'`) + .join('; ') + + const selectorOutputMap = buildSelectorOutputMapEntries(emits) + .map((x) => { + const inner = x.entries.map((y) => `${y.name}: '${y.value}'`).join(';') + return `${x.selector}: {\n${inner} }` + }) + .join('; ') + + return [ + `export type QuerySelectorMap = { ${querySelectorMap} }`, + `export type SelectorOutputMap = { ${selectorOutputMap} }`, + ] +} diff --git a/etc/iroha-build-utils.ts b/etc/iroha-build-utils.ts new file mode 100644 index 00000000..fb009a3d --- /dev/null +++ b/etc/iroha-build-utils.ts @@ -0,0 +1,89 @@ +import type SCHEMA from '@iroha/core/data-model/schema-json' +import type { JsonValue } from 'type-fest' +import { spawn } from 'node:child_process' +import { Buffer } from 'node:buffer' +import { stat } from 'node:fs/promises' +import { fail } from '@std/assert/fail' +import * as path from 'node:path' + +const resolvePrepIroha = (...paths: string[]) => { + const pathname = new URL(import.meta.url).pathname + let dirname: string + // This weirdness happens in `@deno/vite-plugin` + const matchDenoVitePlugin = pathname.match(/TypeScript::iroha-build-utils::(.+)$/) + if (matchDenoVitePlugin) { + dirname = path.dirname(matchDenoVitePlugin[1]) + } else dirname = path.dirname(pathname) + return path.resolve(dirname, '../prep/iroha', ...paths) +} + +export type Binary = 'irohad' | 'kagami' | 'iroha_codec' + +export const BIN_PATHS: Record = { + irohad: resolvePrepIroha('irohad'), + kagami: resolvePrepIroha('kagami'), + iroha_codec: resolvePrepIroha('iroha_codec'), +} + +export const EXECUTOR_WASM_PATH: string = resolvePrepIroha('executor.wasm') + +for (const filePath of [...Object.values(BIN_PATHS), EXECUTOR_WASM_PATH]) { + try { + await stat(filePath) + } catch (err) { + console.error(`${filePath} doesn't exist, is seems:`, err) + fail() + } +} + +export async function irohaCodecToScale( + type: keyof typeof SCHEMA, + json: JsonValue, +): Promise { + const input = JSON.stringify(json, undefined, 2) + + return new Promise((resolve, reject) => { + const child = spawn(BIN_PATHS.iroha_codec, ['json-to-scale', '--type', type], { + stdio: ['pipe', 'pipe', 'inherit'], + }) + + const chunks: Uint8Array[] = [] + + child.stdout.on('data', (chunk) => { + chunks.push(chunk) + }) + + child.on('close', (code) => { + if (code !== 0) reject(new Error('non-zero exit code of iroha_codec')) + resolve(Uint8Array.from(Buffer.concat(chunks))) + }) + + child.stdin.write(new TextEncoder().encode(input)) + child.stdin.end() + }) +} + +export async function irohaCodecToJson( + type: keyof typeof SCHEMA, + scale: Uint8Array, +): Promise { + return new Promise((resolve, reject) => { + const child = spawn(BIN_PATHS.iroha_codec, ['scale-to-json', '--type', type], { + stdio: ['pipe', 'pipe', 'inherit'], + }) + + const chunks: Uint8Array[] = [] + child.stdout.on('data', (chunk) => { + chunks.push(chunk) + }) + + child.on('close', (code) => { + if (code !== 0) reject(new Error(`non-zero exit code: ${code}`)) + const text = new TextDecoder().decode(Buffer.concat(chunks)) + resolve(JSON.parse(text)) + }) + + child.stdin.write(scale) + child.stdin.end() + }) +} diff --git a/etc/jakefile.ts b/etc/jakefile.ts deleted file mode 100644 index ee8d7657..00000000 --- a/etc/jakefile.ts +++ /dev/null @@ -1,138 +0,0 @@ -import 'jake' -import del from 'del' -import { $, cd } from 'zx' -import path from 'path' -import { ROOT, preserveCwd, reportDeleted } from './util' -import { PACKAGES_TO_BUILD_WITH_TSC, PACKAGES_TO_PUBLISH, artifactsToClean, packageRoot, scopePackage } from './meta' -import { WASM_PACK_CRATE_DIR, WASM_PACK_OUT_NAME, WASM_PACK_TARGETS, wasmPackOutDirForTarget } from './meta-crypto' - -desc('Clean all build artifacts') -task('clean', async () => { - const deleted = await del(artifactsToClean()) - reportDeleted(deleted) -}) - -namespace('prepare', () => { - desc('Compile data-model schema with Kagami') - task('data-model-schema', ['clean'], async () => { - await $`pnpm --filter data-model-schema compile-with-kagami` - }) - - desc('Generate data-model codecs according to the compiled schema') - task('data-model-codegen', ['clean', 'data-model-schema'], async () => { - await $`pnpm --filter data-model codegen` - }) - - desc('Produce Rust SCALE samples for data-model tests') - task('data-model-rust-samples', ['clean'], async () => { - await $`pnpm --filter data-model-rust-samples produce-samples` - }) - - desc('Compile all necessary artifacts') - task('all', ['data-model-schema', 'data-model-rust-samples', 'data-model-codegen']) -}) - -namespace('crypto-wasm', () => { - task('clean-wasm-pkgs', async () => { - const deleted = await del(WASM_PACK_TARGETS.map((a) => wasmPackOutDirForTarget(a)).toArray()) - reportDeleted(deleted) - }) - - task('cargo-test', async () => { - await preserveCwd(async () => { - cd(WASM_PACK_CRATE_DIR) - await $`cargo test` - }) - }) - - task('build-targets', async () => { - await preserveCwd(async () => { - cd(WASM_PACK_CRATE_DIR) - - for (const target of WASM_PACK_TARGETS) { - const outDir = wasmPackOutDirForTarget(target) - await $`wasm-pack build --target ${target} --out-dir ${outDir} --out-name ${WASM_PACK_OUT_NAME}` - } - }) - }) - - task('keep-only-necessary', async () => { - function* patterns() { - for (const target of WASM_PACK_TARGETS) { - const root = wasmPackOutDirForTarget(target) - yield path.join(root, '*') - yield path.join(root, '.*') // hidden files - yield '!' + path.join(root, WASM_PACK_OUT_NAME + '{.js,.d.ts,_bg.wasm,_bg.js,_bg.wasm.d.ts}') - } - } - - const deleted = await del([...patterns()]) - reportDeleted(deleted) - }) - - desc('Rebuild') - task('rebuild', ['clean-wasm-pkgs', 'cargo-test', 'build-targets', 'keep-only-necessary']) -}) - -namespace('build', () => { - desc('Build TypeScript of the whole project and put corresponding artifacts near the packages') - task('tsc', ['clean', 'prepare:all'], async () => { - await $`pnpm tsc` - - for (const pkg of PACKAGES_TO_BUILD_WITH_TSC) { - const root = path.relative(ROOT, packageRoot(pkg)) - const tsEmitRoot = path.join('dist-tsc', root) - - await $`mv ${path.join(tsEmitRoot, 'src')} ${path.join(root, 'dist-tsc')}` - } - }) - - desc('Rollup') - task('rollup', ['build:tsc'], async () => { - await $`pnpm rollup -c` - }) - - desc('Run TypeScript Compiler and Rollup') - task('all', ['build:rollup']) -}) - -namespace('test', () => { - task('unit', ['prepare:all'], async () => { - await $`pnpm vitest run` - }) - - task('crypto', async () => { - await $`pnpm --filter monorepo-crypto test` - }) - - task('prepare-client-integration', ['build:all']) - - task('client-integration', ['prepare-client-integration'], async () => { - await $`pnpm --filter client test:integration` - }) - - desc('Run all tests') - task('all', ['test:unit', 'test:crypto', 'test:client-integration']) -}) - -desc('Perform type checking in the whole repo') -task('type-check', ['prepare:all'], async () => { - await $`pnpm tsc --noEmit` -}) - -task('lint', async () => { - await $`pnpm lint` -}) - -desc('Performs all kinds of checks from artifacts compilation and linting to end-2-end tests') -task('run-all-checks', ['lint', 'build:all', 'test:all']) - -desc('Publish all public packages') -task('publish-all', ['run-all-checks', 'build:all'], async () => { - const filters = PACKAGES_TO_PUBLISH.toSeq() - .map(scopePackage) - .flatMap((x) => [`--filter`, x]) - .toArray() - - await $`pnpm ${filters} publish --no-git-checks` -}) diff --git a/etc/meta-crypto.ts b/etc/meta-crypto.ts deleted file mode 100644 index 126167ed..00000000 --- a/etc/meta-crypto.ts +++ /dev/null @@ -1,47 +0,0 @@ -import path from 'path' -import { Set } from 'immutable' -import { SetEntry, resolve } from './util' - -export const CRYPTO_MONOREPO_ROOT = resolve('packages/crypto') -const resolveRelativeToCryptoMonorepoRoot = (...paths: string[]) => path.resolve(CRYPTO_MONOREPO_ROOT, ...paths) - -export const IROHA_CRYPTO_TARGETS = Set(['web', 'node', 'bundler'] as const) - -export type IrohaCryptoTarget = SetEntry - -export const IrohaCryptoTarget = { - toWasmPackTarget(target: IrohaCryptoTarget): WasmPackTarget { - if (target === 'node') return 'nodejs' - return target - }, -} - -export const WASM_PACK_TARGETS = Set(['web', 'nodejs', 'bundler'] as const) - -export type WasmPackTarget = SetEntry - -export const PACKAGES_TO_ROLLUP = Set(['core', 'util'] as const) - .merge(IROHA_CRYPTO_TARGETS.map((a) => `target-${a}` as const)) - .map((a) => `crypto-${a}` as const) - -export type PackageToRollup = SetEntry - -export const PACKAGES_TO_BUILD_WITH_TSC = PACKAGES_TO_ROLLUP.merge(Set(['crypto-interface-wrap'] as const)) - -export type PackageToBuildWithTsc = SetEntry - -export const WASM_PACK_CRATE_DIR = resolveRelativeToCryptoMonorepoRoot('crypto-rs') - -export function wasmPackOutDirForTarget(target: WasmPackTarget): string { - return path.resolve(WASM_PACK_CRATE_DIR, `wasm-pkg-${target}`) -} - -export const WASM_PACK_OUT_NAME = 'iroha_crypto' - -export const WASM_PKG_ROLLUP_ID = `@iroha2/crypto/~wasm-pkg` - -export function wasmPkgWithTargetRollupId(target: WasmPackTarget) { - return `${WASM_PKG_ROLLUP_ID}/${target}` as const -} - -export const INTERFACE_WRAP_PROXY_TO_WASM_PKG_ROLLUP_ID = '@iroha2/crypto-interface-wrap/~wasm-pack-proxy' diff --git a/etc/meta.ts b/etc/meta.ts deleted file mode 100644 index 1baa5771..00000000 --- a/etc/meta.ts +++ /dev/null @@ -1,81 +0,0 @@ -import path from 'path' -import { PackageJson } from 'type-fest' -import { Set } from 'immutable' -import * as metaCrypto from './meta-crypto' -import { P, match } from 'ts-pattern' -import { SetEntry, resolve } from './util' - -function predicateStartsWith(prefix: S): (x: string) => x is `${S}${string}` { - return (x): x is `${S}` => x.startsWith(prefix) -} - -function trimPrefixTypeSafe( - value: T, - prefix: Prefix, -): T extends `${Prefix}${infer V}` ? V : never { - return value.slice(prefix.length) as any -} - -export function packageRoot(pkg: PackageAny, kind: 'root' | 'ts-build' | 'dist' = 'root'): string { - const root = match(pkg) - .with('client', 'data-model', 'data-model-schema', 'i64-fixnum', (a) => resolve('packages', a)) - .with(P.when(predicateStartsWith('crypto-')), (a) => - resolve('packages/crypto/packages', trimPrefixTypeSafe(a, 'crypto-')), - ) - .exhaustive() - - return match(kind) - .with('root', () => root) - .with('ts-build', () => path.join(root, 'dist-tsc')) - .with('dist', () => path.join(root, 'dist')) - .exhaustive() -} - -export function packageEntry(pkg: Exclude, kind: 'dts' | 'js'): string { - const root = packageRoot(pkg, 'ts-build') - return path.join(root, 'lib' + ({ dts: '.d.ts', js: '.js' } as const)[kind]) -} - -/** - * This function implements the important convention: production dependencies of the package, written in `package.json`, - * are also its Rollup externals. It allows to avoid mismatch between dev and deploy (NPM-published) environment. - */ -export async function loadProductionDependencies(pkg: PackageToRollup): Promise> { - const pathToPackageJson: string = path.join(packageRoot(pkg), 'package.json') - const { - default: { dependencies, peerDependencies }, - }: { default: PackageJson } = await import(pathToPackageJson, { assert: { type: 'json' } }) - return Set(Object.keys({ ...dependencies, ...peerDependencies })) -} - -export type PackageToRollup = SetEntry - -export const PACKAGES_TO_ROLLUP = metaCrypto.PACKAGES_TO_ROLLUP.merge( - Set(['client', 'data-model', 'i64-fixnum'] as const), -) - -export const PACKAGES_TO_BUILD_WITH_TSC = metaCrypto.PACKAGES_TO_BUILD_WITH_TSC.merge(PACKAGES_TO_ROLLUP) - -export type PackageToBuildWithTsc = SetEntry - -export type PackageToPublish = SetEntry - -export const PACKAGES_TO_PUBLISH = PACKAGES_TO_ROLLUP.merge(Set(['data-model-schema'] as const)) - -export type PackageAny = PackageToRollup | PackageToPublish | metaCrypto.PackageToBuildWithTsc - -export function scopePackage(name: T) { - return `@iroha2/${name}` as const -} - -export function artifactsToClean(): string[] { - return [ - '**/dist', - '**/dist-tsc', - - // compilation artifacts - 'packages/data-model-schema/src/__schema__.json', - 'packages/data-model-rust-samples/samples.json', - 'packages/data-model/src/__generated__.ts', - ] -} diff --git a/etc/rollup.config.ts b/etc/rollup.config.ts deleted file mode 100644 index 6753d845..00000000 --- a/etc/rollup.config.ts +++ /dev/null @@ -1,329 +0,0 @@ -import { InputOption, OutputOptions, Plugin, RollupOptions, defineConfig } from 'rollup' -import PluginDtsBase from 'rollup-plugin-dts' -import PluginReplace from '@rollup/plugin-replace' -import { glob } from 'zx' -import { match } from 'ts-pattern' -import path from 'path' -import fs from 'fs/promises' -import { pipe } from 'fp-ts/function' -import { - PACKAGES_TO_ROLLUP, - PackageAny, - loadProductionDependencies, - packageEntry, - packageRoot, - scopePackage, -} from './meta' -import { - INTERFACE_WRAP_PROXY_TO_WASM_PKG_ROLLUP_ID, - IrohaCryptoTarget, - WASM_PACK_OUT_NAME, - WASM_PKG_ROLLUP_ID, - WasmPackTarget, - wasmPackOutDirForTarget, - wasmPkgWithTargetRollupId, -} from './meta-crypto' -import { SetOptional } from 'type-fest' - -function PluginDts() { - return PluginDtsBase({ respectExternal: true }) -} - -function PluginReplaceVitest() { - return PluginReplace({ - preventAssignment: true, - values: { - 'import.meta.vitest': 'undefined', - }, - }) -} - -function commonJsPlugins(): Plugin[] { - return [PluginReplaceVitest()] -} - -function output>( - format: 'esm' | 'cjs' | 'types', - dir: string, - extension?: T, -) { - const base = ( - format === 'types' - ? { format: 'esm', dir } - : { format, dir, entryFileNames: '[name].' + ({ esm: 'mjs', cjs: 'cjs' } as const)[format] } - ) satisfies OutputOptions - - return { - ...base, - ...extension, - } -} - -function input(pkg: Exclude, kind: 'js' | 'dts'): InputOption { - return { - lib: packageEntry(pkg, kind), - } -} - -async function readWasmPkgAssets(target: WasmPackTarget): Promise<{ fileName: string; content: Buffer }[]> { - return glob(path.join(wasmPackOutDirForTarget(target), '*')).then((files) => - Promise.all( - files.map(async (fullFileName) => { - const content = await fs.readFile(fullFileName) - return { - fileName: path.basename(fullFileName), - content, - } - }), - ), - ) -} - -function PluginWasmPkg(target: WasmPackTarget, mode: 'types' | 'esm-reexport' | 'cjs-in-esm'): Plugin { - const WASM_PKG_TARGET_ROLLUP_ID = wasmPkgWithTargetRollupId(target) - const WASM_PKG_ASSETS_DIR = `wasm-pkg` - const WASM_PKG_COPIED_ENTRY_EXTERNAL = `./${WASM_PKG_ASSETS_DIR}/${WASM_PACK_OUT_NAME}` - - return { - name: `resolve-wasm-pkg-as-${mode}`, - resolveId(id, importer) { - if (id === INTERFACE_WRAP_PROXY_TO_WASM_PKG_ROLLUP_ID) return id - if (id === WASM_PKG_ROLLUP_ID) return WASM_PKG_TARGET_ROLLUP_ID - if (id === WASM_PKG_TARGET_ROLLUP_ID) return id - if (id === WASM_PKG_COPIED_ENTRY_EXTERNAL && importer === WASM_PKG_TARGET_ROLLUP_ID) return { id, external: true } - // in this mode, we import it to do `createRequire()` - if (id === 'module' && mode === 'cjs-in-esm') return { id, external: true } - }, - async load(id) { - if (id === INTERFACE_WRAP_PROXY_TO_WASM_PKG_ROLLUP_ID) { - return match(mode) - .with('cjs-in-esm', () => `export { namespaceAsNamedExport as wasmPkg } from '${WASM_PKG_TARGET_ROLLUP_ID}'`) - .with( - 'esm-reexport', - 'types', - () => `import * as wasmPkg from '${WASM_PKG_TARGET_ROLLUP_ID}'\nexport { wasmPkg }`, - ) - .exhaustive() - } - if (id === WASM_PKG_TARGET_ROLLUP_ID) { - return match(mode) - .with('types', () => { - const id = path.join(wasmPackOutDirForTarget(target), WASM_PACK_OUT_NAME + `.d.ts`) - let source = `export * from '${id}'\n` - if (target === 'web') source += `export { default } from '${id}'\n` - return source - }) - .with('esm-reexport', 'cjs-in-esm', async (mode): Promise => { - const assets = await readWasmPkgAssets(target) - - for (const { fileName, content } of assets) { - this.emitFile({ - type: 'asset', - fileName: path.join(WASM_PKG_ASSETS_DIR, fileName), - source: content, - }) - } - - return match(mode) - .with('esm-reexport', () => { - let source = `export * from '${WASM_PKG_COPIED_ENTRY_EXTERNAL}'\n` - if (target === 'web') source += `export { default } from '${WASM_PKG_COPIED_ENTRY_EXTERNAL}'\n` - return source - }) - .with( - 'cjs-in-esm', - () => - `import { createRequire } from 'module'\n` + - `const wasmPkg = createRequire(import.meta.url)('${WASM_PKG_COPIED_ENTRY_EXTERNAL}')\n` + - `export { wasmPkg as namespaceAsNamedExport }`, - ) - .exhaustive() - }) - .exhaustive() - } - }, - } -} - -/** - * Rollup plugin to redirect imports from `@iroha2/crypto-util` to `@iroha2/crypto-core`, since the core package - * re-exports everything from the util one. - */ -function PluginRedirectCryptoUtilToCore(): Plugin { - return { - name: 'redirect-from-crypto-util-to-crypto-core', - resolveId(id) { - if (id === '@iroha2/crypto-util') return '@iroha2/crypto-core' - }, - } -} - -/** - * By default, imports of `@iroha2/crypto-interface-wrap` will resolve to `src/main.ts`, - * which is especially bad for types - declarations will contain actual TS code instead - * of pure types. - * - * For consistency TS-compiled JavaScript is imported too - */ -function PluginResolveCryptoInterfaceWrapEntry(entry: 'types' | 'js'): Plugin { - const PKG = 'crypto-interface-wrap' as const - const resolveTo = packageEntry(PKG, ({ types: 'dts', js: 'js' } as const)[entry]) - const pkgFull = scopePackage(PKG) - - return { - name: 'resolve-crypto-interface-wrap-entry', - resolveId: (id) => { - if (id === pkgFull) return resolveTo - }, - } -} - -async function* rollupCryptoTarget( - target: IrohaCryptoTarget, - ...formats: ('types' | 'esm' | 'cjs')[] -): AsyncGenerator { - const pkg = `crypto-target-${target}` as const - const dist = packageRoot(pkg, 'dist') - const external = (await loadProductionDependencies(pkg)).toArray() - - for (const format of formats) { - yield match(format) - .with('types', (): RollupOptions => { - return { - input: input(pkg, 'dts'), - external, - plugins: [ - PluginResolveCryptoInterfaceWrapEntry('types'), - PluginRedirectCryptoUtilToCore(), - PluginWasmPkg(IrohaCryptoTarget.toWasmPackTarget(target), 'types'), - PluginDts(), - ], - output: output('types', dist), - } - }) - .with('esm', 'cjs', (format): RollupOptions => { - const isNodeEsm = target === 'node' && format === 'esm' - - return { - input: input(pkg, 'js'), - external, - plugins: [ - PluginResolveCryptoInterfaceWrapEntry('js'), - PluginRedirectCryptoUtilToCore(), - PluginWasmPkg(IrohaCryptoTarget.toWasmPackTarget(target), isNodeEsm ? 'cjs-in-esm' : 'esm-reexport'), - ...commonJsPlugins(), - ], - output: output(format, dist), - } - }) - .exhaustive() - } -} - -async function* generateRolls(): AsyncGenerator { - for (const pkg of PACKAGES_TO_ROLLUP.toList().sort()) { - yield* match>(pkg) - .with('client', async function* (pkg) { - const rootTsBuild = packageRoot(pkg, 'ts-build') - const dist = packageRoot(pkg, 'dist') - const external = (await loadProductionDependencies(pkg)) - .remove('json-bigint') - .add('json-bigint/lib/parse.js') - .add(scopePackage(pkg)) - .toArray() - - const ENTRIES = ['lib', 'web-socket/native', 'web-socket/node'] as const - - const entryInput = (entry: (typeof ENTRIES)[number], ext: 'js' | 'd.ts'): string => - path.join(rootTsBuild, `${entry}.${ext}`) - - yield { - input: pipe( - ENTRIES.map((x) => [x, entryInput(x, 'js')] as const), - Object.fromEntries, - ), - external, - plugins: commonJsPlugins(), - output: [output('esm', dist), output('cjs', dist)], - } - - yield { - input: pipe( - ENTRIES.map((x) => [x, entryInput(x, 'd.ts')] as const), - Object.fromEntries, - ), - external, - plugins: [PluginDts()], - output: output('types', dist), - } - }) - .with('data-model', async function* (pkg) { - const dist = packageRoot(pkg, 'dist') - const external = (await loadProductionDependencies(pkg)).toArray() - - const preserveModulesOpts = { preserveModules: true, preserveModulesRoot: packageRoot(pkg, 'ts-build') } - - yield { - input: input(pkg, 'js'), - external, - plugins: commonJsPlugins(), - output: [output('esm', path.join(dist, 'esm'), preserveModulesOpts), output('cjs', path.join(dist, 'cjs'))], - } - - yield { - input: input(pkg, 'dts'), - external, - plugins: [PluginDts()], - output: output('types', path.join(dist, 'types'), preserveModulesOpts), - } - }) - .with('i64-fixnum', 'crypto-util', async function* (pkg) { - const dist = packageRoot(pkg, 'dist') - const external = (await loadProductionDependencies(pkg)).toArray() - - yield { - input: input(pkg, 'js'), - external, - plugins: commonJsPlugins(), - output: [output('esm', dist), output('cjs', dist)], - } - - yield { - input: input(pkg, 'dts'), - external, - plugins: [PluginDts()], - output: output('types', dist), - } - }) - .with('crypto-target-node', () => rollupCryptoTarget('node', 'types', 'esm', 'cjs')) - .with('crypto-target-web', () => rollupCryptoTarget('web', 'types', 'esm')) - .with('crypto-target-bundler', () => rollupCryptoTarget('bundler', 'types', 'esm')) - .with('crypto-core', async function* (pkg) { - const dist = packageRoot(pkg, 'dist') - const external = (await loadProductionDependencies(pkg)).toArray() - - yield { - input: input('crypto-core', 'js'), - external, - plugins: [PluginResolveCryptoInterfaceWrapEntry('js'), ...commonJsPlugins()], - output: [output('esm', dist), output('cjs', dist)], - } - - yield { - input: input('crypto-core', 'dts'), - external, - plugins: [PluginResolveCryptoInterfaceWrapEntry('types'), PluginWasmPkg('nodejs', 'types'), PluginDts()], - output: output('types', dist), - } - }) - .exhaustive() - } -} - -async function rolls(): Promise { - const rolls = new Array() - for await (const x of generateRolls()) rolls.push(x) - return rolls -} - -export default defineConfig(rolls) diff --git a/etc/task-codegen.ts b/etc/task-codegen.ts new file mode 100644 index 00000000..f37c0bd9 --- /dev/null +++ b/etc/task-codegen.ts @@ -0,0 +1,63 @@ +import type { Schema } from '@iroha/core/data-model/schema' +import SCHEMA from '@iroha/core/data-model/schema-json' +import { generateClientFindAPI, generateDataModel, Resolver } from './codegen.ts' +import $ from 'jsr:@david/dax' +import { expect } from 'jsr:@std/expect' +import * as dprint from 'jsr:@dprint/formatter' +import * as dprintTS from 'npm:@dprint/typescript' +import * as colors from '@std/fmt/colors' + +const tsFormatter = dprint.createFromBuffer(await Deno.readFile(dprintTS.getPath())) +const formatTS = (code: string) => tsFormatter.formatText({ filePath: 'file.ts', fileText: code }) + +async function write({ file, code }: { file: string; code: string }) { + try { + const prevCode = await Deno.readTextFile(file) + if (prevCode === code) { + $.logStep(`Skipping ${colors.cyan(file)}, no change`) + return + } else { + await Deno.writeTextFile(file, code) + $.logStep(`Re-written ${colors.cyan(file)}`) + } + } catch { + await Deno.writeTextFile(file, code) + $.logStep(`Written ${colors.cyan(file)}`) + } +} + +/** + * There are not included into the schema for some reason, but are useful to generate code for. + */ +const EXTENSION: Schema = { + Status: { + Struct: [ + { name: 'peers', type: 'Compact' }, + { name: 'blocks', type: 'Compact' }, + { name: 'txs_accepted', type: 'Compact' }, + { name: 'txs_rejected', type: 'Compact' }, + { name: 'uptime', type: 'Uptime' }, + { name: 'view_changes', type: 'Compact' }, + { name: 'queue_size', type: 'Compact' }, + ], + }, + Uptime: { + Struct: [ + { name: 'secs', type: 'Compact' }, + { name: 'nanos', type: 'u32' }, + ], + }, +} +expect(Object.keys(SCHEMA)).not.toContain(Object.keys(EXTENSION)) + +const resolver = new Resolver({ ...SCHEMA, ...EXTENSION }) + +await write({ + file: 'packages/core/data-model/_generated_.ts', + code: formatTS(generateDataModel(resolver, './_generated_.prelude.ts')), +}) + +await write({ + file: 'packages/client/find-api._generated_.ts', + code: formatTS(generateClientFindAPI(resolver, './find-api._generated_.prelude.ts')), +}) diff --git a/etc/task-prep-crypto-wasm.ts b/etc/task-prep-crypto-wasm.ts new file mode 100644 index 00000000..6d099834 --- /dev/null +++ b/etc/task-prep-crypto-wasm.ts @@ -0,0 +1,116 @@ +import { parseArgs } from 'jsr:@std/cli' +import * as path from 'jsr:@std/path' +import $ from 'jsr:@david/dax' +import * as colors from '@std/fmt/colors' +import { glob, hashsum, resolveFromRoot } from './util.ts' +import { copy, emptyDir } from 'jsr:@std/fs' +import { assert } from '@std/assert/assert' + +const WASM_PACK_OUT_NAME = 'iroha_crypto' +const PROJECT_DIR = resolveFromRoot('crypto-wasm') + +function wasmPackOutDir(target: 'node' | 'web') { + return resolveFromRoot(`prep/crypto-wasm/pkg-${target}`) +} + +async function runCargoBuild(): Promise<{ hash: string }> { + const target = 'wasm32-unknown-unknown' + $.logStep('Running cargo build') + await $`cargo build --release --target ${target}`.cwd(PROJECT_DIR) + const hash = await hashsum(path.join(PROJECT_DIR, 'target', target, 'release/iroha_crypto_wasm.wasm')) + $.logStep(`Finished cargo build, output hash: ${colors.yellow(hash)}`) + return { hash } +} + +async function tryReadWasmPkgCacheKey(target: 'node' | 'web'): Promise { + const file = path.join(wasmPackOutDir(target), 'cache-key') + try { + const contents = await Deno.readTextFile(file) + return contents + } catch (err) { + if (err instanceof Deno.errors.NotFound) return null + throw err + } +} + +async function writeWasmPkgCacheKey(target: 'node' | 'web', key: string) { + const file = path.join(wasmPackOutDir(target), 'cache-key') + await Deno.writeTextFile(file, key) +} + +async function findPackagesCacheKey(): Promise { + const keys = await Promise.all([tryReadWasmPkgCacheKey('node'), tryReadWasmPkgCacheKey('web')]).then((x) => + new Set(x) + ) + if (keys.size === 1) { + const [key] = keys + return key + } + return null +} + +async function runWasmPack(opts: { key: string }) { + for (const target of ['node', 'web'] as const) { + const wasmPackTarget = target === 'node' ? 'nodejs' : 'web' + + $.logStep(`Running wasm-pack for ${target}`) + await $`wasm-pack build --target ${wasmPackTarget} --out-dir ${ + wasmPackOutDir(target) + } --out-name ${WASM_PACK_OUT_NAME}`.cwd( + PROJECT_DIR, + ) + + await writeWasmPkgCacheKey(target, opts.key) + } +} + +async function buildWasmPackages(opts: { force: boolean }) { + const { hash } = await runCargoBuild() + const prevKey = await findPackagesCacheKey() + if (!opts.force && hash === prevKey) { + $.logStep(`Skipping wasm-pack as it is up to date (override with ${colors.red('--force')})`) + return + } + await runWasmPack({ key: hash }) +} + +async function buildCryptoWasm(opts: { force: boolean; onlyCopy: boolean }) { + if (opts.onlyCopy) { + $.logStep('Skipping wasm build') + } else { + await buildWasmPackages(opts) + } + await copyTargets() +} + +async function copyTargets() { + for (const target of ['node', 'web'] as const) { + const copyToDir = resolveFromRoot(`packages/crypto-target-${target}/wasm-target`) + await emptyDir(copyToDir) + const copyGlob = await glob(path.join(wasmPackOutDir(target), `${WASM_PACK_OUT_NAME}*`)) + assert(copyGlob.length, 'nothing to copy. is prep/crypto-wasm ready?') + for (const pathFrom of copyGlob) { + await copy(pathFrom, path.join(copyToDir, path.basename(pathFrom))) + } + if (target === 'node') { + await Deno.writeTextFile( + path.join(copyToDir, 'package.json'), + JSON.stringify({ type: 'commonjs' }), + ) + } + $.logStep('Ready', copyToDir) + } + + const copyToDir = resolveFromRoot(`packages/core/crypto/wasm-target`) + await emptyDir(copyToDir) + const dts = path.join(wasmPackOutDir('node'), `${WASM_PACK_OUT_NAME}.d.ts`) + await copy(dts, path.join(copyToDir, 'wasm-pkg.d.ts')) + $.logStep('Ready', copyToDir) +} + +const args = parseArgs(Deno.args, { + boolean: ['force', 'onlyCopy'], + default: { 'force': false, onlyCopy: false }, +}) + +await buildCryptoWasm(args) diff --git a/etc/task-prep-iroha.ts b/etc/task-prep-iroha.ts new file mode 100644 index 00000000..8527bb8c --- /dev/null +++ b/etc/task-prep-iroha.ts @@ -0,0 +1,120 @@ +import { parseArgs } from 'jsr:@std/cli/parse-args' +import { resolveFromRoot } from './util.ts' +import { match, P } from 'ts-pattern' +import * as path from 'jsr:@std/path' +import * as colors from 'jsr:@std/fmt/colors' +import $ from 'jsr:@david/dax' +import { assert } from '@std/assert' +import { copy, emptyDir } from 'jsr:@std/fs' + +const IROHA_REPO_DIR = resolveFromRoot('.iroha') +const PREP_OUTPUT_DIR = resolveFromRoot('prep/iroha') + +async function dirExists(dir: string) { + try { + await Deno.stat(dir) + return true + } catch (err) { + if (err instanceof Deno.errors.NotFound) { + return false + } else throw err + } +} + +async function assertRepoIsReady() { + assert(await dirExists(IROHA_REPO_DIR), 'Iroha repo is not ready; make sure to run "deno task prep:iroha" first.') +} + +async function clean() { + await emptyDir(IROHA_REPO_DIR) +} + +async function linkPath(target: string) { + await clean() + + const full = path.resolve(target) + await Deno.symlink(full, IROHA_REPO_DIR) + + $.logStep(`Linked ${IROHA_REPO_DIR} -> ${full}`) +} + +async function cloneRepo(repo: string, tagOrRevision: string) { + await clean() + + $.logStep(`Cloning repo ${colors.blue(repo)} at revision ${colors.yellow(tagOrRevision)}`) + await $`git init --quiet`.cwd(IROHA_REPO_DIR) + await $`git remote add origin ${repo}`.cwd(IROHA_REPO_DIR) + await $`git fetch origin ${tagOrRevision}`.cwd(IROHA_REPO_DIR) + await $`git reset --hard FETCH_HEAD`.cwd(IROHA_REPO_DIR) + + $.logStep('Finished cloning repo') +} + +async function buildBinaries() { + await assertRepoIsReady() + const binaries = ['irohad', 'iroha_kagami', 'iroha_codec'] + $.logStep('Building binaries:', binaries) + const args = binaries.map((x) => ['-p', x]) + await $`cargo build --release ${args}`.cwd(IROHA_REPO_DIR) + $.logStep('Finished building binaries') +} + +async function buildWasms() { + await assertRepoIsReady() + $.logStep('Building lib wasms') + await $`/bin/bash ./scripts/build_wasm.sh libs`.cwd(IROHA_REPO_DIR) + $.logStep('Finished building WASMs') +} + +async function copyArtifacts() { + await emptyDir(PREP_OUTPUT_DIR) + for ( + const artifactPath of [ + 'target/release/irohad', + 'target/release/iroha_codec', + 'target/release/kagami', + 'defaults/executor.wasm', + 'docs/source/references/schema.json', + ] + ) { + await copy(path.join(IROHA_REPO_DIR, artifactPath), path.join(PREP_OUTPUT_DIR, '/', path.basename(artifactPath))) + } + $.logStep(`Finished copying artifacts to ${colors.bold(colors.cyan(PREP_OUTPUT_DIR))}`) +} + +const args = parseArgs(Deno.args, { + string: ['git', 'git-rev', 'path'], + boolean: ['check', 'build'], +}) + +await match(args) + .with( + { git: P.string, 'git-rev': P.string }, + async ({ git: repo, 'git-rev': tagOrRevision }) => { + await cloneRepo(repo, tagOrRevision) + }, + ) + .with({ path: P.string }, async ({ path }) => { + await linkPath(path) + }) + .with({ check: true }, async () => { + if (await dirExists(PREP_OUTPUT_DIR)) { + $.logStep(`Checked that ${colors.cyan(PREP_OUTPUT_DIR)} exists`) + } else { + $.logError( + `Error: ${PREP_OUTPUT_DIR} doesn't exist. Make sure to run ${ + colors.bold(colors.magenta('deno task prep:iroha:build')) + } first`, + ) + Deno.exit(1) + } + }) + .with({ build: true }, async () => { + await buildBinaries() + await buildWasms() + await copyArtifacts() + }) + .otherwise(() => { + $.logError('Bad CLI args') + Deno.exit(1) + }) diff --git a/etc/task-publish.ts b/etc/task-publish.ts new file mode 100644 index 00000000..69c9c5aa --- /dev/null +++ b/etc/task-publish.ts @@ -0,0 +1,17 @@ +import $ from 'jsr:@david/dax' +import { resolveFromRoot } from './util.ts' + +const PATHS = [ + 'packages/core', + 'packages/crypto-target-node', + 'packages/crypto-target-web', + 'packages/client', +].map( + (x) => resolveFromRoot(x), +) + +for (const pkg of PATHS) { + $.logStep('Publishing', pkg) + await $`deno publish ${Deno.args}`.cwd(pkg) + $.logStep('Published package') +} diff --git a/etc/util.ts b/etc/util.ts index c89f396c..c96cceda 100644 --- a/etc/util.ts +++ b/etc/util.ts @@ -1,36 +1,26 @@ -import { Set } from 'immutable' -import path from 'path' -import consola from 'consola' -import chalk from 'chalk' -import { cd } from 'zx' -import url from 'url' +import * as path from 'jsr:@std/path' +import { assert } from '@std/assert' +import { expandGlob } from 'jsr:@std/fs' +import { crypto } from 'jsr:@std/crypto' +import { encodeHex } from 'jsr:@std/encoding' -export type SetEntry = T extends Set ? V : never - -/** - * Relative to the monorepo root - */ -export function resolve(...paths: string[]): string { - return path.resolve(ROOT, ...paths) -} - -export function reportDeleted(paths: string[]): void { - consola.info( - 'Deleted stuff:\n' + - paths - .map((a) => path.relative(ROOT, a)) - .map((a) => ` ${chalk.gray(a)}`) - .join('\n'), - ) +export function resolveFromRoot(...paths: (string)[]) { + const dirname = import.meta.dirname + assert(dirname) + return path.resolve(dirname, '../', ...paths) } -export async function preserveCwd(fn: () => Promise): Promise { - const preserved = process.cwd() - try { - return await fn() - } finally { - cd(preserved) +export async function glob(pattern: string): Promise { + const items: string[] = [] + for await (const entry of expandGlob(pattern)) { + items.push(entry.path) } + return items } -export const ROOT = url.fileURLToPath(new URL('../', import.meta.url)) +export async function hashsum(src: string | URL): Promise { + const file = await Deno.open(src, { read: true }) + const readableStream = file.readable + const fileHashBuffer = await crypto.subtle.digest('SHA-256', readableStream) + return encodeHex(fileHashBuffer) +} diff --git a/jakefile.js b/jakefile.js deleted file mode 100644 index b9748a22..00000000 --- a/jakefile.js +++ /dev/null @@ -1,3 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -require('@esbuild-kit/cjs-loader') -module.exports = require('./etc/jakefile') diff --git a/package.json b/package.json deleted file mode 100644 index 6970c6e7..00000000 --- a/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "@iroha2/monorepo", - "private": true, - "packageManager": "pnpm@8.4.0", - "scripts": { - "preinstall": "npx only-allow pnpm", - "postinstall": "pnpm jake prepare:all", - "format:fix": "prettier-eslint \"**/*.{ts,js,vue,json}\" --write", - "lint": "eslint . --ext=\".ts,.js,.vue\"", - "run-all-checks": "pnpm jake run-all-checks", - "build:all": "pnpm jake build:all", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@changesets/cli": "^2.26.2", - "@esbuild-kit/cjs-loader": "^2.4.1", - "@iroha2/test-peer": "workspace:^0.0.1", - "@rollup/plugin-replace": "^5.0.2", - "@types/jake": "^0.0.33", - "@typescript-eslint/eslint-plugin": "^6.9.0", - "@typescript-eslint/parser": "^6.9.0", - "chalk": "4.1.2", - "consola": "^2.15.3", - "debug": "^4.3.4", - "del": "^6.0.0", - "eslint": "^8.45.0", - "eslint-config-alloy": "^5.0.0", - "eslint-plugin-cypress": "^2.13.3", - "eslint-plugin-vue": "^9.15.1", - "execa": "^7.0.0", - "fp-ts": "^2.13.1", - "immutable": "^4.2.4", - "jake": "^10.8.5", - "make-dir": "^3.1.0", - "npm-run-all": "^4.1.5", - "prettier": "^3.0.3", - "prettier-eslint": "^16.1.2", - "prettier-eslint-cli": "^8.0.1", - "rollup": "^3.26.2", - "rollup-plugin-dts": "^5.3.0", - "tiny-invariant": "^1.3.1", - "ts-pattern": "^5.0.1", - "tsx": "^3.12.2", - "type-fest": "^3.9.0", - "typescript": "^5.2.2", - "vite": "^5.1.5", - "vitest": "^1.3.1", - "zx": "^7.2.0" - } -} diff --git a/packages/client-isomorphic-fetch/CHANGELOG.md b/packages/client-isomorphic-fetch/CHANGELOG.md deleted file mode 100644 index 67c05234..00000000 --- a/packages/client-isomorphic-fetch/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# @iroha2/client-isomorphic-fetch - -## 0.2.0 - -### Minor Changes - -- 49c8451: **BREAKING**: `node-fetch` v2 → v3 diff --git a/packages/client-isomorphic-fetch/README.md b/packages/client-isomorphic-fetch/README.md deleted file mode 100644 index bd65edf2..00000000 --- a/packages/client-isomorphic-fetch/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `@iroha2/client-isomorphic-fetch` - -**This package is no longer in use.** Check [`client`](../client/README.md) for the instructions on how to use isomorphic Fetch API. - -> `@iroha2/client-isomorphic-fetch` was previously used to switch between environment-specific transports. It used `node-fetch` package in CJS mode (in Node.js) and native Fetch API in ESM mode (in a browser). diff --git a/packages/client-isomorphic-fetch/package.json b/packages/client-isomorphic-fetch/package.json deleted file mode 100644 index 27c6322a..00000000 --- a/packages/client-isomorphic-fetch/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "@iroha2/client-isomorphic-fetch", - "version": "0.2.0", - "license": "Apache 2.0", - "main": "src/node.ts", - "module": "src/native.ts", - "types": "types.d.ts", - "files": [ - "dist", - "types.d.ts" - ], - "publishConfig": { - "main": "dist/node.js", - "module": "dist/native.js" - }, - "scripts": { - "build": "run-p build:node build:native", - "build:node": "esbuild --bundle src/node.ts --platform=node --format=cjs --outfile=dist/node.js --external:node-fetch", - "build:native": "esbuild --bundle src/native.ts --outfile=dist/native.js --format=esm" - }, - "dependencies": { - "node-fetch": "^3.2.4" - }, - "devDependencies": { - "esbuild": "^0.14.27", - "npm-run-all": "^4.1.5" - } -} diff --git a/packages/client-isomorphic-fetch/src/native.ts b/packages/client-isomorphic-fetch/src/native.ts deleted file mode 100644 index ec3c6ff3..00000000 --- a/packages/client-isomorphic-fetch/src/native.ts +++ /dev/null @@ -1,3 +0,0 @@ -const nativeFetch = fetch - -export { nativeFetch as fetch } diff --git a/packages/client-isomorphic-fetch/src/node.ts b/packages/client-isomorphic-fetch/src/node.ts deleted file mode 100644 index fe659655..00000000 --- a/packages/client-isomorphic-fetch/src/node.ts +++ /dev/null @@ -1,3 +0,0 @@ -import fetch from 'node-fetch' - -export { fetch } diff --git a/packages/client-isomorphic-fetch/types.d.ts b/packages/client-isomorphic-fetch/types.d.ts deleted file mode 100644 index 130b16c5..00000000 --- a/packages/client-isomorphic-fetch/types.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const nativeFetch: typeof fetch - -export { nativeFetch as fetch } diff --git a/packages/client-isomorphic-ws/CHANGELOG.md b/packages/client-isomorphic-ws/CHANGELOG.md deleted file mode 100644 index 7c2bc945..00000000 --- a/packages/client-isomorphic-ws/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# @iroha2/client-isomorphic-ws - -## 0.2.0 - -### Minor Changes - -- b86aa76: **refactor**: **BREAKING** `IncomingData` type is always transformed into `ArrayBufferView` diff --git a/packages/client-isomorphic-ws/README.md b/packages/client-isomorphic-ws/README.md deleted file mode 100644 index 48d91663..00000000 --- a/packages/client-isomorphic-ws/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# `@iroha2/client-isomorphic-ws` - -**This package is no longer in use.** Check [`client`](../client/README.md) for the instructions on how to use isomorphic web socket. - -> The `@iroha2/client-isomorphic-ws` used to contain Isomorphic WebSocket transport for [`@iroha2/client`](../client/). -> -> In the `package.json`, the `main` entry was used to refer to `ws` package wrapper (for Node.js), and `module` to refer to native WebSocket wrapper. diff --git a/packages/client-isomorphic-ws/package.json b/packages/client-isomorphic-ws/package.json deleted file mode 100644 index 6b99acd9..00000000 --- a/packages/client-isomorphic-ws/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@iroha2/client-isomorphic-ws", - "version": "0.2.0", - "license": "Apache 2.0", - "main": "src/ws.ts", - "module": "src/native.ts", - "types": "types.d.ts", - "files": [ - "dist", - "types.d.ts" - ], - "publishConfig": { - "main": "dist/ws.js", - "module": "dist/native.js", - "types": "dist/lib.d.ts" - }, - "scripts": { - "build": "run-p build:ws build:native", - "build:ws": "esbuild --bundle src/ws.ts --platform=node --format=cjs --outfile=dist/ws.js --external:ws", - "build:native": "esbuild --bundle src/native.ts --format=esm --outfile=dist/native.js" - }, - "dependencies": { - "ws": "^8.4.0" - }, - "devDependencies": { - "@types/ws": "^8.2.2", - "esbuild": "^0.14.27", - "npm-run-all": "^4.1.5" - } -} diff --git a/packages/client-isomorphic-ws/src/__test.ts b/packages/client-isomorphic-ws/src/__test.ts deleted file mode 100644 index 7a2de4c5..00000000 --- a/packages/client-isomorphic-ws/src/__test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as types from '../types' -import * as native from './native' -import * as ws from './ws' - -function test(x: typeof types) {} - -test(native) -test(ws) diff --git a/packages/client-isomorphic-ws/src/native.ts b/packages/client-isomorphic-ws/src/native.ts deleted file mode 100644 index 00e15db8..00000000 --- a/packages/client-isomorphic-ws/src/native.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { IncomingData, initWebSocket as trueInit } from '../types' - -async function handleIncomingData(data: any): Promise { - if (data instanceof Blob) { - const buff = await new Response(data).arrayBuffer() - return new Uint8Array(buff) - } - - console.error('Bad incoming data:', data) - throw new Error('Unable to parse incoming data') -} - -export const initWebSocket: typeof trueInit = (params) => { - const socket = new WebSocket(params.url) - - socket.onclose = params.onclose - socket.onmessage = async (msg) => { - params.onmessage({ data: await handleIncomingData(msg.data) }) - } - socket.onerror = params.onerror - socket.onopen = params.onopen - - return { - send: (data) => socket.send(data), - close: (code, reason) => socket.close(code, reason), - isClosed: () => socket.readyState === socket.CLOSED, - } -} diff --git a/packages/client-isomorphic-ws/src/ws.ts b/packages/client-isomorphic-ws/src/ws.ts deleted file mode 100644 index a89c8e46..00000000 --- a/packages/client-isomorphic-ws/src/ws.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IncomingData, initWebSocket as trueInit } from '../types' -import WebSocket from 'ws' - -function handleIncomingData(data: string | Buffer | ArrayBuffer | Buffer[]): IncomingData { - if (Buffer.isBuffer(data)) { - return new Uint8Array(data) - } - - console.error('Bad incoming data:', data) - throw new Error('Unable to parse incoming data') -} - -export const initWebSocket: typeof trueInit = (params) => { - const socket = new WebSocket(params.url) - - socket.onopen = params.onopen - socket.onclose = params.onclose - socket.onmessage = (msg) => { - params.onmessage({ - data: handleIncomingData(msg.data), - }) - } - socket.onerror = params.onerror - - return { - isClosed: () => socket.readyState === socket.CLOSED, - send: (data) => socket.send(data), - close: (code, reason) => socket.close(code, reason), - } -} diff --git a/packages/client-isomorphic-ws/types.d.ts b/packages/client-isomorphic-ws/types.d.ts deleted file mode 100644 index f0d8cc40..00000000 --- a/packages/client-isomorphic-ws/types.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -export type SendData = string | ArrayBuffer -export type IncomingData = ArrayBufferView - -export interface IsomorphicWebSocket { - readonly send: (data: SendData) => void - readonly close: (code?: number, reason?: string) => void - readonly isClosed: () => boolean -} - -export interface CloseEvent { - readonly code: number - readonly reason: string - readonly wasClean: boolean -} - -export interface Event { - readonly type: string -} - -export interface MessageEvent { - readonly data: IncomingData -} - -export interface InitWebSocketParams { - url: string - onopen: (event: Event) => void - onclose: (event: CloseEvent) => void - onerror: (event: Event) => void - onmessage: (event: MessageEvent) => void -} - -export declare function initWebSocket(params: InitWebSocketParams): IsomorphicWebSocket diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md deleted file mode 100644 index 4b186f0a..00000000 --- a/packages/client/CHANGELOG.md +++ /dev/null @@ -1,434 +0,0 @@ -# @iroha2/client - -## 7.1.0 - -### Minor Changes - -- a780a96: **feat:** add full support of Query API, soft-deprecating previous improper implementation - - The new implementation is available via `Client.query`, `Torii.queryWithParams`, and `doQuery` functions. - -- 787a198: **refactor:** handle the major update of `@iroha2/crypto-core` -- a780a96: **feat:** soft-deprecate `computeTransactionHash`; add `computeTransactionPayloadHash` & `computeSignedTransactionHash` instead, with descriptions which one to use and when - -### Patch Changes - -- Updated dependencies [787a198] - - @iroha2/crypto-core@2.0.0 - - @iroha2/data-model@7.1.0 - -## 7.0.0 - -### Major Changes - -- e0459fa: **Target [Iroha `2.0.0-pre-rc.20`](https://github.com/hyperledger/iroha/tree/51d687607fad067fc855e266edc684d4fb33e7de)** - -### Patch Changes - -- e0459fa: refactor: follow the update of the data model -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] - - @iroha2/data-model@7.0.0 - - @iroha2/crypto-core@1.1.1 - -## 6.0.0 - -### Major Changes - -- 40516f1: Updated according to Iroha `2.0.0-pre-rc.14` (internal release, reference hash: `726f5eabf65a79ea618b4fce62a09cee7a5b13d1`) - - Notable changes: - - - Renamed structure: ~~`QueryError`~~ `QueryExecutionFailure` - - Introduced new enum struct, `Algorithm`. Changed `digest_function: string` field in `PublicKey` and `PrivateKey` to `digest_function: Algorithm`: - ```ts - PublicKey({ - digest_function: Algorithm('Ed25519'), - // ... - }) - ``` - -### Patch Changes - -- Updated dependencies [40516f1] -- Updated dependencies [40516f1] - - @iroha2/data-model@6.0.0 - - @iroha2/crypto-core@1.1.0 - -## 5.0.0 - -### Major Changes - -- d1e5f68: **chore!**: remove deprecated `makeSignedTransaction` and `makeSignedQuery` helpers -- d1e5f68: **refactor!**: remove `accepted` socket event due to the change in how WebSocket communication is now happening - -### Patch Changes - -- 3ff768d: **docs**: update target Iroha version (`c4af68c4f7959b154eb5380aa93c894e2e63fe4e`) -- Updated dependencies [d1e5f68] -- Updated dependencies [3ff768d] -- Updated dependencies [d1e5f68] - - @iroha2/data-model@5.0.0 - - @iroha2/crypto-core@1.0.1 - -## 4.1.0 - -### Minor Changes - -- 650cdb0: **chore**: update `ws` version; move `ws` and `@types/ws` to peer dependencies -- ddfeeac: **refactor**: target new major version of `@iroha2/crypto-core` - -### Patch Changes - -- 650cdb0: **docs**: update README -- Updated dependencies [ddfeeac] - - @iroha2/crypto-core@1.0.0 - - @iroha2/data-model@4.1.0 - -## 4.0.0 - -### Major Changes - -- e27467e: Update client library after data-model update in Iroha 2. -- bd757cf: **refactor!**: make `Torii` stateless; force prerequisites to be passed for each method. - - ##### What is the change - - Previously, `Torii` was a class, and its constructor accepted all prerequisites at once: - - ```ts - const torii = new Torii({ apiURL, telemetryURL, fetch, ws }) - - torii.submit(transaction) - torii.getStatus() - torii.listenForEvents({ filter }) - ``` - - Now, `Torii` is a compendium of different methods. Each method has its own prerequisites: - - ```ts - Torii.submit({ apiURL, fetch }, transaction) - - Torii.getStatus({ telemetryURL, fetch }) - - Torii.listenForEvents({ apiURL, ws }, { filter }) - ``` - - ##### Why the change was made - - This change was introduced to allow you to only provide the prerequisites each method actually needs. For example, you no longer need to provide `ws` when all you want to do is submit a transaction. Only `fetch` and `apiURL` are needed for transaction to be submitted. - - ##### How to update your code - - You should pass the necessary prerequisites for each `Torii` method invocation. - - Previously, you had to create a single `Torii` instance: - - ```ts - const torii = new Torii({ apiURL, telemetryURL, fetch, ws }) - ``` - - You no longer need a single `Torii` instance. Instead, you create an object with necessary prerequisites: - - ```ts - const pre = { apiURL, fetch } - ``` - - Then pass the prerequisites when you need to call this method: - - ```ts - Torii.submit(pre, transaction) - ``` - -### Minor Changes - -- e27467e: Some functions were renamed: - - - `makeSignedTransaction` → `makeVersionedSignedTransaction` - - `makeSignedQuery` → `makeVersionedSignedQuery` - - Old names are still accessible. They are marked as `deprecated` and will be removed in future major releases. - -- bd757cf: **feat**: expose `keyPair` as a `public readonly` field from `Signer` - -### Patch Changes - -- Updated dependencies [e27467e] - - @iroha2/data-model@4.0.0 - -## 3.0.0 - -### Major Changes - -- 3b0db98: **refactor!**: split the library functionality into `Torii`, `Signer` and `Client` entities. - - ##### What is the change - - Previously, the `Client` class did everything: constructed transaction payloads, signed and submitted them, submitted queries, and so on. Now some of this functionality is handled by other classes. - - `Torii` does everything related to HTTP/WebSocket communication with Iroha Peer. `Signer` makes signatures. `Client` only wraps `Torii` and `Signer` and combines them together to create convenient methods. Utilities (e.g. making payloads, signing them, wrapping into final containers) are exported from the library as separate functions. - - ##### Why the change - - This change is based on a request to extend library functionality and make codebase more scalable. Separating crypto and transport functionality is a common practice for blockchain SDKs (e.g. take a look at [`ethers` project](https://docs.ethers.io/v5/)). - - ##### How to update your code - - The changes you need to make to the code are rather straightforward. Here we provide a couple of examples for you to compare the code before and after this breaking change. You can refer to `Torii`, `Signer` and `Client` type definitions for details. - - `Client` used to be initialized like this: - - ```ts - import { Client } from '@iroha2/client' - - const client = new Client({ - torii: { - apiURL: 'http://127.0.0.1:8080', - telemetryURL: 'http://127.0.0.1:8081', - }, - accountId, - keyPair, - fetch, - ws, - }) - ``` - - Now you need to initialize `Signer` and `Torii` separately before `Client` initialization: - - ```ts - import { Client, Torii, Signer } from '@iroha2/client' - - const signer = new Signer(accountId, keyPair) - - const torii = new Torii({ - apiURL: 'http://127.0.0.1:8080', - telemetryURL: 'http://127.0.0.1:8081', - fetch, - ws, - }) - - const client = new Client({ torii, signer }) - ``` - - As for `Client` methods, they used to be called like this: - - ```ts - client.submit(executable) - client.request(queryBox) - client.getHealth() - client.listenForEvents({ filter }) - ``` - - Now some methods are called directly via `Client` instance, while others are called via nested `Torii` instance: - - ```ts - client.submitExecutable(executable) - client.requestWithQueryBox(queryBox) - client.torii.getHealth() - client.torii.listenForEvents({ filter }) - ``` - -### Minor Changes - -- 3b0db98: **feat**: export utility functions to deal with Transaction/Query payload building, hashing and signing. - - For transactions: - - - `makeTransactionPayload()` - - `computeTransactionHash()` - - `signTransaction()` - - `makeSignedTransaction()` - - `executableIntoSignedTransaction()` - - For queries: - - - `makeQueryPayload()` - - `computeQueryHash()` - - `signQuery()` - - `makeSignedQuery()` - - `queryBoxIntoSignedQuery()` - -### Patch Changes - -- Updated dependencies [3b0db98] - - @iroha2/data-model@3.0.0 - -## 2.0.2 - -### Patch Changes - -- fbe19e9: **chore**: fix typo -- fbe19e9: **docs**: update versions table in README, chores -- Updated dependencies [fbe19e9] - - @iroha2/data-model@2.0.2 - -## 2.0.1 - -### Patch Changes - -- ff266d3: Import `json-bigint/lib/parse.js` directly - thus Node.js in ESM mode doesn't fail -- ff266d3: Update `@scale-codec/*` version that uses correct `.mjs` ext for ESM bundles -- Updated dependencies [ff266d3] - - @iroha2/data-model@2.0.1 - -## 2.0.0 - -### Major Changes - -- a99d219: **feat!**: move isomorphic http/ws adapters out of `Client` internals; expose `@iroha2/client/web-socket/native` and `@iroha2/client/web-socket/node` adapters - - ##### Why the change - - Previously, `@iroha2/client` used `@iroha2/client-isomorphic-ws` and `@iroha2/client-isomorphic-fetch` to seamlessly switch between environment-specific transports. - - The switching was done by `module` and `main` fields in `package.json` files due to how they work in CommonJS (CJS) and ESM contexts. In Node.js it was supposed to always be CJS context, and ESM was for browser context with its native APIs. - - However, Node.js is moving towards ESM, and our way to achieve isomorphism no longer works in this case. In ESM, our hack tries to use a browser's native `fetch` and `WebSocket`, which aren't available in Node.js. So we needed to find some other way. - - ##### What is the change - - We looked at how [`isomorphic-git`](https://github.com/isomorphic-git/isomorphic-git/tree/main#getting-started) solves the same problem and decided to force the end users to inject `fetch` and `ws` by themselves. - - Note that `fetch` injection is optional in the environment where Fetch API is available (i.e. in Browser or in Node > 17.5). Also, `@iroha2/client` exposes prepared adapters for WebSockets based on native `WebSocket` and on [`ws`](https://www.npmjs.com/package/ws) library. - - ##### How to migrate - - Provide `fetch`/`ws` by yourself. Follow the instruction in [`client` README](./README.md#isomorphic-transports). - -### Minor Changes - -- a99d219: **fix!**: define `exports` field; use `*.cjs` extension for `require()` imports and `*.mjs` for `import` - -### Patch Changes - -- Updated dependencies [a99d219] - - @iroha2/data-model@2.0.0 - -## 1.4.0 - -### Patch Changes - -- Updated dependencies [5439042] - - @iroha2/data-model@1.4.0 - -## 1.3.0 - -### Minor Changes - -- bdddf78: **breaking**: update and data-model accordingly to Iroha 2 RC 5 (`43be45fc7fb7b0bd73f87b4fef167d61680c8e1e`) -- bdddf78: **feat**: `client.request()` now accepts optional filter as `PredicateBox` - -### Patch Changes - -- 7ca19df: **feat**: `client.getHealth()` catches fetch errors and wraps them into `Result::Err` variant -- Updated dependencies [bdddf78] - - @iroha2/data-model@1.3.0 - -## 1.2.1 - -### Patch Changes - -- 49c8451: chore: include only necessary files into `files` field in the `package.json` -- Updated dependencies [49c8451] -- Updated dependencies [49c8451] - - @iroha2/crypto-core@0.1.1 - - @iroha2/data-model@1.2.1 - - @iroha2/client-isomorphic-fetch@0.2.0 - -## 1.2.0 - -### Minor Changes - -- update client according to updated data-model for RC4 (`d00e0a9172d2a887a97f504796db5f2e05939c10`) - -### Patch Changes - -- Updated dependencies - - @iroha2/data-model@1.2.0 - -## 1.1.0 - -### Minor Changes - -- e34f8a5: update client according to Iroha 2 RC 3 (`8d83a3eff33f29b49004a0a5efe643b10f0f256e`) - -### Patch Changes - -- Updated dependencies [a453fcd] -- Updated dependencies [a453fcd] -- Updated dependencies [e34f8a5] - - @iroha2/data-model@1.1.0 - -## 1.0.0 - -### Major Changes - -- b86aa76: Target Iroha: `iroha v2.0.0-pre-rc.2` (`920e4d12754b0f3bf08cbaa5221d91c27863fcdc`) - - - Using updated Data Model - - Completely refactor client methods, extend them with new APIs - `setPeerConfig()`, `getMetrics()`, `listenForBlocksStream()` - - New client configuration accepts account id and key pair - - `Client.create()` -> `new Client()` - -### Patch Changes - -- Updated dependencies [b86aa76] -- Updated dependencies [b86aa76] - - @iroha2/data-model@1.0.0 - - @iroha2/client-isomorphic-ws@0.2.0 - -## 0.4.1 - -### Patch Changes - -- 81f5a88: **fix**: use isomorphic implementations of Fetch API and WebSocket API - -## 0.4.0 - -### Minor Changes - -- 98d3638: **breaking**: remove `*` re-export from `@iroha2/data-model` -- 98d3638: **feat**: add `status` endpoint implementation -- 98d3638: **breaking**: update configuration format - - - Now both Torii API URl & Torii Status URL are optional, so it is possible to use client partially, e.g. if you only need to check status. - - `crypto` injection is excluded from the config. Now it should be set globally with `setCrypto()` function. - -### Patch Changes - -- 92c5a9a: Add library top-level short documentation -- 92c5a9a: Export `SetupEventsParams` type -- Updated dependencies [92c5a9a] -- Updated dependencies [98d3638] - - @iroha2/data-model@0.5.0 - -## 0.3.0 - -### Minor Changes - -- c59c85b: **Breaking:** update data model generation approach & usage with updated SCALE codec kit - -### Patch Changes - -- Updated dependencies [c59c85b] - - @iroha2/data-model@0.4.0 - -## 0.2.4 - -### Patch Changes - -- 0a583c2: deps: update code accordingly to changes in data-model pkg -- Updated dependencies [0a583c2] -- Updated dependencies [0a583c2] - - @iroha2/data-model@0.3.0 - -## 0.2.3 - -### Patch Changes - -- 1833de7: Update due to bump of `@iroha2/data-model` pkg -- Updated dependencies [1833de7] - - @iroha2/data-model@0.2.1 diff --git a/packages/client/README.md b/packages/client/README.md deleted file mode 100644 index d2bb09f2..00000000 --- a/packages/client/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# `@iroha2/client` - -Client for Iroha 2, which is used to submit requests to Iroha peer. - -## Target version - -This version of package targets [Iroha `2.0.0-pre-rc.20`](https://github.com/hyperledger/iroha/tree/51d687607fad067fc855e266edc684d4fb33e7de). - -## Installation - -The packages are published under the `@iroha2` scope into Iroha Nexus Registry. -To install `client` with `npm`/`pnpm`: - -1. Configure your package manager to fetch scoped packages from Nexus Registry. - - ```ini - # FILE: .npmrc - @iroha2:registry=https://nexus.iroha.tech/repository/npm-group/ - ``` - -2. Install the `client` package: - - ```shell - npm i @iroha2/client - ``` - -## Isomorphic transports - -Iroha Client uses WebSocket and HTTP to communicate with an Iroha Peer. There is no way for Iroha Client to communicate with a peer in an environment-agnostic way. - -Previously, `@iroha2/client` used `@iroha2/client-isomorphic-ws` and `@iroha2/client-isomorphic-fetch` to seamlessly switch between environment-specific transports. Due to Node.js moving towards ESM, the way isomorphism used to be achieved is no longer applicable, and these packages are no longer in use. - -Now the client provides additional entrypoints for isomorphic adapters, the same way it is done in [isomorphic-git](https://github.com/isomorphic-git/isomorphic-git/tree/main#getting-started). You need to provide `fetch`/`ws` yourself. - -### WebSocket - -For WebSocket, the client has two entrypoints: `@iroha2/client/web-socket/native` and `@iroha2/client/web-socket/node`. - -1. Import adapters: - - Import `@iroha2/client/web-socket/native` for when the native `WebSocket` exists: - - ```ts - import { adapter } from '@iroha2/client/web-socket/native' - ``` - - Import `@iroha2/client/web-socket/node` with the `ws` package (it is a peer dependency of the client package) for Node.js: - - ```bash - // you need to install `ws` package first - npm i ws @types/ws - ``` - - ```ts - import { adapter } from '@iroha2/client/web-socket/node' - ``` - -2. Use WebSocket adapter with Torii: - - ```ts - import { Torii } from '@iroha2/client' - - Torii.listenForEvents({ adapter }) - ``` - -### Fetch - -`fetch` could be provided in the same way. However, `@iroha2/client` does not provide it itself. There are `node-fetch` and `undici` packages that provide the `fetch` implementation that could be injected into Iroha Client. - -1. Import fetch from `node-fetch` **or** `undici` packages: - - ```ts - import nodeFetch from 'node-fetch' - import { fetch as undiciFetch } from 'undici' - ``` - -2. Inject `fetch` into Iroha Client: - - ```ts - import { Torii } from '@iroha2/client' - - Torii.getStatus({ fetch: nodeFetch as typeof fetch }) - ``` - - In Browser: - - ```ts - import { Torii } from '@iroha2/client' - - Torii.getStatus({ fetch: fetch.bind(window) }) - ``` - - > **Note**: we make `fetch.bind(window)` to avoid `TypeError: "'fetch' called on an object that does not implement interface Window."`. - -## Client Configuration - -Refer to Iroha 2 tutorial for instructions on how to [configure the client](https://hyperledger.github.io/iroha-2-docs/guide/javascript.html#_2-client-configuration). diff --git a/packages/client/api-ws.ts b/packages/client/api-ws.ts new file mode 100644 index 00000000..8b323a1a --- /dev/null +++ b/packages/client/api-ws.ts @@ -0,0 +1,121 @@ +import type Emittery from 'emittery' +import Debug from 'debug' +import * as dm from '@iroha/core/data-model' +import { getCodec } from '@iroha/core' +import { ENDPOINT_BLOCKS_STREAM, ENDPOINT_EVENTS } from './const.ts' +import type { SocketEmitMapBase } from './util.ts' +import { setupWebSocket } from './util.ts' +import type { IsomorphicWebSocketAdapter } from './web-socket/types.ts' + +const debugBlocksStream = Debug('@iroha/client:blocks-stream') +const debugEvents = Debug('@iroha/client:events') + +export class WebSocketAPI { + public readonly toriiBaseURL: URL + public readonly adapter: IsomorphicWebSocketAdapter + + public constructor(toriiBaseURL: URL, adapter: IsomorphicWebSocketAdapter) { + this.toriiBaseURL = toriiBaseURL + this.adapter = adapter + } + + public async blocksStream(params?: SetupBlocksStreamParams): Promise { + const { + ee, + send: sendRaw, + isClosed, + close, + accepted, + } = setupWebSocket({ + baseURL: this.toriiBaseURL, + endpoint: ENDPOINT_BLOCKS_STREAM, + parentDebugger: debugBlocksStream, + adapter: this.adapter, + }) + + ee.on('open', () => { + sendRaw( + getCodec(dm.BlockSubscriptionRequest).encode({ + fromBlockHeight: params?.fromBlockHeight?.map(BigInt) ?? new dm.NonZero(1n), + }).buffer, + ) + }) + + ee.on('message', (raw) => { + const block = getCodec(dm.SignedBlock).decode(raw) + ee.emit('block', block) + }) + + await accepted() + + return { + ee: + // Emittery typing bug + ee as unknown as Emittery, + stop: close, + isClosed, + } + } + + public async events(params?: SetupEventsParams): Promise { + const { + ee, + isClosed, + close, + accepted, + send: sendRaw, + } = setupWebSocket({ + baseURL: this.toriiBaseURL, + endpoint: ENDPOINT_EVENTS, + parentDebugger: debugEvents, + adapter: this.adapter, + }) + + ee.on('open', () => { + sendRaw(getCodec(dm.EventSubscriptionRequest).encode({ filters: params?.filters ?? [] }).buffer) + }) + + ee.on('message', (raw) => { + const event = getCodec(dm.EventBox).decode(raw) + ee.emit('event', event) + }) + + await accepted() + + return { + stop: close, + ee: + // Emittery typing bug :< + ee as any, + isClosed, + } + } +} + +export interface SetupBlocksStreamParams { + fromBlockHeight?: dm.NonZero +} + +export interface BlocksStreamEmitteryMap extends SocketEmitMapBase { + block: dm.SignedBlock +} + +export interface SetupBlocksStreamReturn { + stop: () => Promise + isClosed: () => boolean + ee: Emittery +} + +export interface EventsEmitteryMap extends SocketEmitMapBase { + event: dm.EventBox +} + +export interface SetupEventsParams { + filters?: dm.EventFilterBox[] +} + +export interface SetupEventsReturn { + stop: () => Promise + isClosed: () => boolean + ee: Emittery +} diff --git a/packages/client/api.spec.ts b/packages/client/api.spec.ts new file mode 100644 index 00000000..c2c44332 --- /dev/null +++ b/packages/client/api.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, test, vi } from 'vitest' +import { HttpTransport, MainAPI } from './api.ts' + +describe('HTTP Transport', () => { + test('when fetch is used, its "this" is undefined', async () => { + let capturedThis: unknown + const mock = vi.fn().mockImplementation(async function () { + // @ts-expect-error it's any and it's fine + capturedThis = this + return { text: async () => 'Healthy', status: 200 } + }) + + const api = new MainAPI(new HttpTransport(new URL('http://localhost'), mock)) + const result = await api.health() + + expect(result).toEqual({ kind: 'healthy' }) + expect(capturedThis).toBeUndefined() + }) +}) diff --git a/packages/client/api.ts b/packages/client/api.ts new file mode 100644 index 00000000..b24de8f6 --- /dev/null +++ b/packages/client/api.ts @@ -0,0 +1,217 @@ +import { assert } from '@std/assert' +import { getCodec, type Variant, type VariantUnit } from '@iroha/core' +import * as dm from '@iroha/core/data-model' +import type { Schema as DataModelSchema } from '@iroha/core/data-model/schema' +import { + ENDPOINT_CONFIGURATION, + ENDPOINT_HEALTH, + ENDPOINT_METRICS, + ENDPOINT_PEERS, + ENDPOINT_QUERY, + ENDPOINT_SCHEMA, + ENDPOINT_STATUS, + ENDPOINT_TRANSACTION, + HEALTHY_RESPONSE, +} from './const.ts' +import { urlJoinPath } from './util.ts' + +/** + * Peer information returned from {@link ApiTelemetry.peers} + */ +export interface PeerJson { + /** + * Socket address of the peer + */ + address: string + /** + * Peer public key + */ + id: dm.PublicKey +} + +export interface PeerConfig { + logger: { + level: dm.Level['kind'] + } +} + +export type Fetch = typeof fetch + +export type HealthResult = VariantUnit<'healthy'> | Variant<'error', unknown> + +export class ResponseError extends Error { + public static async assertStatus(response: Response, status: number) { + if (response.status !== status) { + let message = 'got an error response' + if (/text\/plain/.test(response.headers.get('content-type') ?? '')) { + message = await response.text() + } + throw new ResponseError(response, message) + } + } + + public constructor(response: Response, message: string) { + super(`${response.status} (${response.statusText}): ${message}`) + } +} + +/** + * Adapter for HTTP requests made by various methods. + */ +export class HttpTransport { + public readonly toriiBaseURL: URL + private readonly fetch: Fetch + + /** + * @param toriiBaseURL URL of Torii (Iroha API Gateway) + * @param fetch `fetch` implementation for environments where it is not available globally. + * For example, you might need to use `node-fetch` or `undici` in older versions of Node.js. + */ + public constructor(toriiBaseURL: URL, fetch?: Fetch) { + this.toriiBaseURL = toriiBaseURL + this.fetch = fetch ?? globalThis.fetch + } + + public getFetch(): Fetch { + // this is needed to avoid an issue when `Window.fetch` is called with `this` object not being `Window` + return this.fetch + } +} + +export class MainAPI { + /** + * Works only if Iroha is compiled with `telemetry` feature flag. + */ + public readonly telemetry: ApiTelemetry + + private readonly http: HttpTransport + + public constructor(http: HttpTransport) { + this.http = http + this.telemetry = new ApiTelemetry(http) + } + + public async health(): Promise { + let response: Response + try { + response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_HEALTH)) + } catch (err) { + return { kind: 'error', value: err } + } + + await ResponseError.assertStatus(response, 200) + + const text = await response.text() + if (text !== HEALTHY_RESPONSE) { + return { kind: 'error', value: new Error(`Expected '${HEALTHY_RESPONSE}' response; got: '${text}'`) } + } + + return { kind: 'healthy' } + } + + public async transaction(transaction: dm.SignedTransaction): Promise { + const body = getCodec(dm.SignedTransaction).encode(transaction) + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_TRANSACTION), { + body, + method: 'POST', + }) + await ResponseError.assertStatus(response, 200) + } + + public async query(query: dm.SignedQuery): Promise { + return this.http + .getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_QUERY), { + method: 'POST', + body: getCodec(dm.SignedQuery).encode(query), + }) + .then(handleQueryResponse) + } + + public async getConfig(): Promise { + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_CONFIGURATION)) + await ResponseError.assertStatus(response, 200) + return response.json() + } + + public async setConfig(config: PeerConfig): Promise { + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_CONFIGURATION), { + method: 'POST', + body: JSON.stringify(config), + headers: { + 'Content-Type': 'application/json', + }, + }) + await ResponseError.assertStatus(response, 202 /* ACCEPTED */) + } + + /** + * Will only work if Iroha is compiled with `schema` feature enabled. + */ + public async schema(): Promise { + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_SCHEMA)) + await ResponseError.assertStatus(response, 200) + return response.json() + } +} + +async function handleQueryResponse(resp: Response): Promise { + if (resp.status === 200) { + const bytes = await resp.arrayBuffer() + return getCodec(dm.QueryResponse).decode(new Uint8Array(bytes)) + } else if (resp.status >= 400 && resp.status < 500) { + const bytes = await resp.arrayBuffer() + const error = getCodec(dm.ValidationFail).decode(new Uint8Array(bytes)) + throw new QueryValidationError(error) + } + throw new Error(`unexpected response from Iroha: ${resp.status} ${resp.statusText}`) +} + +export class QueryValidationError extends Error { + public reason: dm.ValidationFail + + public constructor(reason: dm.ValidationFail) { + super() + + this.name = 'QueryValidationError' + this.reason = reason + } +} + +// TODO: handle errors with a hint that Iroha might be not compiled with the needed features +export class ApiTelemetry { + private readonly http: HttpTransport + + public constructor(http: HttpTransport) { + this.http = http + } + + public async status(): Promise { + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_STATUS), { + headers: { accept: 'application/x-parity-scale' }, + }) + await ResponseError.assertStatus(response, 200) + return response.arrayBuffer().then((buffer) => getCodec(dm.Status).decode(new Uint8Array(buffer))) + } + + public async peers(): Promise { + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_PEERS)) + await ResponseError.assertStatus(response, 200) + return response.json().then( + // array of strings in format `@` + (ids: string[]) => { + assert(Array.isArray(ids)) + return ids.map((id) => { + assert(typeof id === 'string') + const [pubkey, address] = id.split('@') + return { id: dm.PublicKey.fromMultihash(pubkey), address } + }) + }, + ) + } + + public async metrics(): Promise { + const response = await this.http.getFetch()(urlJoinPath(this.http.toriiBaseURL, ENDPOINT_METRICS)) + await ResponseError.assertStatus(response, 200) + return response.text() + } +} diff --git a/packages/client/client.spec.ts b/packages/client/client.spec.ts new file mode 100644 index 00000000..e43bb033 --- /dev/null +++ b/packages/client/client.spec.ts @@ -0,0 +1,6 @@ +import { describe, test } from 'vitest' + +describe('transaction', () => { + // I don't know how to test it; delayed + test.todo('verify abort signal works') +}) diff --git a/packages/client/client.ts b/packages/client/client.ts new file mode 100644 index 00000000..4165f20e --- /dev/null +++ b/packages/client/client.ts @@ -0,0 +1,188 @@ +/** + * @module @iroha2/client + */ + +/** + * @packageDocumentation + * + * Client library to interact with Iroha v2 Peer. Library implements Transactions, Queries, + * Events, Status & Health check. + */ + +import type { KeyPair, PrivateKey } from '@iroha/core/crypto' +import * as dm from '@iroha/core/data-model' +import type { Except } from 'type-fest' +import defer from 'p-defer' +import { buildTransactionPayload, signTransaction, transactionHash, type TransactionPayloadParams } from '@iroha/core' + +import { type Fetch, HttpTransport, MainAPI } from './api.ts' +import { + type SetupBlocksStreamParams, + type SetupBlocksStreamReturn, + type SetupEventsParams, + type SetupEventsReturn, + WebSocketAPI, +} from './api-ws.ts' +import type { IsomorphicWebSocketAdapter } from './web-socket/types.ts' +import { FindAPI } from './find-api._generated_.ts' +import { QueryExecutor } from './query.ts' + +export interface CreateClientParams { + fetch?: Fetch + ws: IsomorphicWebSocketAdapter + toriiBaseURL: URL + chain: string + accountDomain: dm.DomainId + accountKeyPair: KeyPair +} + +export interface SubmitParams { + /** + * Whether to wait for the transaction to be accepted/rejected/expired. + * @default false + */ + verify?: boolean + verifyAbort?: AbortSignal +} + +export class TransactionRejectedError extends Error { + public reason: dm.TransactionRejectionReason + + public constructor(reason: dm.TransactionRejectionReason) { + super() + this.name = 'TransactionRejectedError' + this.reason = reason + } +} + +export class TransactionExpiredError extends Error { + public constructor() { + super() + this.name = 'TransactionExpiredError' + } +} + +export class Client { + public readonly params: CreateClientParams + + /** + * Raw API calls. + */ + public readonly api: MainAPI + /** + * Raw WebSocket API calls. + */ + public readonly socket: WebSocketAPI + /** + * Shortcuts for querying data from Iroha + */ + public readonly find: FindAPI + + public constructor(params: CreateClientParams) { + this.params = params + const http = new HttpTransport(params.toriiBaseURL, params.fetch) + this.api = new MainAPI(http) + + const executor = new QueryExecutor(this.api, this.authority(), this.authorityPrivateKey()) + this.find = new FindAPI(executor) + + this.socket = new WebSocketAPI(params.toriiBaseURL, params.ws) + } + + public authority(): dm.AccountId { + return new dm.AccountId( + this.params.accountKeyPair.publicKey(), + this.params.accountDomain, + ) + } + + public authorityPrivateKey(): PrivateKey { + return this.params.accountKeyPair.privateKey() + } + + public transaction( + executable: dm.Executable, + params?: Except, + ): TransactionHandle { + const tx = signTransaction( + buildTransactionPayload(executable, { + chain: this.params.chain, + authority: this.authority(), + ...params, + }), + this.params.accountKeyPair.privateKey(), + ) + + return new TransactionHandle(tx, this) + } + + public async events(params?: SetupEventsParams): Promise { + return this.socket.events(params) + } + + public async blocks(params?: SetupBlocksStreamParams): Promise { + return this.socket.blocksStream(params) + } +} + +export class TransactionHandle { + private readonly client: Client + private readonly tx: dm.SignedTransaction + private readonly txHash: dm.Hash + + public constructor(tx: dm.SignedTransaction, client: Client) { + this.client = client + this.tx = tx + this.txHash = transactionHash(tx) + } + + public get hash(): dm.Hash { + return this.txHash + } + + public async submit(params?: SubmitParams) { + if (params?.verify) { + // const hash = transactionHash(tx) + const stream = await this.client.events({ + filters: [ + dm.EventFilterBox.Pipeline.Transaction({ + hash: this.txHash, + blockHeight: null, + // TODO: include "status" when Iroha API is fixed about it + // FIXME: Iroha design issue + // If I want to filter by "rejected" status, I will also have to include a rejection reason into the + // filter. I could imagine users wanting to just watch for rejections with all possible reasons. + status: null, + }), + ], + }) + + // TODO: replace with Promise.withResolvers + const confirmation = defer() + stream.ee.on('event', (event) => { + if (event.kind === 'Pipeline' && event.value.kind === 'Transaction') { + const txEvent = event.value.value + if (txEvent.status.kind === 'Approved') confirmation.resolve() + else if (txEvent.status.kind === 'Rejected') { + confirmation.reject(new TransactionRejectedError(txEvent.status.value)) + } else if (txEvent.status.kind === 'Expired') confirmation.reject(new TransactionExpiredError()) + } + }) + stream.ee.on('close', () => { + confirmation.reject(new Error('Events stream was unexpectedly closed')) + }) + params.verifyAbort?.addEventListener('abort', () => { + confirmation.reject(new Error('Aborted')) + }) + + try { + await this.client.api.transaction(this.tx) + await confirmation.promise + } finally { + stream.stop() + } + } else { + await this.client.api.transaction(this.tx) + } + } +} diff --git a/packages/client/src/const.ts b/packages/client/const.ts similarity index 75% rename from packages/client/src/const.ts rename to packages/client/const.ts index e6d6fbfa..47061dfe 100644 --- a/packages/client/src/const.ts +++ b/packages/client/const.ts @@ -2,9 +2,11 @@ export const ENDPOINT_HEALTH = '/health' export const ENDPOINT_TRANSACTION = '/transaction' export const ENDPOINT_QUERY = '/query' export const ENDPOINT_CONFIGURATION = '/configuration' +export const ENDPOINT_SCHEMA = '/schema' export const ENDPOINT_EVENTS = '/events' export const ENDPOINT_BLOCKS_STREAM = '/block/stream' export const ENDPOINT_STATUS = '/status' +export const ENDPOINT_PEERS = '/peers' export const ENDPOINT_METRICS = '/metrics' -export const HEALTHY_RESPONSE = `"Healthy"` +export const HEALTHY_RESPONSE = `Healthy` diff --git a/packages/client/deno.jsonc b/packages/client/deno.jsonc new file mode 100644 index 00000000..b23dd202 --- /dev/null +++ b/packages/client/deno.jsonc @@ -0,0 +1,15 @@ +{ + "name": "@iroha/client", + "version": "0.0.0", + "exports": { + ".": "./mod.ts", + "./web-socket/native": "./web-socket/native.ts", + "./web-socket/node": "./web-socket/node.ts" + }, + "imports": { + "debug": "npm:debug@^4.4.0", + "emittery": "npm:emittery@^1.1.0", + "p-defer": "npm:p-defer@^4.0.1", + "ws": "npm:ws@^8.18.0" + } +} diff --git a/packages/client/find-api._generated_.prelude.ts b/packages/client/find-api._generated_.prelude.ts new file mode 100644 index 00000000..f355b208 --- /dev/null +++ b/packages/client/find-api._generated_.prelude.ts @@ -0,0 +1,29 @@ +import { + buildQuery, + type BuildQueryParams, + type GetQueryPayload, + type GetSingularQueryOutput, + type QueryKind, + type SingularQueryKind, +} from '@iroha/core' +import { type QueryExecutor, QueryHandle } from './query.ts' + +export * from './query.ts' + +export function buildQueryHandle( + executor: QueryExecutor, + kind: K, + payload: GetQueryPayload, + params?: BuildQueryParams, +): QueryHandle { + const query = buildQuery(kind, payload, params) + return new QueryHandle(query, executor) +} + +export async function executeSingularQuery( + executor: QueryExecutor, + kind: K, +): Promise> { + const result = await executor.executeSingular({ kind }) + return result.value as GetSingularQueryOutput +} diff --git a/packages/client/mod.ts b/packages/client/mod.ts new file mode 100644 index 00000000..0cf5fa5f --- /dev/null +++ b/packages/client/mod.ts @@ -0,0 +1,4 @@ +export * from './api.ts' +export * from './api-ws.ts' +export * from './query.ts' +export * from './client.ts' diff --git a/packages/client/package.json b/packages/client/package.json deleted file mode 100644 index 46f5c5b6..00000000 --- a/packages/client/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "@iroha2/client", - "version": "7.1.0", - "module": "dist/lib.mjs", - "main": "dist/lib.cjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "require": "./dist/lib.cjs", - "types": "./dist/lib.d.ts" - }, - "./web-socket/native": { - "import": "./dist/web-socket/native.mjs", - "require": "./dist/web-socket/native.cjs", - "types": "./dist/web-socket/native.d.ts" - }, - "./web-socket/node": { - "import": "./dist/web-socket/node.mjs", - "require": "./dist/web-socket/node.cjs", - "types": "./dist/web-socket/node.d.ts" - } - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "license": "Apache 2.0", - "engines": { - "node": ">=14.0.0" - }, - "scripts": { - "test:integration": "run-s test:build-iroha test:node test:web", - "test:build-iroha": "pnpm --filter iroha-source build:iroha", - "test:node": "pnpm --filter client-test-node test", - "test:web": "pnpm --filter client-test-web test" - }, - "dependencies": { - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/data-model": "workspace:7.1.0", - "debug": "^4.3.4", - "emittery": "^0.10.1", - "json-bigint": "^1.0.0", - "type-fest": "^3.6.1" - }, - "devDependencies": { - "@types/debug": "^4.1.7", - "@types/ws": "^8.5.3", - "ws": "^8.8.1" - }, - "peerDependencies": { - "@types/ws": "^8.5.3", - "ws": "^8.8.1" - } -} diff --git a/packages/client/query.ts b/packages/client/query.ts new file mode 100644 index 00000000..f6d619ff --- /dev/null +++ b/packages/client/query.ts @@ -0,0 +1,78 @@ +import { type BuildQueryResult, signQuery } from '@iroha/core' +import * as dm from '@iroha/core/data-model' +import type { PrivateKey } from '@iroha/core/crypto' +import { assert } from '@std/assert' +import type { MainAPI } from './api.ts' + +export class QueryExecutor { + private readonly api: MainAPI + private readonly authority: dm.AccountId + private readonly privateKey: PrivateKey + + public constructor(api: MainAPI, authority: dm.AccountId, authorityPrivateKey: PrivateKey) { + this.api = api + this.authority = authority + this.privateKey = authorityPrivateKey + } + + public async *execute(query: dm.QueryWithParams): AsyncGenerator { + let continueCursor: dm.ForwardCursor | null = null + do { + const response = await this.api.query( + this.signQuery(continueCursor ? dm.QueryRequest.Continue(continueCursor) : dm.QueryRequest.Start(query)), + ) + + assert(response.kind === 'Iterable') + yield response.value + + continueCursor = response.value.continueCursor + } while (continueCursor) + } + + public async executeSingular(query: dm.SingularQueryBox): Promise { + const response = await this.api.query(this.signQuery({ kind: 'Singular', value: query })) + assert(response.kind === 'Singular') + return response.value + } + + public signQuery(request: dm.QueryRequest): dm.SignedQuery { + return signQuery({ request, authority: this.authority }, this.privateKey) + } +} + +export class QueryHandle { + private readonly _query: BuildQueryResult + private readonly _executor: QueryExecutor + + public constructor(query: BuildQueryResult, executor: QueryExecutor) { + this._query = query + this._executor = executor + } + + public async executeAll(): Promise { + const items: Output[] = [] + for await (const batch of this.batches()) { + items.push(...batch) + } + return items + } + + public async executeSingle(): Promise { + const items = await this.executeAll() + if (items.length === 1) return items[0] + throw new TypeError(`Expected query to return exactly one element, got ${items.length}`) + } + + public async executeSingleOpt(): Promise { + const items = await this.executeAll() + if (items.length <= 1) return items.at(0) ?? null + throw new TypeError(`Expected query to return one or non elements, got ${items.length}`) + } + + public async *batches(): AsyncGenerator { + for await (const { batch } of this._executor.execute(this._query.query)) { + const items = [...this._query.parseResponse(batch)] + yield items + } + } +} diff --git a/packages/client/src/blocks-stream.ts b/packages/client/src/blocks-stream.ts deleted file mode 100644 index 030e83bc..00000000 --- a/packages/client/src/blocks-stream.ts +++ /dev/null @@ -1,58 +0,0 @@ -import Emittery from 'emittery' -import Debug from 'debug' -import { datamodel } from '@iroha2/data-model' -import { ENDPOINT_BLOCKS_STREAM } from './const' -import { SocketEmitMapBase, setupWebSocket } from './util' -import { IsomorphicWebSocketAdapter } from './web-socket/types' - -const debug = Debug('@iroha2/client:blocks-stream') - -export interface SetupBlocksStreamParams { - toriiApiURL: string - height: datamodel.NonZeroU64 - adapter: IsomorphicWebSocketAdapter -} - -export interface BlocksStreamEmitteryMap extends SocketEmitMapBase { - block: datamodel.SignedBlockV1 -} - -export interface SetupBlocksStreamReturn { - stop: () => Promise - isClosed: () => boolean - ee: Emittery -} - -export async function setupBlocksStream(params: SetupBlocksStreamParams): Promise { - const { - ee, - send: sendRaw, - isClosed, - close, - accepted, - } = setupWebSocket({ - baseURL: params.toriiApiURL, - endpoint: ENDPOINT_BLOCKS_STREAM, - parentDebugger: debug, - adapter: params.adapter, - }) - - ee.on('open', () => { - sendRaw(datamodel.BlockSubscriptionRequest.toBuffer(params.height)) - }) - - ee.on('message', (raw) => { - const block = datamodel.BlockMessage.fromBuffer(raw).enum.content - ee.emit('block', block) - }) - - await accepted() - - return { - ee: - // Emittery typing bug - ee as unknown as Emittery, - stop: close, - isClosed, - } -} diff --git a/packages/client/src/crypto-singleton.ts b/packages/client/src/crypto-singleton.ts deleted file mode 100644 index 087d1348..00000000 --- a/packages/client/src/crypto-singleton.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IrohaCryptoInterface } from '@iroha2/crypto-core' - -let __crypto: IrohaCryptoInterface | null = null - -export function setCrypto(crypto: IrohaCryptoInterface | null) { - __crypto = crypto -} - -export function getCrypto(): null | IrohaCryptoInterface { - return __crypto -} - -export function getCryptoAnyway(): IrohaCryptoInterface { - const crypto = getCrypto() - if (!crypto) - throw new Error( - '"crypto" is not defined, but required for `@iroha2/client` to function. Have you set it with `setCrypto()`?', - ) - return crypto -} diff --git a/packages/client/src/events.ts b/packages/client/src/events.ts deleted file mode 100644 index 6737a21d..00000000 --- a/packages/client/src/events.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { datamodel } from '@iroha2/data-model' -import Emittery from 'emittery' -import Debug from 'debug' -import { SocketEmitMapBase, setupWebSocket } from './util' -import { ENDPOINT_EVENTS } from './const' -import { IsomorphicWebSocketAdapter } from './web-socket/types' - -const debug = Debug('@iroha2/client:events') - -export interface EventsEmitteryMap extends SocketEmitMapBase { - event: datamodel.Event -} - -export interface SetupEventsParams { - toriiApiURL: string - filter: datamodel.FilterBox - adapter: IsomorphicWebSocketAdapter -} - -export interface SetupEventsReturn { - stop: () => Promise - isClosed: () => boolean - ee: Emittery -} - -/** - * Promise resolved when connection handshake is acquired - */ -export async function setupEvents(params: SetupEventsParams): Promise { - const { - ee, - isClosed, - close, - accepted, - send: sendRaw, - } = setupWebSocket({ - baseURL: params.toriiApiURL, - endpoint: ENDPOINT_EVENTS, - parentDebugger: debug, - adapter: params.adapter, - }) - - ee.on('open', () => { - sendRaw(datamodel.EventSubscriptionRequest.toBuffer(params.filter)) - }) - - ee.on('message', (raw) => { - const event = datamodel.EventMessage.fromBuffer(raw) - ee.emit('event', event) - }) - - await accepted() - - return { - stop: close, - ee: - // Emittery typing bug :< - ee as any, - isClosed, - } -} diff --git a/packages/client/src/json-bigint-shim.d.ts b/packages/client/src/json-bigint-shim.d.ts deleted file mode 100644 index c88879e8..00000000 --- a/packages/client/src/json-bigint-shim.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module 'json-bigint/lib/parse.js' { - interface Options { - useNativeBigInt?: boolean - } - - declare function factory(opts?: Options): (text: string) => any - - export default factory -} diff --git a/packages/client/src/lib.ts b/packages/client/src/lib.ts deleted file mode 100644 index dbcdfbce..00000000 --- a/packages/client/src/lib.ts +++ /dev/null @@ -1,517 +0,0 @@ -/** - * @packageDocumentation - * - * Client library to interact with Iroha v2 Peer. Library implements Transactions, Queries, - * Events, Status & Health check. - */ - -import { Bytes, cryptoTypes, freeScope } from '@iroha2/crypto-core' -import { Enumerate, RustResult, datamodel, variant } from '@iroha2/data-model' -import { Except } from 'type-fest' -import { SetupBlocksStreamParams, SetupBlocksStreamReturn, setupBlocksStream } from './blocks-stream' -import { - ENDPOINT_CONFIGURATION, - ENDPOINT_HEALTH, - ENDPOINT_METRICS, - ENDPOINT_QUERY, - ENDPOINT_STATUS, - ENDPOINT_TRANSACTION, - HEALTHY_RESPONSE, -} from './const' -import { SetupEventsParams, SetupEventsReturn, setupEvents } from './events' -import { cryptoHash, parseJsonWithBigInts } from './util' -import { IsomorphicWebSocketAdapter } from './web-socket/types' - -type Fetch = typeof fetch - -type KeyPair = cryptoTypes.KeyPair - -export interface SetPeerConfigParams { - LogLevel?: 'WARN' | 'ERROR' | 'INFO' | 'DEBUG' | 'TRACE' -} - -export class Signer { - public readonly keyPair: KeyPair - public readonly accountId: datamodel.AccountId - - public constructor(accountId: datamodel.AccountId, keyPair: KeyPair) { - this.accountId = accountId - this.keyPair = keyPair - } - - public sign(message: Bytes): datamodel.Signature { - return freeScope(() => { - const signature = this.keyPair.sign(message) - const publicKey = signature.publicKey().toDataModel() - - return datamodel.Signature({ - public_key: publicKey, - payload: signature.payload(), - }) - }) - } -} - -// #region Transaction helpers - -export interface MakeTransactionPayloadParams { - accountId: datamodel.AccountId - executable: datamodel.Executable - ttl?: datamodel.NonZeroU64 - /** - * @default Date.now() - */ - creationTime?: bigint - /** - * @default // none - */ - nonce?: datamodel.NonZeroU32 - metadata?: datamodel.SortedMapNameValue -} - -export function makeTransactionPayload(params: MakeTransactionPayloadParams): datamodel.TransactionPayload { - return datamodel.TransactionPayload({ - authority: params.accountId, - instructions: params.executable, - time_to_live_ms: params.ttl ? datamodel.OptionNonZeroU64('Some', params.ttl) : datamodel.OptionNonZeroU64('None'), - nonce: params?.nonce ? datamodel.OptionNonZeroU32('Some', params.nonce) : datamodel.OptionNonZeroU32('None'), - metadata: params?.metadata ?? datamodel.SortedMapNameValue(new Map()), - creation_time_ms: params.creationTime ?? BigInt(Date.now()), - }) -} - -/** - * This hash is used for transaction signatures, as well as emitted in transaction pipeline events. - */ -export function computeTransactionPayloadHash(payload: datamodel.TransactionPayload): Uint8Array { - return cryptoHash(Bytes.array(datamodel.TransactionPayload.toBuffer(payload))) -} - -/** - * This is the primary transaction hash and is used by queries like `FindTransactionByHash`. - */ -export function computeSignedTransactionHash(payload: datamodel.SignedTransaction): Uint8Array { - return cryptoHash(Bytes.array(datamodel.SignedTransaction.toBuffer(payload))) -} - -/** - * **Note:** this hash is used to create transaction signature (e.g. by {@link signTransaction}) - * and **it is different from the hash used to query transactions** (e.g. by `FindTransactionByHash` query). - * - * @deprecated Deprecated due to being ambiguous. Use {@link computeSignedTransactionHash} - * (if e.g. you are querying a transaction by its hash) or {@link computeTransactionPayloadHash} - * (if e.g. you are computing transaction signature, or listening for pipeline events). - */ -export const computeTransactionHash = computeTransactionPayloadHash - -export function signTransaction(payload: datamodel.TransactionPayload, signer: Signer): datamodel.Signature { - const hash = computeTransactionPayloadHash(payload) - return signer.sign(Bytes.array(hash)) -} - -export function makeSignedTransaction( - payload: datamodel.TransactionPayload, - signer: Signer, -): datamodel.SignedTransaction { - const signature = signTransaction(payload, signer) - return datamodel.SignedTransaction( - 'V1', - datamodel.SignedTransactionV1({ - payload, - signatures: datamodel.SortedVecSignature([signature]), - }), - ) -} - -export function executableIntoSignedTransaction(params: { - signer: Signer - executable: datamodel.Executable - payloadParams?: Except -}): datamodel.SignedTransaction { - return makeSignedTransaction( - makeTransactionPayload({ - executable: params.executable, - accountId: params.signer.accountId, - ...params.payloadParams, - }), - params.signer, - ) -} - -// #endregion - -// #region Query helpers - -interface MakeQueryPayloadParams { - accountId: datamodel.AccountId - query: datamodel.QueryBox - /** - * @default PredicateBox('Raw', Predicate('Pass')) - */ - filter?: datamodel.PredicateBox - timestampMs?: bigint -} - -export function makeQueryPayload(params: MakeQueryPayloadParams): datamodel.QueryPayload { - return datamodel.QueryPayload({ - authority: params.accountId, - query: params.query, - filter: params?.filter ?? datamodel.PredicateBox('Raw', datamodel.ValuePredicate('Pass')), - }) -} - -export function computeQueryHash(payload: datamodel.QueryPayload): Uint8Array { - return cryptoHash(Bytes.array(datamodel.QueryPayload.toBuffer(payload))) -} - -export function signQuery(payload: datamodel.QueryPayload, signer: Signer): datamodel.Signature { - const hash = computeQueryHash(payload) - return signer.sign(Bytes.array(hash)) -} - -export function makeSignedQuery(payload: datamodel.QueryPayload, signer: Signer): datamodel.SignedQuery { - const signature = signQuery(payload, signer) - return datamodel.SignedQuery('V1', datamodel.SignedQueryV1({ payload, signature })) -} - -export function queryBoxIntoSignedQuery(params: { - query: datamodel.QueryBox - signer: Signer - payloadParams?: Except -}): datamodel.SignedQuery { - return makeSignedQuery( - makeQueryPayload({ - query: params.query, - accountId: params.signer.accountId, - ...params.payloadParams, - }), - params.signer, - ) -} - -export interface QueryParams { - start?: number - limit?: number - sortByMetadataKey?: string -} - -function constructInitQueryParams(params?: QueryParams): URLSearchParams { - const baseParams: Record = {} - if (params?.start) { - baseParams.start = String(params.start) - } - if (params?.limit) { - baseParams.limit = String(params.limit) - } - if (params?.sortByMetadataKey) { - baseParams.sort_by_metadata_key = params.sortByMetadataKey - } - return new URLSearchParams(baseParams) -} - -export type QueryResponse = Enumerate<{ - Value: [datamodel.Value] - Iter: [IterableQueryResponseHandle] - Failure: [datamodel.ValidationFail] -}> - -export class IterableQueryResponseHandle { - public readonly first: datamodel.Value[] - public readonly next: AsyncGenerator - - public constructor(first: datamodel.Value[], next: AsyncGenerator) { - this.first = first - this.next = next - } - - public async all(): Promise { - const items: datamodel.Value[] = [...this.first] - for await (const batch of this.next) { - items.push(...batch) - } - return items - } -} - -// eslint-disable-next-line max-params -async function* nextBatchesGen( - pre: ToriiRequirementsForApiHttp, - initUrlParams: URLSearchParams, - initCursor: datamodel.ForwardCursor, - initQueryBlob: Uint8Array, -): AsyncGenerator { - const urlParams = new URLSearchParams(initUrlParams) - urlParams.set('query_id', initCursor.query_id.enum.as('Some')) - let next = initCursor.cursor.enum - while (next.tag === 'Some') { - urlParams.set('cursor', String(next.content)) - - const response = await pre.fetch(`${pre.apiURL}/query?${urlParams}`, { - method: 'POST', - body: initQueryBlob, - }) - if (response.status >= 400 && response.status < 500) { - throw new Error(`INTERNAL BUG: unexpected request error ${response.status}`, { cause: response }) - } - if (response.status !== 200) { - throw new Error('Network error', { cause: response }) - } - const buff = new Uint8Array(await response.arrayBuffer()) - - const { - batch, - cursor: { cursor }, - } = datamodel.BatchedResponseValue.fromBuffer(buff).enum.as('V1') - - if (batch.enum.tag !== 'Vec') throw new Error(`INTERNAL BUG: iterable query must always emit Vec batches`) - yield batch.enum.as('Vec') - - next = cursor.enum - } -} - -export async function doQuery( - pre: ToriiRequirementsForApiHttp, - query: datamodel.SignedQuery, - params?: QueryParams, -): Promise { - const urlParams = constructInitQueryParams(params) - const body = datamodel.SignedQuery.toBuffer(query) - - const response = await pre.fetch(`${pre.apiURL}/query?${urlParams}`, { - method: 'POST', - body, - }) - const buff = new Uint8Array(await response.arrayBuffer()) - - if (response.status >= 400 && response.status < 500) { - return variant('Failure', datamodel.ValidationFail.fromBuffer(buff)) - } else if (response.status !== 200) { - throw new Error(`HTTP request failed: ${response.status} ${response.statusText}`) - } - - const { batch, cursor } = datamodel.BatchedResponseValue.fromBuffer(buff).enum.as('V1') - - if (batch.enum.tag === 'Vec' && cursor.query_id.enum.tag === 'Some') { - // Iterable query - return variant( - 'Iter', - new IterableQueryResponseHandle(batch.enum.as('Vec'), nextBatchesGen(pre, urlParams, cursor, body)), - ) - } - - return variant('Value', batch) -} - -// #endregion - -// #region TORII - -export interface PeerStatus { - peers: bigint | number - blocks: bigint | number - txs_accepted: bigint | number - txs_rejected: bigint | number - uptime: { - secs: bigint | number - nanos: number - } - view_changes: bigint | number - queue_size: bigint | number -} - -export interface ToriiRequirementsPartUrlApi { - apiURL: string -} - -export interface ToriiRequirementsPartHttp { - fetch: Fetch -} - -export interface ToriiRequirementsPartWebSocket { - ws: IsomorphicWebSocketAdapter -} - -export type ToriiRequirementsForApiHttp = ToriiRequirementsPartUrlApi & ToriiRequirementsPartHttp - -export type ToriiRequirementsForApiWebSocket = ToriiRequirementsPartUrlApi & ToriiRequirementsPartWebSocket - -export type ToriiQueryResult = RustResult - -export interface ToriiApiHttp { - submit: (prerequisites: ToriiRequirementsForApiHttp, tx: datamodel.SignedTransaction) => Promise - /** - * @deprecated This method provides an incomplete implementation of Query API. Specifically, - * it doesn't account for live queries (therefore, it is not able to return more items - * than specified in Iroha's `FETCH_SIZE` limit) and pagination parameters. - * Use {@link queryWithParams} for complete implementation instead. - */ - request: (prerequisites: ToriiRequirementsForApiHttp, query: datamodel.SignedQuery) => Promise - queryWithParams: ( - prerequisites: ToriiRequirementsForApiHttp, - query: datamodel.SignedQuery, - params?: QueryParams, - ) => Promise - getHealth: (prerequisites: ToriiRequirementsForApiHttp) => Promise> - setPeerConfig: (prerequisites: ToriiRequirementsForApiHttp, params: SetPeerConfigParams) => Promise - getStatus: (prerequisites: ToriiRequirementsForApiHttp) => Promise - getMetrics: (prerequisites: ToriiRequirementsForApiHttp) => Promise -} - -export interface ToriiApiWebSocket { - listenForEvents: ( - prerequisites: ToriiRequirementsForApiWebSocket, - params: Pick, - ) => Promise - listenForBlocksStream: ( - prerequisites: ToriiRequirementsForApiWebSocket, - params: Pick, - ) => Promise -} - -export type ToriiOmnibus = ToriiApiHttp & ToriiApiWebSocket - -export const Torii: ToriiOmnibus = { - async submit(pre, tx) { - const body = datamodel.SignedTransaction.toBuffer(tx) - - const response = await pre.fetch(pre.apiURL + ENDPOINT_TRANSACTION, { - body, - method: 'POST', - }) - - ResponseError.throwIfStatusIsNot(response, 200) - }, - - async request(pre, query) { - const queryBytes = datamodel.SignedQuery.toBuffer(query) - const response = await pre - .fetch(pre.apiURL + ENDPOINT_QUERY, { - method: 'POST', - body: queryBytes!, - }) - .then() - - const bytes = new Uint8Array(await response.arrayBuffer()) - - if (response.status === 200) { - // OK - const value: datamodel.BatchedResponseV1Value = datamodel.BatchedResponseValue.fromBuffer(bytes).enum.content - return variant('Ok', value) - } else { - // ERROR - const error = datamodel.ValidationFail.fromBuffer(bytes) - return variant('Err', error) - } - }, - - async queryWithParams(pre, query, params) { - return doQuery(pre, query, params) - }, - - async getHealth(pre) { - let response: Response - try { - response = await pre.fetch(pre.apiURL + ENDPOINT_HEALTH) - } catch (err) { - return variant('Err', `Network error: ${String(err)}`) - } - - ResponseError.throwIfStatusIsNot(response, 200) - - const text = await response.text() - if (text !== HEALTHY_RESPONSE) { - return variant('Err', `Expected '${HEALTHY_RESPONSE}' response; got: '${text}'`) - } - - return variant('Ok', null) - }, - - async listenForEvents(pre, params: Pick) { - return setupEvents({ - filter: params.filter, - toriiApiURL: pre.apiURL, - adapter: pre.ws, - }) - }, - - async listenForBlocksStream(pre, params: Pick) { - return setupBlocksStream({ - height: params.height, - toriiApiURL: pre.apiURL, - adapter: pre.ws, - }) - }, - - async getStatus(pre): Promise { - const response = await pre.fetch(pre.apiURL + ENDPOINT_STATUS) - ResponseError.throwIfStatusIsNot(response, 200) - return response.text().then(parseJsonWithBigInts) - }, - - async getMetrics(pre) { - return pre.fetch(pre.apiURL + ENDPOINT_METRICS).then((response) => { - ResponseError.throwIfStatusIsNot(response, 200) - return response.text() - }) - }, - - async setPeerConfig(pre, params: SetPeerConfigParams) { - const response = await pre.fetch(pre.apiURL + ENDPOINT_CONFIGURATION, { - method: 'POST', - body: JSON.stringify(params), - headers: { - 'Content-Type': 'application/json', - }, - }) - ResponseError.throwIfStatusIsNot(response, 200) - }, -} - -export class ResponseError extends Error { - public static throwIfStatusIsNot(response: Response, status: number) { - if (response.status !== status) throw new ResponseError(response) - } - - public constructor(response: Response) { - super(`${response.status}: ${response.statusText}`) - } -} - -// #endregion - -// #region Client - -export class Client { - public readonly signer: Signer - - public constructor(params: { signer: Signer }) { - this.signer = params.signer - } - - public async submitExecutable(pre: ToriiRequirementsForApiHttp, executable: datamodel.Executable) { - return Torii.submit(pre, executableIntoSignedTransaction({ executable, signer: this.signer })) - } - - /** - * @deprecated For the same reason as {@link Torii.request}. Use {@link Client.query:instance} instead. - */ - public async requestWithQueryBox(pre: ToriiRequirementsForApiHttp, query: datamodel.QueryBox) { - return Torii.request(pre, queryBoxIntoSignedQuery({ query, signer: this.signer })) - } - - public async query( - pre: ToriiRequirementsForApiHttp, - query: datamodel.QueryBox, - params?: QueryParams, - ): Promise { - return Torii.queryWithParams(pre, queryBoxIntoSignedQuery({ query, signer: this.signer }), params) - } -} - -// #endregion - -export * from './events' -export * from './blocks-stream' -export * from './crypto-singleton' -export * from './web-socket/types' diff --git a/packages/client/test/integration/README.md b/packages/client/test/integration/README.md deleted file mode 100644 index 9c449664..00000000 --- a/packages/client/test/integration/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Integration tests of Iroha Client - -- [`test-node`](./test-node/) contains specs to run them with `test:node` command -- [`test-web`](./test-web/) contains a package with a Vite App and Cypress tests around it to run it all with `test:web` command - -**Important**: Do not run tests in parallel, because each test starts its own peer. diff --git a/packages/client/test/integration/test-node/.gitignore b/packages/client/test/integration/test-node/.gitignore deleted file mode 100644 index 1fc04e37..00000000 --- a/packages/client/test/integration/test-node/.gitignore +++ /dev/null @@ -1 +0,0 @@ -allure-results \ No newline at end of file diff --git a/packages/client/test/integration/test-node/.prettierignore b/packages/client/test/integration/test-node/.prettierignore deleted file mode 100644 index 1fc04e37..00000000 --- a/packages/client/test/integration/test-node/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -allure-results \ No newline at end of file diff --git a/packages/client/test/integration/test-node/CHANGELOG.md b/packages/client/test/integration/test-node/CHANGELOG.md deleted file mode 100644 index 3b4d50c8..00000000 --- a/packages/client/test/integration/test-node/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# @iroha2/client-test-node - -## null - -### Patch Changes - -- Updated dependencies [b86aa76] - - @iroha2/client@1.0.0 diff --git a/packages/client/test/integration/test-node/package.json b/packages/client/test/integration/test-node/package.json deleted file mode 100644 index 084a2b51..00000000 --- a/packages/client/test/integration/test-node/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@iroha2/client-test-node", - "private": true, - "scripts": { - "test": "cross-env DEBUG=@iroha2* vitest run", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@iroha2/client": "workspace:^7.1.0", - "@iroha2/crypto-target-node": "workspace:^2.0.0", - "@iroha2/test-configuration": "workspace:^", - "@iroha2/test-peer": "workspace:^0.0.1", - "allure-vitest": "^2.14.0", - "cross-env": "^7.0.3", - "fp-ts": "^2.13.1", - "immer": "^9.0.19", - "vite": "^5.1.5" - } -} diff --git a/packages/client/test/integration/test-node/test/compatibility/compatibility.spec.ts b/packages/client/test/integration/test-node/test/compatibility/compatibility.spec.ts deleted file mode 100644 index 6b736359..00000000 --- a/packages/client/test/integration/test-node/test/compatibility/compatibility.spec.ts +++ /dev/null @@ -1,212 +0,0 @@ -/** - * This file is for Compatibility Matrix tests, which assigns specific - * Allure context tags. - */ - -/* eslint-disable max-nested-callbacks */ - -import * as allure from 'allure-vitest' -import { pipe } from 'fp-ts/function' -import { describe, expect, test } from 'vitest' -import { clientFactory, setupPeerTestsLifecycle } from '../util' -import { annotateAllure } from './util' -import { datamodel, sugar } from '@iroha2/data-model' -import { CLIENT_CONFIG } from '@iroha2/test-configuration' -import { Seq } from 'immutable' - -setupPeerTestsLifecycle() - -// Read Allure API: https://allurereport.org/docs/vitest-reference/ -describe('Compatibility Matrix tests', () => { - // Based on https://github.com/AlexStroke/iroha-java/blob/007a9ac55991cd8a2b519e62a10144156d9f8301/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/InstructionsTest.kt#L134 - test('Register domain', async (ctx) => { - await annotateAllure(ctx, { - id: 4075, - feature: 'Domain', - story: 'Account registers a domain', - sdkTestId: 'register_domain', - }) - - const DOMAIN_NAME = 'new_domain_name' - const { pre, client, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - await allure.step(ctx, 'Submit transaction to register a new domain', async () => { - await blocks.wait(async () => { - await client.submitExecutable( - pre, - pipe(sugar.identifiable.newDomain(DOMAIN_NAME), sugar.instruction.register, sugar.executable.instructions), - ) - }) - }) - - await allure.step(ctx, 'Ensure domain is registered', async () => { - const result = await client.requestWithQueryBox( - pre, - datamodel.QueryBox( - 'FindDomainById', - datamodel.FindDomainById({ - id: datamodel.Expression( - 'Raw', - datamodel.Value('Id', datamodel.IdBox('DomainId', sugar.domainId(DOMAIN_NAME))), - ), - }), - ), - ) - - expect(result.as('Ok').batch.enum.as('Identifiable').enum.as('Domain').id.name).toEqual(DOMAIN_NAME) - }) - }) -}) - -test('Register asset with a too long name', async (ctx) => { - await annotateAllure(ctx, { - id: 3739, - feature: 'Assets', - story: 'Account registers an asset with too long type', - sdkTestId: 'register_asset_with_too_long_type', - }) - - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - let normalAssetDefinitionId = sugar.assetDefinitionId('xor', 'wonderland') - - let tooLongAssetName = '0'.repeat(2 ** 14) - let invalidAssetDefinitionId = sugar.assetDefinitionId(tooLongAssetName, 'wonderland') - - await allure.step(ctx, 'Submit a transaction registering 2 assets (valid and invalid)', async () => { - await blocks.wait(async () => { - await Promise.all( - // we should register these assets as separate transactions, because the invalid - // one will be rejected - [normalAssetDefinitionId!, invalidAssetDefinitionId!].map(async (id) => { - await client.submitExecutable( - pre, - - pipe( - sugar.identifiable.newAssetDefinition(id, datamodel.AssetValueType('BigQuantity')), - sugar.instruction.register, - sugar.executable.instructions, - ), - ) - }), - ) - }) - }) - await allure.step(ctx, 'Ensure that only the valid one is registered', async () => { - const queryResult = await client.requestWithQueryBox(pre, sugar.find.allAssetsDefinitions()) - - const existingDefinitions: datamodel.AssetDefinitionId[] = queryResult - .as('Ok') - .batch.enum.as('Vec') - .map((val) => val.enum.as('Identifiable').enum.as('AssetDefinition').id) - - expect(existingDefinitions).toContainEqual(normalAssetDefinitionId!) - expect(existingDefinitions).not.toContainEqual(invalidAssetDefinitionId!) - }) -}) - -test('Register an account with long account name', async (ctx) => { - await annotateAllure(ctx, { - id: 4077, - feature: 'Account', - story: 'Register an account with long name', - sdkTestId: 'register_account_with_long_account_name', - }) - - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - let normal = sugar.accountId('bob', 'wonderland') - let incorrect = sugar.accountId('0'.repeat(2 ** 14), 'wonderland') - - await allure.step(ctx, 'Submit a transaction registering 2 accounts (valid and invalid)', async () => { - await blocks.wait(async () => { - await client.submitExecutable( - pre, - pipe( - [normal!, incorrect!].map((id) => pipe(sugar.identifiable.newAccount(id, []), sugar.instruction.register)), - sugar.executable.instructions, - ), - ) - }) - }) - await allure.step(ctx, 'Ensure that only the valid one is registered', async () => { - const queryResult = await client.requestWithQueryBox(pre, sugar.find.allAccounts()) - - const existingAccounts: datamodel.AccountId[] = queryResult - .as('Ok') - .batch.enum.as('Vec') - .map((val) => val.enum.as('Identifiable').enum.as('Account').id) - - expect(existingAccounts).toContainEqual(normal!) - expect(existingAccounts).not.toContainEqual(incorrect!) - }) -}) - -test('Mint fixed asset', async (ctx) => { - await annotateAllure(ctx, { - id: 4683, - feature: 'Asset', - story: 'Mint a fixed asset', - sdkTestId: 'mint_fixed_asset', - }) - - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - let ASSET_DEFINITION_ID - const DECIMAL = '512.5881' - - await allure.step(ctx, 'Submit a transaction registering mint asset by definition', async () => { - ASSET_DEFINITION_ID = sugar.assetDefinitionId('xor', 'wonderland') - - const registerAsset = pipe( - sugar.identifiable.newAssetDefinition(ASSET_DEFINITION_ID, datamodel.AssetValueType('Fixed'), { - mintable: datamodel.Mintable('Infinitely'), - }), - sugar.instruction.register, - ) - - const mintAsset = sugar.instruction.mint( - sugar.value.numericFixed(datamodel.FixedPointI64(DECIMAL)), - datamodel.IdBox('AssetId', sugar.assetId(CLIENT_CONFIG.accountId, ASSET_DEFINITION_ID)), - ) - - await blocks.wait(async () => { - await client.submitExecutable(pre, pipe([registerAsset, mintAsset], sugar.executable.instructions)) - }) - }) - await allure.step(ctx, 'Ensure mint asset registered and asserted', async () => { - const result = await client.requestWithQueryBox(pre, sugar.find.assetsByAccountId(CLIENT_CONFIG.accountId)) - const asset = Seq(result.as('Ok').batch.enum.as('Vec')) - .map((x) => x.enum.as('Identifiable').enum.as('Asset')) - .find((x) => x.id.definition_id.name === ASSET_DEFINITION_ID!.name) - - expect(asset?.value).toEqual(datamodel.AssetValue('Fixed', datamodel.FixedPointI64(DECIMAL))) - }) -}) - -test('Query a non-existing domain', async (ctx) => { - await annotateAllure(ctx, { - id: 4076, - feature: 'Domain', - story: 'Query a non-existing domain', - sdkTestId: 'query_not_existing_domain', - }) - - const { client, pre } = clientFactory() - - await allure.step(ctx, 'Ensure domain is not found', async () => { - const result = await client.requestWithQueryBox( - pre, - pipe( - sugar.assetId(sugar.accountId('alice', 'wonderland'), sugar.assetDefinitionId('XOR', 'wonderland')), - sugar.find.assetById, - ), - ) - - expect(result.tag === 'Err').toBe(true) - expect(result.as('Err').enum.as('QueryFailed').enum.as('Find').enum.as('AssetDefinition').name).toBe('XOR') - }) -}) diff --git a/packages/client/test/integration/test-node/test/compatibility/util.ts b/packages/client/test/integration/test-node/test/compatibility/util.ts deleted file mode 100644 index 6128ff6d..00000000 --- a/packages/client/test/integration/test-node/test/compatibility/util.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TaskContext } from 'vitest' -import * as allure from 'allure-vitest' - -export async function annotateAllure( - ctx: TaskContext, - attrs: { id: number; feature: string; sdkTestId: string; story: string }, -) { - await Promise.all([ - allure.owner(ctx, 'dulger'), - allure.label(ctx, 'permission', 'no_permission_required'), - allure.label(ctx, 'sdk', 'JavaScript'), - allure.label(ctx, 'allure_id', String(attrs.id)), - allure.label(ctx, 'feature', attrs.feature), - allure.label(ctx, 'sdk_test_id', attrs.sdkTestId), - allure.label(ctx, 'story', attrs.story), - ]) -} diff --git a/packages/client/test/integration/test-node/test/main.spec.ts b/packages/client/test/integration/test-node/test/main.spec.ts deleted file mode 100644 index 9fa34429..00000000 --- a/packages/client/test/integration/test-node/test/main.spec.ts +++ /dev/null @@ -1,493 +0,0 @@ -import { Torii, computeSignedTransactionHash, executableIntoSignedTransaction } from '@iroha2/client' -import { type RustResult, datamodel, sugar, variant } from '@iroha2/data-model' -import { CLIENT_CONFIG } from '@iroha2/test-configuration' -import { pipe } from 'fp-ts/function' -import { Seq } from 'immutable' -import { beforeEach, describe, expect, test } from 'vitest' -import { clientFactory, setupPeerTestsLifecycle } from './util' - -setupPeerTestsLifecycle() - -// Actually, it is already tested within `@iroha2/test-peer` -test('Peer is healthy', async () => { - const { pre } = clientFactory() - - expect(await Torii.getHealth(pre)).toEqual(variant('Ok', null) as RustResult) -}) - -test('AddAsset instruction with name length more than limit is not committed', async () => { - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - const normalAssetDefinitionId = sugar.assetDefinitionId('xor', 'wonderland') - - const tooLongAssetName = '0'.repeat(2 ** 14) - const invalidAssetDefinitionId = sugar.assetDefinitionId(tooLongAssetName, 'wonderland') - - await blocks.wait(async () => { - await Promise.all( - // we should register these assets as separate transactions, because the invalid - // one will be rejected - [normalAssetDefinitionId, invalidAssetDefinitionId].map(async (id) => { - await client.submitExecutable( - pre, - - pipe( - sugar.identifiable.newAssetDefinition(id, datamodel.AssetValueType('BigQuantity')), - sugar.instruction.register, - sugar.executable.instructions, - ), - ) - }), - ) - }) - - const queryResult = await client.requestWithQueryBox(pre, sugar.find.allAssetsDefinitions()) - - const existingDefinitions: datamodel.AssetDefinitionId[] = queryResult - .as('Ok') - .batch.enum.as('Vec') - .map((val) => val.enum.as('Identifiable').enum.as('AssetDefinition').id) - - expect(existingDefinitions).toContainEqual(normalAssetDefinitionId) - expect(existingDefinitions).not.toContainEqual(invalidAssetDefinitionId) -}) - -test('AddAccount instruction with name length more than limit is not committed', async () => { - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - const normal = sugar.accountId('bob', 'wonderland') - const incorrect = sugar.accountId('0'.repeat(2 ** 14), 'wonderland') - - await blocks.wait(async () => { - await client.submitExecutable( - pre, - pipe( - [normal, incorrect].map((id) => pipe(sugar.identifiable.newAccount(id, []), sugar.instruction.register)), - sugar.executable.instructions, - ), - ) - }) - - const queryResult = await client.requestWithQueryBox(pre, sugar.find.allAccounts()) - - const existingAccounts: datamodel.AccountId[] = queryResult - .as('Ok') - .batch.enum.as('Vec') - .map((val) => val.enum.as('Identifiable').enum.as('Account').id) - - expect(existingAccounts).toContainEqual(normal) - expect(existingAccounts).not.toContainEqual(incorrect) -}) - -test('Ensure properly handling of Fixed type - adding Fixed asset and querying for it later', async () => { - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - // Creating asset by definition - const ASSET_DEFINITION_ID = sugar.assetDefinitionId('xor', 'wonderland') - - const registerAsset = pipe( - sugar.identifiable.newAssetDefinition(ASSET_DEFINITION_ID, datamodel.AssetValueType('Fixed'), { - mintable: datamodel.Mintable('Infinitely'), - }), - sugar.instruction.register, - ) - - const DECIMAL = '512.5881' - const mintAsset = sugar.instruction.mint( - sugar.value.numericFixed(datamodel.FixedPointI64(DECIMAL)), - datamodel.IdBox('AssetId', sugar.assetId(CLIENT_CONFIG.accountId, ASSET_DEFINITION_ID)), - ) - - await blocks.wait(async () => { - await client.submitExecutable(pre, pipe([registerAsset, mintAsset], sugar.executable.instructions)) - }) - - // Checking added asset via query - const result = await client.requestWithQueryBox(pre, sugar.find.assetsByAccountId(CLIENT_CONFIG.accountId)) - - // Assert - const asset = Seq(result.as('Ok').batch.enum.as('Vec')) - .map((x) => x.enum.as('Identifiable').enum.as('Asset')) - .find((x) => x.id.definition_id.name === ASSET_DEFINITION_ID.name) - - expect(asset?.value).toEqual(datamodel.AssetValue('Fixed', datamodel.FixedPointI64(DECIMAL))) -}) - -test('Registering domain', async () => { - const { client, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - async function registerDomain(domainName: string) { - await client.submitExecutable( - pre, - pipe( - // - sugar.identifiable.newDomain(domainName), - sugar.instruction.register, - sugar.executable.instructions, - ), - ) - } - - async function ensureDomainExistence(domainName: string) { - const result = await client.requestWithQueryBox(pre, sugar.find.allDomains()) - - const domain = result - .as('Ok') - .batch.enum.as('Vec') - .map((x) => x.enum.as('Identifiable').enum.as('Domain')) - .find((x) => x.id.name === domainName) - - if (!domain) throw new Error('Not found') - } - - await blocks.wait(async () => { - await registerDomain('test') - }) - - await ensureDomainExistence('test') -}) - -test('When querying for not existing domain, returns FindError', async () => { - const { client, pre } = clientFactory() - - const result = await client.requestWithQueryBox( - pre, - pipe( - sugar.assetId(sugar.accountId('alice', 'wonderland'), sugar.assetDefinitionId('XOR', 'wonderland')), - sugar.find.assetById, - ), - ) - - expect(result.tag === 'Err').toBe(true) - expect(result.as('Err').enum.as('QueryFailed').enum.as('Find').enum.as('AssetDefinition').name).toBe('XOR') -}) - -describe('Events API', () => { - test('transaction-committed event is triggered after AddAsset instruction has been committed', async () => { - const { pre, client } = clientFactory() - - const filter = sugar.filter.pipeline({ - entityKind: 'Transaction', - statusKind: 'Committed', - }) - - // Listening - - const { ee, stop } = await Torii.listenForEvents(pre, { filter }) - - const committedPromise = new Promise((resolve, reject) => { - ee.on('event', (event) => { - if (event.enum.tag === 'Pipeline') { - const { entity_kind, status } = event.enum.as('Pipeline') - if (entity_kind.enum.tag === 'Transaction' && status.enum.tag === 'Committed') { - resolve() - } - } - }) - - ee.on('error', () => reject(new Error('Some error'))) - ee.on('close', () => reject(new Error('Closed'))) - }) - - // Triggering transaction - await client.submitExecutable( - pre, - pipe( - sugar.assetDefinitionId('xor', 'wonderland'), - (x) => sugar.identifiable.newAssetDefinition(x, datamodel.AssetValueType('BigQuantity')), - sugar.instruction.register, - sugar.executable.instructions, - ), - ) - - // Waiting for resolving - await new Promise((resolve, reject) => { - setTimeout(() => reject(new Error('Timeout')), 1_000) - committedPromise.then(() => resolve()) - }) - - // unnecessary teardown - await stop() - }) -}) - -describe('Setting configuration', () => { - test('When setting correct peer configuration, there is no error', async () => { - const { pre } = clientFactory() - - await Torii.setPeerConfig(pre, { LogLevel: 'TRACE' }) - }) - - test('When setting incorrect peer log level, there is an error', async () => { - const { pre } = clientFactory() - - await expect(Torii.setPeerConfig(pre, { LogLevel: 'TR' as any })).rejects.toThrow() - }) -}) - -describe('Blocks Stream API', () => { - test('When committing 3 blocks sequentially, nothing fails', async () => { - const { pre, client } = clientFactory() - - const stream = await Torii.listenForBlocksStream(pre, { height: datamodel.NonZeroU64(2n) }) - const closePromise = stream.ee.once('close') - - for (const assetName of ['xor', 'val', 'vat']) { - // listening for some block - const blockPromise = stream.ee.once('block') - - // triggering block creation - await client.submitExecutable( - pre, - pipe( - sugar.assetDefinitionId(assetName, 'wonderland'), - (x) => sugar.identifiable.newAssetDefinition(x, datamodel.AssetValueType('Quantity')), - sugar.instruction.register, - sugar.executable.instructions, - ), - ) - - // waiting for it - await new Promise((resolve, reject) => { - closePromise.then(() => reject(new Error('The connection should not be closed within this loop'))) - blockPromise.then(() => resolve()) - }) - } - - await stream.stop() - }) -}) - -describe('Metrics', () => { - test('When getting metrics, everything is OK', async () => { - const { pre } = clientFactory() - - const data = await Torii.getMetrics(pre) - - // just some line from Prometheus metrics - expect(data).toMatch('block_height 1') - }) -}) - -test('status - peer uptime content check, not only type', async () => { - const { pre } = clientFactory() - - const status = await Torii.getStatus(pre) - - expect(status).toEqual( - expect.objectContaining({ - peers: expect.any(Number), - blocks: expect.any(Number), - txs_accepted: expect.any(Number), - txs_rejected: expect.any(Number), - uptime: expect.objectContaining({ - secs: expect.any(Number), - nanos: expect.any(Number), - }), - view_changes: expect.any(Number), - }), - ) -}) - -describe('Queries', () => { - const TRANSACTIONS = 40 - const TXS_BEFORE = 2 - const DEFAULT_FETCH_SIZE = 10 - - beforeEach(async () => { - const { pre, signer, client } = clientFactory() - - function regDomainWithMetadata(name: string, metadata: Map) { - return datamodel.InstructionExpr( - 'Register', - datamodel.RegisterExpr({ - object: datamodel.Expression( - 'Raw', - datamodel.Value( - 'Identifiable', - datamodel.IdentifiableBox( - 'NewDomain', - datamodel.NewDomain({ - id: datamodel.DomainId({ name }), - logo: datamodel.OptionIpfsPath('None'), - metadata: datamodel.Metadata({ - map: datamodel.SortedMapNameValue(metadata), - }), - }), - ), - ), - ), - }), - ) - } - - const stream = await Torii.listenForEvents(pre, { - filter: datamodel.FilterBox( - 'Pipeline', - datamodel.PipelineEventFilter({ - entity_kind: datamodel.OptionPipelineEntityKind('Some', datamodel.PipelineEntityKind('Transaction')), - status_kind: datamodel.OptionPipelineStatusKind('Some', datamodel.PipelineStatusKind('Committed')), - hash: datamodel.OptionHash('None'), - }), - ), - }) - const allCommitted = new Promise((resolve) => { - let counter = 0 - stream.ee.on('event', () => { - if (++counter >= TRANSACTIONS) resolve(null) - }) - }) - - const date = new Date() - await Promise.all([ - ...Array.from({ length: TRANSACTIONS - 1 }, async (_v, i) => { - await Torii.submit( - pre, - executableIntoSignedTransaction({ - signer, - executable: datamodel.Executable( - 'Instructions', - datamodel.VecInstructionExpr([ - datamodel.InstructionExpr( - 'Log', - datamodel.LogExpr({ - level: datamodel.Expression('Raw', datamodel.Value('LogLevel', datamodel.Level('DEBUG'))), - msg: datamodel.Expression('Raw', datamodel.Value('String', 'Hey')), - }), - ), - ]), - ), - payloadParams: { - creationTime: BigInt(date.getTime() + i), - }, - }), - ) - }), - client.submitExecutable( - pre, - datamodel.Executable( - 'Instructions', - datamodel.VecInstructionExpr([ - regDomainWithMetadata('dom-1', new Map([['test', datamodel.Value('String', 'foo')]])), - regDomainWithMetadata('dom-2', new Map([['test', datamodel.Value('String', 'bar')]])), - regDomainWithMetadata( - 'dom-3', - new Map([['test', datamodel.Value('Numeric', datamodel.NumericValue('U32', 10))]]), - ), - regDomainWithMetadata( - 'dom-4', - new Map([['test', datamodel.Value('Numeric', datamodel.NumericValue('U32', 5))]]), - ), - regDomainWithMetadata('dom-5', new Map([['test', datamodel.Value('Bool', true)]])), - regDomainWithMetadata('dom-6', new Map([['test', datamodel.Value('Bool', false)]])), - ]), - ), - ), - ]) - - await allCommitted - }) - - test('all transactions as batches', async () => { - const { pre, client } = clientFactory() - - const items = [] - for await (const batch of await client.query(pre, datamodel.QueryBox('FindAllTransactions')).then((resp) => { - const iter = resp.as('Iter') - expect(iter.first).toHaveLength(DEFAULT_FETCH_SIZE) - items.push(...iter.first) - return iter.next - })) { - expect(batch).toHaveLength(items.length < TRANSACTIONS ? DEFAULT_FETCH_SIZE : TXS_BEFORE) - items.push(...batch) - } - - expect(items).toHaveLength(TRANSACTIONS + TXS_BEFORE) - }) - - test('setting start & limit reflects the subset of data properly', async () => { - const { pre, client } = clientFactory() - - const all = await client.query(pre, datamodel.QueryBox('FindAllTransactions')).then((x) => x.as('Iter').all()) - - const limited = await client - .query(pre, datamodel.QueryBox('FindAllTransactions'), { - start: 5, - limit: 25, - }) - .then((x) => x.as('Iter').all()) - - expect(limited).toHaveLength(25) - expect(all.slice(5, 5 + 25)).toEqual(limited) - }) - - test('sort by metadata key', async () => { - const { pre, client } = clientFactory() - - const unsorted = await client - // - .query(pre, datamodel.QueryBox('FindAllDomains')) - .then((resp) => resp.as('Iter').all()) - - const sorted = await client - .query(pre, datamodel.QueryBox('FindAllDomains'), { sortByMetadataKey: 'test' }) - .then((resp) => resp.as('Iter').all()) - - const map = (items: datamodel.Value[]) => items.map((x) => x.enum.as('Identifiable').enum.as('Domain').id.name) - - expect(unsorted).toHaveLength(sorted.length) - expect(map(unsorted)).toMatchInlineSnapshot(` - [ - "genesis", - "wonderland", - "garden_of_live_flowers", - "dom-1", - "dom-2", - "dom-3", - "dom-4", - "dom-5", - "dom-6", - ] - `) - expect(map(sorted)).toMatchInlineSnapshot(` - [ - "dom-6", - "dom-5", - "dom-2", - "dom-1", - "dom-4", - "dom-3", - "genesis", - "wonderland", - "garden_of_live_flowers", - ] - `) - }) - - test('Find transaction by hash', async () => { - const { pre, client } = clientFactory() - - const all = await client.query(pre, datamodel.QueryBox('FindAllTransactions')).then((resp) => resp.as('Iter').all()) - - const someTx = all.at(4)!.enum.as('TransactionQueryOutput').transaction.value - const hash = computeSignedTransactionHash(someTx) - - const foundByHash = await client - .query( - pre, - datamodel.QueryBox( - 'FindTransactionByHash', - datamodel.FindTransactionByHash({ - hash: datamodel.Expression('Raw', datamodel.Value('Hash', datamodel.HashValue('Transaction', hash))), - }), - ), - ) - .then((resp) => resp.as('Value').enum.as('TransactionQueryOutput').transaction) - - expect(foundByHash.value).toEqual(someTx) - }) -}) diff --git a/packages/client/test/integration/test-node/test/multisignature.spec.ts b/packages/client/test/integration/test-node/test/multisignature.spec.ts deleted file mode 100644 index 939a5f10..00000000 --- a/packages/client/test/integration/test-node/test/multisignature.spec.ts +++ /dev/null @@ -1,174 +0,0 @@ -/* eslint-disable max-nested-callbacks */ - -import { - Signer, - Torii, - computeTransactionHash, - getCryptoAnyway, - makeQueryPayload, - makeSignedQuery, - makeSignedTransaction, - makeTransactionPayload, -} from '@iroha2/client' -import { Bytes, freeScope } from '@iroha2/crypto-core' -import { datamodel, sugar } from '@iroha2/data-model' -import { pipe } from 'fp-ts/function' -import { produce } from 'immer' -import { describe, expect, test } from 'vitest' -import { clientFactory, freeOnTestFinished, setupPeerTestsLifecycle } from './util' - -setupPeerTestsLifecycle() - -describe('MST (Multi-Signature Transaction)', () => { - test('e2e scenario works as expected', async () => { - const crypto = getCryptoAnyway() - const { client: clientAdmin, pre, getBlocksListener } = clientFactory() - const blocks = await getBlocksListener() - - const MAD_HATTER = sugar.accountId('mad_hatter', 'wonderland') - const CASOMILE_DEFINITION_ID = sugar.assetDefinitionId('casomile', 'wonderland') - - // Generating two key pairs - - const KEYS = freeScope((scope) => { - const keys = [ - crypto.KeyPair.deriveFromSeed(Bytes.hex('001122')), - crypto.KeyPair.deriveFromSeed(Bytes.hex('332211')), - ] as const - - for (const x of keys) scope.forget(x) - - return keys - }).map(freeOnTestFinished) - - // these signers will be useful later - const signer1 = new Signer(MAD_HATTER, KEYS[0]) - const signer2 = new Signer(MAD_HATTER, KEYS[1]) - - // Registering the account, the asset definition and the signature check condition - { - const registerAccount = pipe( - sugar.identifiable.newAccount( - MAD_HATTER, - // Using only the first key - [freeScope(() => KEYS[0].publicKey().toDataModel())], - ), - sugar.instruction.register, - ) - - const registerAssetDefinition = pipe( - sugar.identifiable.newAssetDefinition(CASOMILE_DEFINITION_ID, datamodel.AssetValueType('Quantity'), { - mintable: datamodel.Mintable('Infinitely'), - }), - sugar.instruction.register, - ) - - const setSignatureCondition = sugar.instruction.mint( - datamodel.Value( - 'SignatureCheckCondition', - datamodel.SignatureCheckCondition( - 'AllAccountSignaturesAnd', - datamodel.VecPublicKey(freeScope(() => KEYS.map((keypair) => keypair.publicKey().toDataModel()))), - ), - ), - datamodel.IdBox('AccountId', MAD_HATTER), - ) - - // register Mad Hatter with the admin account - - await blocks.wait(async () => { - await clientAdmin.submitExecutable(pre, sugar.executable.instructions(registerAccount)) - }) - - // Register the asset definition with the Mad Hatter's account - await blocks.wait(async () => { - await Torii.submit( - pre, - pipe( - sugar.executable.instructions([registerAssetDefinition, setSignatureCondition]), - (executable) => makeTransactionPayload({ executable, accountId: MAD_HATTER }), - (x) => makeSignedTransaction(x, signer1), - ), - ) - }) - } - - // Preparing MST transaction payload - - const MINTED = 42 - - const mintTransactionPayload = makeTransactionPayload({ - executable: pipe( - sugar.instruction.mint( - sugar.value.numericU32(MINTED), - datamodel.IdBox('AssetId', sugar.assetId(MAD_HATTER, CASOMILE_DEFINITION_ID)), - ), - sugar.executable.instructions, - ), - accountId: MAD_HATTER, - }) - - const txHash = computeTransactionHash(mintTransactionPayload) - - // 1st transaction, signed only with the first key - - const tx1 = datamodel.SignedTransaction( - 'V1', - datamodel.SignedTransactionV1({ - payload: mintTransactionPayload, - signatures: datamodel.SortedVecSignature([signer1.sign(Bytes.array(txHash))]), - }), - ) - - await Torii.submit(pre, tx1) - // we don't wait for block commit here, because the tx should be signed completely first - - // Check that the asset is not minted - - // we will use this function twice - now and after the second transaction - async function findAsset(): Promise { - const result = await Torii.request( - pre, - pipe( - sugar.find.assetsByAccountId(MAD_HATTER), - (query) => makeQueryPayload({ query, accountId: MAD_HATTER }), - (payload) => makeSignedQuery(payload, signer1), - ), - ) - - const asset = result - .as('Ok') - .batch.enum.as('Vec') - .map((x) => x.enum.as('Identifiable').enum.as('Asset')) - .find((x) => x.id.definition_id.name === CASOMILE_DEFINITION_ID.name) - - return asset ?? null - } - - { - const asset = await findAsset() - expect(asset).toBeNull() - } - - // 2nd transaction, signed with both keys - - const tx2 = - // we use `produce` from `immer` library - // it allows us to produce a new value from `tx1` without touching it in a declarative way - produce(tx1, (draft) => { - draft.enum.content.signatures.push(signer2.sign(Bytes.array(txHash))) - }) - - await blocks.wait(async () => { - await Torii.submit(pre, tx2) - }) - - // Checking results after the second transaction - - { - const asset = await findAsset() - expect(asset).not.toBeNull() - expect(asset!.value.enum.as('Quantity')).toEqual(MINTED) - } - }) -}) diff --git a/packages/client/test/integration/test-node/test/setup.ts b/packages/client/test/integration/test-node/test/setup.ts deleted file mode 100644 index f24cbc29..00000000 --- a/packages/client/test/integration/test-node/test/setup.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { FREE_HEAP } from '@iroha2/crypto-core' -import { setCrypto } from '@iroha2/client' -import { crypto } from '@iroha2/crypto-target-node' -import { Logger as ScaleLogger } from '@iroha2/data-model' -import { afterAll, expect } from 'vitest' - -declare global { - // eslint-disable-next-line no-var,no-inner-declarations - var __clientTestNodeSetupOnce: boolean | undefined -} - -// For some reason, `crypto` resets each time between test files, while Scale Logger sets once -setCrypto(crypto) - -if (!globalThis.__clientTestNodeSetupOnce) { - new ScaleLogger().mount() - globalThis.__clientTestNodeSetupOnce = true -} - -afterAll(() => { - // Ensuring there are no leaks in crypto operations - expect(FREE_HEAP.size).toEqual(0) -}) diff --git a/packages/client/test/integration/test-node/test/util.ts b/packages/client/test/integration/test-node/test/util.ts deleted file mode 100644 index b8713fb1..00000000 --- a/packages/client/test/integration/test-node/test/util.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { CLIENT_CONFIG } from '@iroha2/test-configuration' -import { Client, Signer, Torii, type ToriiRequirementsForApiHttp } from '@iroha2/client' -import { adapter as WS } from '@iroha2/client/web-socket/node' -import { crypto } from '@iroha2/crypto-target-node' -import { Free } from '@iroha2/crypto-core' -import { datamodel } from '@iroha2/data-model' -import { afterEach, beforeAll, beforeEach, onTestFinished } from 'vitest' -import { delay } from '../../util' -import * as TestPeer from '@iroha2/test-peer' - -export function freeOnTestFinished(object: T): T { - onTestFinished(() => object.free()) - return object -} - -/** - * Sets up Vitest hooks to run a clean Iroha peer - * for each test. - */ -export function setupPeerTestsLifecycle() { - let startedPeer: TestPeer.StartPeerReturn | null = null - - async function killStartedPeer() { - await startedPeer?.kill() - startedPeer = null - } - - async function waitForGenesisCommitted(pre: ToriiRequirementsForApiHttp) { - while (true) { - const { blocks } = await Torii.getStatus(pre) - if (blocks >= 1) return - await delay(50) - } - } - - beforeAll(async () => { - await TestPeer.clearAll() - await TestPeer.prepareConfiguration() - }) - - beforeEach(async () => { - await TestPeer.clearPeerStorage() - startedPeer = await TestPeer.startPeer() - await waitForGenesisCommitted(clientFactory().pre) - }) - - afterEach(async () => { - await killStartedPeer() - }) -} - -/** - * Expected to be called within a test suite - */ -export function clientFactory() { - const keyPair = freeOnTestFinished(crypto.KeyPair.fromJSON(CLIENT_CONFIG.keyPair)) - - const { accountId } = CLIENT_CONFIG - - const signer = new Signer(accountId, keyPair) - - const pre = { ...CLIENT_CONFIG.torii, ws: WS, fetch } - - const client = new Client({ signer }) - - const getBlocksListener = async () => { - const stream = await Torii.listenForBlocksStream(pre, { - // 1 is genesis block, which is committed before each test - height: datamodel.NonZeroU64(2n), - }) - - return { - /** - * Do an operation that should trigger a block commit, and wait until the block - * is emitted - */ - async wait(fn: () => Promise) { - await Promise.all([stream.ee.once('block'), fn()]) - }, - } - } - - return { signer, pre, client, accountId, keyPair, getBlocksListener } -} diff --git a/packages/client/test/integration/test-node/vitest.config.mts b/packages/client/test/integration/test-node/vitest.config.mts deleted file mode 100644 index 691862ef..00000000 --- a/packages/client/test/integration/test-node/vitest.config.mts +++ /dev/null @@ -1,20 +0,0 @@ -import { defineConfig } from 'vitest/config' -import AllureReporter from 'allure-vitest/reporter' - -export default defineConfig({ - test: { - watch: false, - reporters: [ - 'basic', - // This is for Compatibility Matrix tests - // https://allurereport.org/docs/vitest-reference/ - new AllureReporter({}), - ], - poolOptions: { - threads: { - singleThread: true, - }, - }, - setupFiles: ['test/setup.ts'], - }, -}) diff --git a/packages/client/test/integration/test-web/CHANGELOG.md b/packages/client/test/integration/test-web/CHANGELOG.md deleted file mode 100644 index 3e62d1d2..00000000 --- a/packages/client/test/integration/test-web/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# @iroha2/client-test-web - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [b86aa76] -- Updated dependencies [b86aa76] - - @iroha2/data-model@1.0.0 - - @iroha2/client@1.0.0 diff --git a/packages/client/test/integration/test-web/etc/dev-peer-server.ts b/packages/client/test/integration/test-web/etc/dev-peer-server.ts deleted file mode 100644 index 69cddc38..00000000 --- a/packages/client/test/integration/test-web/etc/dev-peer-server.ts +++ /dev/null @@ -1,12 +0,0 @@ -import consola from 'consola' -import { run } from '@iroha2/test-peer/src/api/server' -import { PORT_PEER_SERVER } from './meta' - -async function main() { - await run(PORT_PEER_SERVER) -} - -main().catch((err) => { - consola.fatal(err) - process.exit(1) -}) diff --git a/packages/client/test/integration/test-web/etc/test-run.ts b/packages/client/test/integration/test-web/etc/test-run.ts deleted file mode 100644 index fb43e73f..00000000 --- a/packages/client/test/integration/test-web/etc/test-run.ts +++ /dev/null @@ -1,21 +0,0 @@ -import consola from 'consola' -import { execa } from 'execa' -import { preview } from 'vite' -import { run } from '@iroha2/test-peer/src/api/server' -import { PORT_PEER_SERVER } from './meta' - -async function main() { - consola.info('Starting peer server & vite preview server') - await Promise.all([run(PORT_PEER_SERVER), preview({})]) - - consola.info('Running Cypress') - await execa(`pnpm`, ['cypress', 'run'], { stdio: 'inherit' }) - - consola.success('Tests are passed!') - process.exit(0) -} - -main().catch((err) => { - consola.fatal(err) - process.exit(1) -}) diff --git a/packages/client/test/integration/test-web/package.json b/packages/client/test/integration/test-web/package.json deleted file mode 100644 index 2add249d..00000000 --- a/packages/client/test/integration/test-web/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "@iroha2/client-test-web", - "private": true, - "scripts": { - "dev:app": "vite", - "dev:peer-server": "DEBUG=@iroha2* tsx etc/dev-peer-server", - "dev:cy": "cypress open", - "test": "run-s test:app:build test:run", - "test:app:build": "vite build", - "test:run": "DEBUG=@iroha2* tsx etc/test-run" - }, - "devDependencies": { - "@bahmutov/cypress-esbuild-preprocessor": "^2.2.0", - "@iroha2/client": "workspace:^7.1.0", - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/crypto-target-web": "workspace:^2.0.0", - "@iroha2/data-model": "workspace:^7.1.0", - "@iroha2/test-configuration": "workspace:^", - "@iroha2/test-peer": "workspace:^0.0.1", - "@scale-codec/util": "^1.1.2", - "@vitejs/plugin-vue": "^5.0.4", - "@vue-kakuyaku/core": "^0.4.3", - "@vueuse/core": "^8.0.1", - "cross-env": "^7.0.3", - "cypress": "^12.5.1", - "esbuild": "^0.17.10", - "fp-ts": "^2.13.1", - "sass": "^1.52.1", - "start-server-and-test": "^1.14.0", - "vite": "^5.1.5", - "vue": "^3.2.47" - } -} diff --git a/packages/client/test/integration/test-web/pnpm-global/5/pnpm-lock.yaml b/packages/client/test/integration/test-web/pnpm-global/5/pnpm-lock.yaml deleted file mode 100644 index 41395e63..00000000 --- a/packages/client/test/integration/test-web/pnpm-global/5/pnpm-lock.yaml +++ /dev/null @@ -1,4 +0,0 @@ -lockfileVersion: 5.3 - -specifiers: - '@scale-codec/util': ^1.0.0 diff --git a/packages/client/test/integration/test-web/src/client.ts b/packages/client/test/integration/test-web/src/client.ts deleted file mode 100644 index bcd34a7c..00000000 --- a/packages/client/test/integration/test-web/src/client.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Client, Signer } from '@iroha2/client' -import { adapter as WS } from '@iroha2/client/web-socket/native' -import { crypto } from './crypto' -import { CLIENT_CONFIG } from '@iroha2/test-configuration' - -const HOST = window.location.host - -export const toriiPre = { - // proxified with vite - apiURL: `http://${HOST}/torii/api`, - ws: WS, - fetch: fetch.bind(window), -} - -const signer = new Signer(CLIENT_CONFIG.accountId, crypto.KeyPair.fromJSON(CLIENT_CONFIG.keyPair)) - -export const client = new Client({ signer }) diff --git a/packages/client/test/integration/test-web/src/components/CreateDomain.vue b/packages/client/test/integration/test-web/src/components/CreateDomain.vue deleted file mode 100644 index 2a922ab2..00000000 --- a/packages/client/test/integration/test-web/src/components/CreateDomain.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/packages/client/test/integration/test-web/src/components/EventListener.vue b/packages/client/test/integration/test-web/src/components/EventListener.vue deleted file mode 100644 index f9dbafb4..00000000 --- a/packages/client/test/integration/test-web/src/components/EventListener.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - diff --git a/packages/client/test/integration/test-web/src/crypto.ts b/packages/client/test/integration/test-web/src/crypto.ts deleted file mode 100644 index 146c6942..00000000 --- a/packages/client/test/integration/test-web/src/crypto.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { crypto, init } from '@iroha2/crypto-target-web' - -await init() - -export { crypto } diff --git a/packages/client/test/integration/test-web/src/env.d.ts b/packages/client/test/integration/test-web/src/env.d.ts deleted file mode 100644 index d27eb5a3..00000000 --- a/packages/client/test/integration/test-web/src/env.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// - -declare module '*.vue' { - import { DefineComponent } from 'vue' - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types - const component: DefineComponent<{}, {}, any> - export default component -} diff --git a/packages/client/test/integration/test-web/src/main.ts b/packages/client/test/integration/test-web/src/main.ts deleted file mode 100644 index 125b516a..00000000 --- a/packages/client/test/integration/test-web/src/main.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createApp } from 'vue' -import App from './App.vue' -import { Logger } from '@iroha2/data-model' -import { crypto } from './crypto' -import { setCrypto } from '@iroha2/client' - -setCrypto(crypto) -new Logger().mount() -localStorage.debug = '*' - -createApp(App).mount('#app') diff --git a/packages/client/test/integration/test-web/tsconfig.json b/packages/client/test/integration/test-web/tsconfig.json deleted file mode 100644 index 8617c8a5..00000000 --- a/packages/client/test/integration/test-web/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "useDefineForClassFields": true, - "module": "esnext", - "moduleResolution": "node", - "strict": true, - "jsx": "preserve", - "sourceMap": true, - "resolveJsonModule": true, - "esModuleInterop": true, - "lib": ["esnext", "dom"] - }, - "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] -} diff --git a/packages/client/test/integration/test-web/vite.config.ts b/packages/client/test/integration/test-web/vite.config.ts deleted file mode 100644 index bed6465c..00000000 --- a/packages/client/test/integration/test-web/vite.config.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -// import path from 'path' -import { PORT_PEER_API, PORT_PEER_SERVER, PORT_VITE } from './etc/meta' - -// const resolveInPkgSrc = (unscopedName: string, ...paths: string[]) => -// path.resolve(__dirname, '../../../../', unscopedName, ...paths) - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [vue()], - optimizeDeps: { - esbuildOptions: { - target: 'esnext', - }, - }, - build: { - target: 'esnext', - }, - server: { - port: PORT_VITE, - strictPort: true, - proxy: { - '/torii/api': { - ws: true, - target: `http://127.0.0.1:${PORT_PEER_API}`, - rewrite: (path) => path.replace(/^\/torii\/api/, ''), - }, - '/peer-server': { - ws: true, - target: `http://127.0.0.1:${PORT_PEER_SERVER}`, - rewrite: (path) => path.replace(/^\/peer-server/, ''), - }, - }, - }, - preview: { - port: PORT_VITE, - strictPort: true, - }, - // resolve: { - // alias: { - // '@iroha2/client-isomorphic-ws': resolveInPkgSrc('client-isomorphic-ws', 'dist/native.js'), - // '@iroha2/client-isomorphic-fetch': resolveInPkgSrc('client-isomorphic-fetch', 'dist/native.js'), - // }, - // }, -}) diff --git a/packages/client/test/integration/tsconfig.json b/packages/client/test/integration/tsconfig.json deleted file mode 100644 index 52a27312..00000000 --- a/packages/client/test/integration/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../../../tsconfig.base.json" -} diff --git a/packages/client/test/integration/util.ts b/packages/client/test/integration/util.ts deleted file mode 100644 index ad3d6542..00000000 --- a/packages/client/test/integration/util.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function delay(ms: number): Promise { - return new Promise((r) => setTimeout(r, ms)) -} diff --git a/packages/client/test/queries.spec-d.ts b/packages/client/test/queries.spec-d.ts new file mode 100644 index 00000000..eae87d9d --- /dev/null +++ b/packages/client/test/queries.spec-d.ts @@ -0,0 +1,60 @@ +// deno-lint-ignore-file no-unused-vars + +import * as dm from '@iroha/core/data-model' +import type { Client, QueryHandle } from '@iroha/client' + +type Expect = T +type Equal = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false + +declare const client: Client + +type QueryHandleOutput> = Handle extends QueryHandle ? T : never + +// const findAccs = client.query('FindAccounts') +// type test_find_accounts_output = Expect, dm.Account>> + +const findAccs = client.find.accounts() +type test_find_accounts_output = Expect, dm.Account>> + +const findAccsWithFilter = client.find.accounts({ + predicate: dm.CompoundPredicate.Atom( + dm.AccountProjectionPredicate.Id.Domain.Name.Atom.Contains('alice'), + ), +}) +type test_find_accs_with_filter = Expect, dm.Account>> + +const findAccsWithSelector = client.find.accounts({ + selector: dm.AccountProjectionSelector.Atom, +}) +type test_find_accs_selector = Expect, dm.Account>> + +const findAccsWithSelector2 = client.find.accounts({ + selector: [dm.AccountProjectionSelector.Atom], +}) +type test_find_accs_selector2 = Expect, dm.Account>> + +const findAccsWithSelector3 = client.find.accounts({ + selector: [dm.AccountProjectionSelector.Id.Signatory.Atom, dm.AccountProjectionSelector.Id.Domain.Name.Atom], +}) +type test_find_accs_selector3 = Expect< + Equal, [dm.PublicKey, dm.Name]> +> + +const accountsExecuteAll = await client.find.accounts().executeAll() +type test_accs_exec_all = Expect> + +const findBlockHeaderHashes = client.find.blockHeaders({ selector: dm.BlockHeaderProjectionSelector.Hash.Atom }) +type test_block_header_hashes = Expect, dm.Hash>> + +const findDomainsMetadata = client.find.domains({ selector: dm.DomainProjectionSelector.Metadata.Atom }) +const findAccountsMetadata = client.find.accounts({ + select: dm.DomainProjectionSelector.Metadata.Atom, + filter: '', + predicate: dm.CompoundPredicate.Atom(dm.AccountProjectionPredicate.Id.Domain.Name.Atom.Contains('test')), +}) + +const testExtraFields = client.find.accounts({ + predicate: dm.CompoundPredicate.Atom(dm.AccountProjectionPredicate.Id.Domain.Name.Atom.EndsWith('test')), + filter: '', + select: 12, +}) diff --git a/packages/client/util.spec.ts b/packages/client/util.spec.ts new file mode 100644 index 00000000..e30eee4c --- /dev/null +++ b/packages/client/util.spec.ts @@ -0,0 +1,42 @@ +import { transformProtocolInUrlFromHttpToWs, urlJoinPath } from './util.ts' +import { describe, expect, test } from 'vitest' + +describe('transform URL protocol to WS', () => { + test('replaces http with ws', () => { + expect(transformProtocolInUrlFromHttpToWs(new URL('http://129.0.0.1:412/api'))).toEqual( + new URL('ws://129.0.0.1:412/api'), + ) + }) + + test('replaces https with wss', () => { + expect(transformProtocolInUrlFromHttpToWs(new URL('https://129.0.0.1:412/api'))).toEqual( + new URL('wss://129.0.0.1:412/api'), + ) + }) + + test('throws if the protocol is not http/https/ws/wss', () => { + expect(() => transformProtocolInUrlFromHttpToWs(new URL('tcp://129.0.0.1'))).toThrowErrorMatchingInlineSnapshot( + `[TypeError: Expected protocol of tcp://129.0.0.1 to be on of: ws, wss, http, https]`, + ) + }) + + for (const protocol of ['ws', 'wss']) { + const url = new URL(`${protocol}://localhost`) + + test(`Leaves ${url} untouched`, () => { + expect(transformProtocolInUrlFromHttpToWs(url)).toEqual(url) + }) + } +}) + +describe('URL join', () => { + test.each([ + { url: 'http://localhost', path: '/', expect: 'http://localhost/' }, + { url: 'http://localhost:410', path: '/', expect: 'http://localhost:410/' }, + { url: 'http://localhost', path: '/foo', expect: 'http://localhost/foo' }, + { url: 'http://localhost', path: 'foo/bar', expect: 'http://localhost/foo/bar' }, + { url: 'http://localhost/', path: '/path', expect: 'http://localhost/path' }, + ])('$url + $path = $expect', (params) => { + expect(urlJoinPath(new URL(params.url), params.path)).toEqual(new URL(params.expect)) + }) +}) diff --git a/packages/client/src/util.ts b/packages/client/util.ts similarity index 52% rename from packages/client/src/util.ts rename to packages/client/util.ts index c5a92d94..4988f675 100644 --- a/packages/client/src/util.ts +++ b/packages/client/util.ts @@ -1,19 +1,29 @@ -import { CloseEvent, IsomorphicWebSocketAdapter, SendData, Event as WsEvent } from './web-socket/types' -import { Debugger } from 'debug' +import type { CloseEvent, Event as WsEvent, IsomorphicWebSocketAdapter, SendData } from './web-socket/types.ts' +import type { Debugger } from 'debug' import Emittery from 'emittery' -import JsonBigIntParseFactory from 'json-bigint/lib/parse.js' -import { getCryptoAnyway } from './crypto-singleton' -import { Bytes, freeScope } from '@iroha2/crypto-core' -export function cryptoHash(input: Bytes): Uint8Array { - return freeScope(() => getCryptoAnyway().Hash.hash(input).bytes()) +export function transformProtocolInUrlFromHttpToWs(url: URL): URL { + const { protocol } = url + if (protocol === 'ws:' || protocol === 'wss:') return url + if (protocol === 'http:') { + const val = new URL(url) + val.protocol = 'ws:' + return val + } + if (protocol === 'https:') { + const val = new URL(url) + val.protocol = 'wss:' + return val + } + + throw new TypeError(`Expected protocol of ${url} to be on of: ws, wss, http, https`) } -export function transformProtocolInUrlFromHttpToWs(url: string): string { - return url.replace(/^https?:\/\//, (substr) => { - const isSafe = /https/.test(substr) - return `ws${isSafe ? 's' : ''}://` - }) +export function urlJoinPath(url: URL, path: string): URL { + const val = new URL(url) + if (val.pathname.endsWith('/') && path.startsWith('/')) val.pathname += path.slice(1) + else val.pathname += path + return val } export interface SocketEmitMapBase { @@ -24,7 +34,7 @@ export interface SocketEmitMapBase { } export function setupWebSocket(params: { - baseURL: string + baseURL: URL endpoint: string parentDebugger: Debugger adapter: IsomorphicWebSocketAdapter @@ -36,7 +46,7 @@ export function setupWebSocket(params: { accepted: () => Promise } { const debug = params.parentDebugger.extend('websocket') - const url = transformProtocolInUrlFromHttpToWs(params.baseURL) + params.endpoint + const url = urlJoinPath(transformProtocolInUrlFromHttpToWs(params.baseURL), params.endpoint) const ee = new Emittery() const onceOpened = ee.once('open') @@ -80,31 +90,3 @@ export function setupWebSocket(params: { return { isClosed, send, close: closeAsync, ee, accepted } } - -const jsonBigIntParse = JsonBigIntParseFactory({ useNativeBigInt: true }) - -export function parseJsonWithBigInts(raw: string): any { - return jsonBigIntParse(raw) -} - -if (import.meta.vitest) { - const { test, expect } = import.meta.vitest - - test('When plain JSON is passed, it parses numbers as plain numbers', () => { - const raw = `{"num":123}` - const parsed = { num: 123 } - - const actual = parseJsonWithBigInts(raw) - - expect(actual).toEqual(parsed) - }) - - test('When JSON with too big ints is passed, it parses numbers as BigInts', () => { - const raw = `{"num":123456789123456789123456789123456789}` - const parsed = { num: 123456789123456789123456789123456789n } - - const actual = parseJsonWithBigInts(raw) - - expect(actual).toEqual(parsed) - }) -} diff --git a/packages/client/src/web-socket/native.ts b/packages/client/web-socket/native.ts similarity index 91% rename from packages/client/src/web-socket/native.ts rename to packages/client/web-socket/native.ts index 905e5b5f..33984107 100644 --- a/packages/client/src/web-socket/native.ts +++ b/packages/client/web-socket/native.ts @@ -1,4 +1,4 @@ -import { IncomingData, IsomorphicWebSocketAdapter } from '@iroha2/client' +import type { IncomingData, IsomorphicWebSocketAdapter } from './types.ts' async function handleIncomingData(data: any): Promise { if (data instanceof Blob) { diff --git a/packages/client/src/web-socket/node.ts b/packages/client/web-socket/node.ts similarity index 73% rename from packages/client/src/web-socket/node.ts rename to packages/client/web-socket/node.ts index df87a252..24ef2bb8 100644 --- a/packages/client/src/web-socket/node.ts +++ b/packages/client/web-socket/node.ts @@ -1,7 +1,10 @@ -import { IncomingData, IsomorphicWebSocketAdapter } from '@iroha2/client' +import type { IncomingData, IsomorphicWebSocketAdapter } from './types.ts' import WebSocket from 'ws' +import { Buffer } from 'node:buffer' -function handleIncomingData(data: string | Buffer | ArrayBuffer | Buffer[]): IncomingData { +function handleIncomingData( + data: string | Buffer | ArrayBuffer | Buffer[], +): IncomingData { if (Buffer.isBuffer(data)) { return new Uint8Array(data) } @@ -16,7 +19,7 @@ export const adapter: IsomorphicWebSocketAdapter = { socket.onopen = params.onopen socket.onclose = params.onclose - socket.onmessage = (msg) => { + socket.onmessage = (msg: any) => { params.onmessage({ data: handleIncomingData(msg.data), }) diff --git a/packages/client/src/web-socket/types.ts b/packages/client/web-socket/types.ts similarity index 92% rename from packages/client/src/web-socket/types.ts rename to packages/client/web-socket/types.ts index a03ff762..3c32822b 100644 --- a/packages/client/src/web-socket/types.ts +++ b/packages/client/web-socket/types.ts @@ -1,4 +1,4 @@ -export type SendData = string | ArrayBuffer +export type SendData = string | ArrayBufferLike export type IncomingData = ArrayBufferView export interface IsomorphicWebSocket { @@ -22,7 +22,7 @@ export interface MessageEvent { } export interface InitWebSocketParams { - url: string + url: URL onopen: (event: Event) => void onclose: (event: CloseEvent) => void onerror: (event: Event) => void diff --git a/packages/core/codec.ts b/packages/core/codec.ts new file mode 100644 index 00000000..7357c9e8 --- /dev/null +++ b/packages/core/codec.ts @@ -0,0 +1,181 @@ +import * as scale from '@scale-codec/core' +import { decodeHex } from '@std/encoding' +import type { Variant, VariantUnit } from './util.ts' + +export interface RawScaleCodec { + encode: scale.Encode + decode: scale.Decode +} + +/** + * Generic codec. + * + * Unlike {@link RawScaleCodec}, provides higher-level encode/decode functions, as well as some composition utilities. + */ +export class GenCodec { + /** + * Create a lazy codec, by only having a getter to the actual codec. + * + * The getter is called for each codec access and is not cached. + */ + public static lazy(f: () => GenCodec): GenCodec { + return new GenCodec({ + encode: scale.encodeFactory( + (v, w) => f().raw.encode(v, w), + (v) => f().raw.encode.sizeHint(v), + ), + decode: (w) => f().raw.decode(w), + }) + } + + /** + * Access lower-level SCALE codec + */ + public readonly raw: RawScaleCodec + + public constructor(raw: RawScaleCodec) { + this.raw = raw + } + + public encode(value: T): Uint8Array { + return scale.WalkerImpl.encode(value, this.raw.encode) + } + + public decode(data: string | ArrayBufferView): T { + const parsed = ArrayBuffer.isView(data) ? data : decodeHex(data) + return scale.WalkerImpl.decode(parsed, this.raw.decode) + } + + public wrap({ toBase, fromBase }: { toBase: (value: U) => T; fromBase: (value: T) => U }): GenCodec { + return new GenCodec({ + encode: scale.encodeFactory( + (v, w) => this.raw.encode(toBase(v), w), + (v) => this.raw.encode.sizeHint(toBase(v)), + ), + decode: (w) => fromBase(this.raw.decode(w)), + }) + } +} + +export class EnumCodec extends GenCodec> { + public discriminated< + T extends { + [Tag in keyof E]: E[Tag] extends [] ? VariantUnit + : E[Tag] extends [infer Value] ? Variant + : never + }[keyof E], + >(): GenCodec { + return this.wrap<{ kind: string; value?: any }>({ + toBase: (value) => { + if (value.value !== undefined) return scale.variant(value.kind, value.value) + return scale.variant(value.kind) + }, + fromBase: (value) => ({ kind: value.tag, value: value.content }), + }) as any + } + + public literalUnion(): GenCodec< + { + [Tag in keyof E]: E[Tag] extends [] ? Tag : never + }[keyof E] + > { + return this.wrap({ + toBase: (literal) => scale.variant(literal), + fromBase: (variant) => variant.tag, + }) as any + } +} + +export function lazyCodec(f: () => GenCodec): GenCodec { + return GenCodec.lazy(f) +} + +export type EnumCodecSchema = { + [K in keyof E]: E[K] extends [infer V] ? [discriminant: number, codec: GenCodec] : [discriminant: number] +} + +export function enumCodec(schema: EnumCodecSchema): EnumCodec { + const encoders: scale.EnumEncoders = {} as any + const decoders: scale.EnumDecoders = {} + + for (const [tag, [dis, maybeCodec]] of Object.entries(schema) as [string, [number, GenCodec?]][]) { + ;(encoders as any)[tag] = maybeCodec ? [dis, maybeCodec.raw.encode] : dis + ;(decoders as any)[dis] = maybeCodec ? [tag, maybeCodec.raw.decode] : tag + } + + return new EnumCodec({ + encode: scale.createEnumEncoder(encoders), + decode: scale.createEnumDecoder(decoders), + }) +} + +type TupleFromCodecs = T extends [GenCodec, ...infer Tail] ? [Head, ...TupleFromCodecs] + : T extends [] ? [] + : never + +export function tupleCodec, ...GenCodec[]]>(codecs: T): GenCodec> { + return new GenCodec({ + encode: scale.createTupleEncoder(codecs.map((x) => x.raw.encode) as any), + decode: scale.createTupleDecoder(codecs.map((x) => x.raw.decode) as any), + }) +} + +export declare type StructCodecsSchema = { + [K in keyof T]: [K, GenCodec] +}[keyof T][] + +export function structCodec(order: (keyof T & string)[], schema: { [K in keyof T]: GenCodec }): GenCodec { + const encoders: scale.StructEncoders = [] + const decoders: scale.StructDecoders = [] + + for (const field of order) { + encoders.push([field, schema[field].raw.encode]) + decoders.push([field, schema[field].raw.decode]) + } + + return new GenCodec({ encode: scale.createStructEncoder(encoders), decode: scale.createStructDecoder(decoders) }) +} + +const thisCodecShouldNeverBeCalled = () => { + throw new Error('This value could never be encoded') +} +export const neverCodec: GenCodec = new GenCodec({ + encode: scale.encodeFactory(thisCodecShouldNeverBeCalled, thisCodecShouldNeverBeCalled), + decode: thisCodecShouldNeverBeCalled, +}) + +export const nullCodec: GenCodec = new GenCodec({ encode: scale.encodeUnit, decode: scale.decodeUnit }) + +export function bitmapCodec(masks: { [K in Name]: number }): GenCodec> { + const REPR_MAX = 2 ** 32 - 1 + + const toMask = (set: Set): number => { + let num = 0 + for (const i of set) { + num |= masks[i] + } + return num + } + + const masksArray = (Object.entries(masks) as [Name, number][]).map(([k, v]) => ({ key: k, value: v })) + const fromMask = (bitmask: number): Set => { + const set = new Set() + let bitmaskMut: number = bitmask + for (const mask of masksArray) { + if ((mask.value & bitmaskMut) !== mask.value) continue + set.add(mask.key) + + let maskEffectiveBits = 0 + for (let i = mask.value; i > 0; i >>= 1, maskEffectiveBits++); + + const fullNotMask = ((REPR_MAX >> maskEffectiveBits) << maskEffectiveBits) | ~mask.value + bitmaskMut &= fullNotMask + } + if (bitmaskMut !== 0) { + throw new Error(`Bitmask contains unknown flags: 0b${bitmaskMut.toString(2)}`) + } + return set + } + + return new GenCodec({ encode: scale.encodeU32, decode: scale.decodeU32 }).wrap({ toBase: toMask, fromBase: fromMask }) +} diff --git a/packages/core/crypto/mod.ts b/packages/core/crypto/mod.ts new file mode 100644 index 00000000..db0cf5dc --- /dev/null +++ b/packages/core/crypto/mod.ts @@ -0,0 +1,317 @@ +/** + * @module @iroha/crypto + */ +export * from './types.ts' +export * from './singleton.ts' +export * from './util.ts' + +import { Bytes } from './util.ts' +import { getWASM } from './singleton.ts' +import type { wasmPkg } from './types.ts' +import { type CodecContainer, defineCodec, getCodec, type Ord, ordCompare, SYMBOL_CODEC } from '../traits.ts' +import { enumCodec, GenCodec, structCodec } from '../codec.ts' +import * as scale from '@scale-codec/core' +import { assert } from '@std/assert/assert' +import { BytesVec } from '../data-model/primitives.ts' + +export type VerifyResult = wasmPkg.VerifyResult + +/** + * Crypto alrogithms supported by Iroha. + */ +export type Algorithm = wasmPkg.Algorithm + +const AlgorithmCodec: CodecContainer = defineCodec( + enumCodec<{ + ed25519: [] + secp256k1: [] + bls_normal: [] + bls_small: [] + }>({ + ed25519: [0], + secp256k1: [1], + bls_normal: [2], + bls_small: [3], + }).literalUnion(), +) + +export const Algorithm: Record & { default: () => Algorithm } & CodecContainer = { + ed25519: 'ed25519' as const, + secp256k1: 'secp256k1' as const, + bls_normal: 'bls_normal' as const, + bls_small: 'bls_small' as const, + default: (): Algorithm => getWASM(true).algorithm_default(), + ...AlgorithmCodec, +} + +export interface HasAlgorithm { + readonly algorithm: Algorithm +} + +export interface HasPayload { + readonly payload: Bytes + // readonly payload: { + // (): Uint8Array + // (kind: 'hex'): string + // } +} + +const HASH_ARR_LEN = 32 + +/** + * Cryptographic hash used in Iroha. + */ +export class Hash { + public static [SYMBOL_CODEC]: GenCodec = new GenCodec({ + encode: scale.createUint8ArrayEncoder(HASH_ARR_LEN), + decode: scale.createUint8ArrayDecoder(HASH_ARR_LEN), + }).wrap({ + fromBase: (lower) => Hash.fromRaw(Bytes.array(lower)), + toBase: (higher) => higher.payload.array(), + }) + + /** + * Create an hash filled with zeros. + */ + public static zeroed(): Hash { + return new Hash(getWASM(true).Hash.zeroed(), null) + } + + /** + * Create by hashing the input. + * @param input the input to hash + * @returns the resulting hash + */ + public static hash(input: Bytes): Hash { + return new Hash(new (getWASM(true).Hash)(input.asWasmFormat), null) + } + + public static fromRaw(payload: Bytes): Hash { + return new Hash(null, payload) + } + + #wasm: null | wasmPkg.Hash + #bytes: null | Bytes + + private constructor(wasm: null | wasmPkg.Hash, bytes: Bytes | null) { + this.#wasm = wasm + this.#bytes = bytes + } + + public get payload(): Bytes { + if (this.#bytes) return this.#bytes + assert + return Bytes.hex(this.#wasm!.bytes_hex()) + } +} + +/** + * Private key used in Iroha. + */ +export class PrivateKey implements HasAlgorithm, HasPayload { + /** + * Create from a multihash string. + */ + public static fromMultihash(multihash: string): PrivateKey { + return new PrivateKey( + getWASM(true).PrivateKey.from_multihash_hex(multihash), + ) + } + + public static fromKeyPair(pair: KeyPair): PrivateKey { + return new PrivateKey(pair.wasm.private_key()) + } + + public static fromParts(algorithm: Algorithm, payload: Bytes): PrivateKey { + return new PrivateKey(getWASM(true).PrivateKey.from_bytes(algorithm, payload.asWasmFormat)) + } + + #wasm: wasmPkg.PrivateKey + + private constructor(wasm: wasmPkg.PrivateKey) { + this.#wasm = wasm + } + + public get algorithm(): Algorithm { + return this.#wasm.algorithm + } + + public get payload(): Bytes { + return Bytes.array(this.#wasm.payload()) + } + + public multihash(): string { + return this.#wasm.to_multihash_hex() + } + + public sign(message: Bytes): Signature { + return Signature.create(this, message) + } + + /** + * @internal + */ + public get wasm(): wasmPkg.PrivateKey { + return this.#wasm + } +} + +export class PublicKey implements HasAlgorithm, HasPayload, Ord { + public static [SYMBOL_CODEC]: GenCodec = structCodec(['algorithm', 'payload'], { + algorithm: getCodec(Algorithm), + payload: getCodec(BytesVec).wrap({ toBase: (x) => x.array(), fromBase: (x) => Bytes.array(x) }), + }).wrap({ + toBase: (higher) => higher, + fromBase: (x) => PublicKey.fromParts(x.algorithm, x.payload), + }) + + public static fromMultihash(multihash: string): PublicKey { + const key = getWASM(true).PublicKey.from_multihash_hex(multihash) + return new PublicKey(key) + } + + public static fromPrivateKey(privateKey: PrivateKey): PublicKey { + const key = getWASM(true).PublicKey.from_private_key(privateKey.wasm) + return new PublicKey(key) + } + + public static fromKeyPair(pair: KeyPair): PublicKey { + return new PublicKey(pair.wasm.public_key()) + } + + public static fromParts(algorithm: Algorithm, payload: Bytes): PublicKey { + return new PublicKey(getWASM(true).PublicKey.from_bytes(algorithm, payload.asWasmFormat)) + } + + #wasm: wasmPkg.PublicKey + + private constructor(wasm: wasmPkg.PublicKey) { + this.#wasm = wasm + } + + public get algorithm(): Algorithm { + return this.#wasm.algorithm + } + + public get payload(): Bytes { + return Bytes.array(this.#wasm.payload()) + } + + public get wasm(): wasmPkg.PublicKey { + return this.#wasm + } + + public multihash(): string { + return this.#wasm.to_multihash_hex() + } + + public verifySignature(signature: Signature, message: Bytes): wasmPkg.VerifyResult { + return signature.verify(this, message) + } + + public compare(other: PublicKey): number { + return ordCompare(this.multihash(), other.multihash()) + } +} + +export interface KeyGenOptions { + /** + * Cryptographic algorithm to use in key pair generation. + * + * @default 'ed25519' + */ + algorithm?: Algorithm +} + +export class KeyPair implements HasAlgorithm { + /** + * Generate a random key pair. + */ + public static random(options?: KeyGenOptions): KeyPair { + const pair = getWASM(true).KeyPair.random(options?.algorithm) + return new KeyPair(pair) + } + + /** + * Derive the key pair from a given seed. + * @param seed some binary data. + * @param options key generation options + */ + public static deriveFromSeed(seed: Bytes, options?: KeyGenOptions): KeyPair { + const pair = getWASM(true).KeyPair.derive_from_seed(seed.asWasmFormat, options?.algorithm) + return new KeyPair(pair) + } + + public static deriveFromPrivateKey(private_key: PrivateKey): KeyPair { + const pair = getWASM(true).KeyPair.derive_from_private_key(private_key.wasm) + return new KeyPair(pair) + } + + public static fromParts(publicKey: PublicKey, privateKey: PrivateKey): KeyPair { + return new KeyPair(getWASM(true).KeyPair.from_parts(publicKey.wasm, privateKey.wasm)) + } + + #wasm: wasmPkg.KeyPair + + private constructor(wasm: wasmPkg.KeyPair) { + this.#wasm = wasm + } + + public get algorithm(): Algorithm { + return this.#wasm.algorithm + } + + public privateKey(): PrivateKey { + return PrivateKey.fromKeyPair(this) + } + + public publicKey(): PublicKey { + return PublicKey.fromKeyPair(this) + } + + /** + * @internal + */ + public get wasm(): wasmPkg.KeyPair { + return this.#wasm + } +} + +export class Signature implements HasPayload { + public static [SYMBOL_CODEC]: GenCodec = getCodec(BytesVec).wrap({ + toBase: (higher) => higher.payload.array(), + fromBase: (lower) => Signature.fromRaw(Bytes.array(lower)), + }) + + /** + * Create a signature from its payload and public key. This function **does not sign the payload**. + */ + public static fromRaw(payload: Bytes): Signature { + return new Signature(getWASM(true).Signature.from_bytes(payload.asWasmFormat)) + } + + /** + * Creates an actual signature, signing the payload with the given private key + */ + public static create(privateKey: PrivateKey, payload: Bytes): Signature { + const value = new (getWASM(true).Signature)(privateKey.wasm, payload.asWasmFormat) + return new Signature(value) + } + + #wasm: wasmPkg.Signature + + private constructor(wasm: wasmPkg.Signature) { + this.#wasm = wasm + } + + /** + * Verify that this signature is produced for the given payload by the given key (its public part) + */ + public verify(publicKey: PublicKey, payload: Bytes): wasmPkg.VerifyResult { + return this.#wasm.verify(publicKey.wasm, payload.asWasmFormat) + } + + public get payload(): Bytes { + return Bytes.array(this.#wasm.payload()) + } +} diff --git a/packages/core/crypto/singleton.ts b/packages/core/crypto/singleton.ts new file mode 100644 index 00000000..2f4db6fd --- /dev/null +++ b/packages/core/crypto/singleton.ts @@ -0,0 +1,16 @@ +import type { WasmPkg } from './types.ts' + +let __WASM: WasmPkg | null = null + +export function setWASM(crypto: WasmPkg | null) { + __WASM = crypto +} + +function getWASM(): null | WasmPkg +function getWASM(force: true): WasmPkg +function getWASM(force?: true): null | WasmPkg { + if (force && !__WASM) throw new Error('WASM is not set. Have you called `setWASM()`?') + return __WASM +} + +export { getWASM } diff --git a/packages/core/crypto/types.ts b/packages/core/crypto/types.ts new file mode 100644 index 00000000..66669dd7 --- /dev/null +++ b/packages/core/crypto/types.ts @@ -0,0 +1,4 @@ +import type * as wasmPkg from './wasm-target/wasm-pkg.d.ts' + +export type { wasmPkg } +export type WasmPkg = typeof wasmPkg diff --git a/packages/core/crypto/util.ts b/packages/core/crypto/util.ts new file mode 100644 index 00000000..6f048d69 --- /dev/null +++ b/packages/core/crypto/util.ts @@ -0,0 +1,37 @@ +import { decodeHex, encodeHex } from '@std/encoding/hex' +import type { wasmPkg } from './types.ts' + +export type WasmBytes = wasmPkg.Bytes + +/** + * Helper to work with binary data passed into the WASM + */ +export class Bytes { + public static array(data: Uint8Array): Bytes { + return new Bytes({ t: 'array', c: data }) + } + + public static hex(hex: string): Bytes { + return new Bytes({ t: 'hex', c: hex }) + } + + #data: WasmBytes + + private constructor(data: WasmBytes) { + this.#data = data + } + + public get asWasmFormat(): WasmBytes { + return this.#data + } + + public hex(): string { + if (this.#data.t == 'hex') return this.#data.c + return encodeHex(this.#data.c) + } + + public array(): Uint8Array { + if (this.#data.t === 'array') return this.#data.c + return decodeHex(this.#data.c) + } +} diff --git a/packages/core/data-model/_generated_.prelude.ts b/packages/core/data-model/_generated_.prelude.ts new file mode 100644 index 00000000..bc748e48 --- /dev/null +++ b/packages/core/data-model/_generated_.prelude.ts @@ -0,0 +1,6 @@ +export * from '../codec.ts' +export * from './primitives.ts' +export * from './compound.ts' +export type { Variant, VariantUnit } from '../util.ts' +export * from '../traits.ts' +export * from '../crypto/mod.ts' diff --git a/packages/core/data-model/compound.ts b/packages/core/data-model/compound.ts new file mode 100644 index 00000000..3da7ff98 --- /dev/null +++ b/packages/core/data-model/compound.ts @@ -0,0 +1,678 @@ +import * as crypto from '@iroha/core/crypto' +import type { JsonValue } from 'type-fest' +import { enumCodec, type GenCodec, lazyCodec, structCodec } from '../codec.ts' +import { getCodec, type IsZero, type Ord, ordCompare, SYMBOL_CODEC } from '../traits.ts' +import type { Variant } from '../util.ts' +import { String, U64, Vec } from './primitives.ts' + +// TODO document that parse/stringify json lazily when needed +export class Json implements Ord { + public static [SYMBOL_CODEC]: GenCodec> = getCodec(String).wrap({ + toBase: (x) => x.asJsonString(), + fromBase: (str) => Json.fromJsonString(str), + }) + + public static fromValue(value: T): Json { + return new Json({ some: value }, null) + } + + public static fromJsonString(value: string): Json { + if (!value) throw new Error('JSON string cannot be empty') + return new Json(null, value) + } + + private _value: null | { some: T } + private _str: null | string + + public constructor(asValue: null | { some: T }, asString: string | null) { + this._value = asValue + this._str = asString + } + + public asValue(): T { + if (!this._value) { + this._value = { some: JSON.parse(this._str!) } + } + return this._value.some + } + + public asJsonString(): string { + if (typeof this._str !== 'string') { + this._str = JSON.stringify(this._value!.some) + } + return this._str + } + + /** + * For {@link JSON} integration + */ + public toJSON(): T { + return this.asValue() + } + + public compare(that: Json): number { + return ordCompare(this.asJsonString(), that.asJsonString()) + } +} + +export class Timestamp { + public static [SYMBOL_CODEC]: GenCodec = getCodec(U64).wrap({ + toBase: (x) => x.asMillis(), + fromBase: (x) => Timestamp.fromMillis(x), + }) + + public static fromDate(value: Date): Timestamp { + return new Timestamp(BigInt(value.getTime())) + } + + public static fromMillis(value: number | bigint | U64): Timestamp { + return new Timestamp(BigInt(value)) + } + + public static now(): Timestamp { + return new Timestamp(BigInt(Date.now())) + } + + private _ms: U64 + + public constructor(milliseconds: U64) { + this._ms = milliseconds + } + + public asDate(): Date { + // TODO check correct bounds + return new Date(Number(this._ms)) + } + + public asMillis(): U64 { + return this._ms + } + + public toJSON(): string { + return this.asDate().toISOString() + } +} + +export { Timestamp as TimestampU128 } + +export class Duration implements IsZero { + public static [SYMBOL_CODEC]: GenCodec = getCodec(U64).wrap({ + fromBase: (x) => Duration.fromMillis(x), + toBase: (y) => y.asMillis(), + }) + + public static fromMillis(ms: number | bigint): Duration { + return new Duration(BigInt(ms)) + } + + private readonly _ms: bigint + + protected constructor(ms: bigint) { + if (ms < 0n) throw new TypeError(`Duration could not be negative, got: ${ms}`) + this._ms = ms + } + + public asMillis(): bigint { + return this._ms + } + + public isZero(): boolean { + return this._ms === 0n + } + + public toJSON(): { ms: bigint } { + return { ms: this._ms } + } +} + +export type CompoundPredicate = + | Variant<'Atom', Atom> + | Variant<'Not', CompoundPredicate> + | Variant<'And' | 'Or', CompoundPredicate[]> + +export const CompoundPredicate: { + with(atom: GenCodec): GenCodec> + /** + * Predicate that always passes. + * + * It is simply the `And` variant with no predicates, which is always True (same logic as for {@link Array.prototype.every}). + */ + PASS: Variant<'And', never[]> + /** + * Predicate that always fails. + * + * It is simply the `Or` variant with no predicates, which is always False (same logic as for {@link Array.prototype.some}). + */ + FAIL: Variant<'Or', never[]> + Atom(value: T): CompoundPredicate + Not(predicate: CompoundPredicate): CompoundPredicate + And(...predicates: CompoundPredicate[]): CompoundPredicate + Or(...predicates: CompoundPredicate[]): CompoundPredicate +} = { + // TODO: freeze `value: []` too? + PASS: Object.freeze({ kind: 'And', value: [] }), + FAIL: Object.freeze({ kind: 'Or', value: [] }), + + Atom: (value: T): CompoundPredicate => ({ kind: 'Atom', value }), + Not: (predicate: CompoundPredicate): CompoundPredicate => ({ kind: 'Not', value: predicate }), + And: (...predicates: CompoundPredicate[]): CompoundPredicate => ({ kind: 'And', value: predicates }), + Or: (...predicates: CompoundPredicate[]): CompoundPredicate => ({ kind: 'Or', value: predicates }), + + with: (atomType: GenCodec): GenCodec> => { + const lazySelf = lazyCodec(() => codec) + + const codec: GenCodec> = enumCodec<{ + Atom: [Atom] + Not: [CompoundPredicate] + And: [CompoundPredicate[]] + Or: [CompoundPredicate[]] + }>( + { + // magic discriminants from schema + Atom: [0, atomType], + Not: [1, lazySelf], + And: [2, Vec.with(lazySelf)], + Or: [3, Vec.with(lazySelf)], + }, + ).discriminated() + + return codec + }, +} + +// // Crypto specials +// export type Algorithm = VariantUnit + +// export const Algorithm: { [K in crypto.Algorithm]: VariantUnit } & CodecContainer = { +// ed25519: Object.freeze({ kind: 'ed25519' }), +// secp256k1: Object.freeze({ kind: 'secp256k1' }), +// bls_normal: Object.freeze({ kind: 'bls_normal' }), +// bls_small: Object.freeze({ kind: 'bls_small' }), +// ...defineCodec( +// enumCodec<{ +// ed25519: [] +// secp256k1: [] +// bls_normal: [] +// bls_small: [] +// }>({ +// ed25519: [0], +// secp256k1: [1], +// bls_normal: [2], +// bls_small: [3], +// }).discriminated() satisfies GenCodec, +// ), +// } + +// const HASH_ARR_LEN = 32 + +// export class HashRepr { +// public static [SYMBOL_CODEC]: GenCodec = new GenCodec({ +// encode: scale.createUint8ArrayEncoder(HASH_ARR_LEN), +// decode: scale.createUint8ArrayDecoder(HASH_ARR_LEN), +// }).wrap({ +// fromBase: (lower) => HashRepr.fromRaw(lower), +// toBase: (higher) => higher.asRaw(), +// }) + +// public static fromHex(hex: string): HashRepr { +// return new HashRepr(hex, null) +// } + +// public static fromRaw(raw: Uint8Array): HashRepr { +// return new HashRepr(null, raw) +// } + +// public static fromCrypto(hash: crypto.Hash): HashRepr { +// return new HashRepr(null, hash.payload()) +// } + +// private _hex: string | null = null +// private _raw: null | Uint8Array = null + +// private constructor(hex: null | string, raw: null | Uint8Array) { +// this._hex = hex +// this._raw = raw +// } + +// public asRaw(): Uint8Array { +// if (!this._raw) { +// this._raw = decodeHex(this._hex!) +// } +// return this._raw! +// } + +// public asHex(): string { +// if (!this._hex) { +// this._hex = encodeHex(this._raw!) +// } +// return this._hex +// } + +// public toJSON(): string { +// return this.toString() +// } +// } + +// interface PubKeyObj { +// algorithm: Algorithm +// payload: BytesVec +// } + +// /** +// * {@link crypto.PublicKey} representation in the data model. +// * +// * It could be created from any representation and transformed into another. +// * +// * Note that transformations are lazy, thus the validity of input data is not immediately validated +// * (unless {@link crypto.PublicKey} is passed). +// */ +// export class PublicKeyRepr implements Ord { +// public static [SYMBOL_CODEC]: GenCodec = structCodec(['algorithm', 'payload'], { +// algorithm: getCodec(Algorithm), +// payload: getCodec(BytesVec), +// }).wrap({ +// toBase: (higher) => higher, +// fromBase: (x) => new PublicKeyRepr(x, null, null), +// }) + +// /** +// * Create from hex-encoded bytes. +// * +// * Throws if the input is not a valid hex or not a valid public key. +// */ +// public static fromHex(hex: string): PublicKeyRepr { +// try { +// const checked = crypto.PublicKey.fromMultihash(hex) +// return new PublicKeyRepr(null, hex, checked) +// } catch (err) { +// throw new SyntaxError(`Cannot parse PublicKey from "${hex}": ${globalThis.String(err)}`) +// } +// } + +// /** +// * Create from an instance of {@link crypto.PublicKey} +// */ +// public static fromCrypto(pubkey: crypto.PublicKey): PublicKeyRepr { +// return new PublicKeyRepr(null, null, pubkey) +// } + +// /** +// * Create from an algorithm and payload. +// * +// * Throws if the algorithm and payload don't form a valid public key. +// */ +// public static fromParts(algorithm: Algorithm, payload: BytesVec): PublicKeyRepr { +// const asCrypto = crypto.PublicKey.fromBytes(algorithm.kind, crypto.Bytes.array(payload)) +// return new PublicKeyRepr({ algorithm, payload }, null, asCrypto) +// } + +// private _obj: null | PubKeyObj +// private _hex: null | string = null +// private _crypto: null | crypto.PublicKey = null + +// private constructor(obj: null | PubKeyObj, hex: null | string, crypto: null | crypto.PublicKey) { +// this._obj = obj +// this._hex = hex +// this._crypto = crypto +// } + +// public get algorithm(): Algorithm { +// return this.getOrCreateObj().algorithm +// } + +// public get payload(): BytesVec { +// return this.getOrCreateObj().payload +// } + +// /** +// * Get as {@link crypto.PublicKey} +// */ +// public asCrypto(): crypto.PublicKey { +// if (!this._crypto) { +// if (this._hex) this._crypto = crypto.PublicKey.fromMultihash(this._hex) +// else this._crypto = crypto.PublicKey.fromBytes(this._obj!.algorithm.kind, crypto.Bytes.array(this._obj!.payload)) +// } +// return this._crypto +// } + +// /** +// * Get as a public key multihash, i.e. by {@link crypto.PublicKey.toMultihash} +// */ +// public asHex(): string { +// if (!this._hex) { +// if (!this._crypto) { +// this._crypto = crypto.PublicKey.fromBytes(this._obj!.algorithm.kind, crypto.Bytes.array(this._obj!.payload)) +// } +// this._hex = this._crypto.toMultihash() +// } +// return this._hex +// } + +// public toJSON(): string { +// return this.asHex() +// } + +// public compare(other: PublicKeyRepr): number { +// return ordCompare(this.asHex(), other.asHex()) +// } + +// private getOrCreateObj(): PubKeyObj { +// if (!this._obj) { +// if (!this._crypto) this._crypto = crypto.PublicKey.fromMultihash(this._hex!) +// this._obj = { algorithm: { kind: this._crypto.algorithm }, payload: this._crypto.payload() } +// } +// return this._obj +// } +// } + +// /** +// * {@link crypto.Signature} representation in the data model. +// * +// * It could be created from any representation and transformed into another: +// * +// * ```ts +// * const hex = '01019292afafaaff' // some hex, not real +// * +// * const wrap = SignatureWrap.fromHex(hex) +// * const actualSignature = wrap.asCrypto() +// * ``` +// */ +// export class SignatureRepr { +// public static [SYMBOL_CODEC]: GenCodec = getCodec(BytesVec).wrap({ +// toBase: (higher) => higher.asRaw(), +// fromBase: (lower) => SignatureRepr.fromRaw(lower), +// }) + +// /** +// * Create from a hex string. +// * +// * Throws if input is not a valid hex. +// */ +// public static fromHex(hex: string): SignatureRepr { +// const raw = decodeHex(hex) +// return new SignatureRepr(hex, raw, null) +// } + +// /** +// * Create from an instance of {@link crypto.Signature}. +// */ +// public static fromCrypto(signature: crypto.Signature): SignatureRepr { +// return new SignatureRepr(null, null, signature) +// } + +// /** +// * Create from an array of bytes. +// */ +// private static fromRaw(bytes: Uint8Array): SignatureRepr { +// return new SignatureRepr(null, bytes, null) +// } + +// private _hex: null | string +// private _raw: null | Uint8Array +// private _crypto: null | crypto.Signature + +// private constructor(hex: null | string, raw: null | Uint8Array, crypto: null | crypto.Signature) { +// this._hex = hex +// this._raw = raw +// this._crypto = crypto +// } + +// /** +// * Representation as {@link crypto.Signature}. +// */ +// public asCrypto(): crypto.Signature { +// if (!this._crypto) { +// if (this._raw) this._crypto = crypto.Signature.fromRaw(crypto.Bytes.array(this._raw)) +// else this._crypto = crypto.Signature.fromRaw(crypto.Bytes.hex(this._hex!)) +// } +// return this._crypto +// } + +// /** +// * Representation as a hex string. +// */ +// public asHex(): string { +// if (!this._hex) { +// if (this._raw) this._hex = encodeHex(this._raw) +// else this._hex = this._crypto!.payload('hex') +// } +// return this._hex +// } + +// public toJSON(): string { +// return this.asHex() +// } + +// /** +// * Representation as raw bytes. +// */ +// private asRaw(): Uint8Array { +// if (!this._raw) { +// // only if created from crypto +// this._raw = this._crypto!.payload() +// } +// return this._raw +// } +// } + +/** + * Name is a simple wrap around string that ensures that it + * doesn't contain whitespaces characters, `@`, and `#`. + * + * @example + * ```ts + * const name1 = new Name('alice') + * console.log(name1.value) // => alice + * + * new Name('alice and bob') // Error: whitespace characters. + * ``` + */ +export class Name implements Ord { + public static [SYMBOL_CODEC]: GenCodec = getCodec(String) + .wrap({ toBase: (x) => x.value, fromBase: (x) => new Name(x) }) + + private _brand!: 'Name' + private _value: string + + public constructor(name: string) { + if (!name.length) throw new SyntaxError(`Name should not be empty`) + if (/[\s#@]/.test(name)) { + throw new SyntaxError( + `Invalid name: "${name}". Name should not contain whitespace characters, ` + + `'@' (reserved for '⟨signatory⟩@⟨domain⟩' constructs, e.g. 'ed....@wonderland'), ` + + `and '#' (reserved for '⟨asset⟩#⟨domain⟩' constructs, e.g. 'rose#wonderland') `, + ) + } + + this._value = name + } + + public get value(): string { + return this._value + } + + public toJSON(): string { + return this.value + } + + public compare(other: Name): number { + return this.value > other.value ? 1 : this.value < other.value ? -1 : 0 + } +} + +export type DomainId = Name +export const DomainId = Name + +export class AccountId implements Ord { + public static [SYMBOL_CODEC]: GenCodec = structCodec<{ + signatory: crypto.PublicKey + domain: DomainId + }>(['domain', 'signatory'], { + domain: getCodec(DomainId), + signatory: getCodec(crypto.PublicKey), + }).wrap({ fromBase: (x) => new AccountId(x.signatory, x.domain), toBase: (x) => x }) + + /** + * Parses account id from a string in a form of `@`. + * + * Throws an error if the string is not a valid account id. + */ + public static parse(str: string): AccountId { + return accountIdFromStr(str) + } + + public readonly signatory: crypto.PublicKey + public readonly domain: DomainId + + public constructor(signatory: crypto.PublicKey, domain: DomainId) { + this.signatory = signatory + this.domain = domain + } + + public toJSON(): string { + return this.toString() + } + + /** + * String representation of an account id, as described in {@link AccountId.parse}. + */ + public toString(): string { + return `${this.signatory.multihash()}@${this.domain.value satisfies string}` + } + + public compare(that: AccountId): number { + const domains = ordCompare(this.domain, that.domain) + if (domains !== 0) return domains + return ordCompare(this.signatory, that.signatory) + } +} + +function accountIdFromObj({ signatory, domain }: { signatory: string; domain: string }): AccountId { + return new AccountId(crypto.PublicKey.fromMultihash(signatory), new Name(domain)) +} + +function accountIdFromStr(str: string): AccountId { + const parts = str.split('@') + if (parts.length !== 2) { + throw new SyntaxError(`AccountId should have format '⟨signatory⟩@⟨domain⟩, got: '${str}'`) + } + const [signatory, domain] = parts + return accountIdFromObj({ signatory, domain }) +} + +export class AssetDefinitionId { + public static [SYMBOL_CODEC]: GenCodec = structCodec<{ + name: Name + domain: DomainId + }>(['domain', 'name'], { + domain: getCodec(DomainId), + name: getCodec(Name), + }).wrap({ + toBase: (higher) => higher, + fromBase: (lower) => new AssetDefinitionId(lower.name, lower.domain), + }) + + /** + * Parse an asset definition id from a string representation in a form of `@`. + * + * Throws an error if the string is invalid asset definition id. + */ + public static parse(str: string): AssetDefinitionId { + return assetDefIdFromStr(str) + } + + public readonly name: Name + public readonly domain: DomainId + + public constructor(name: Name, domain: DomainId) { + this.name = name + this.domain = domain + } + + /** + * String representation, as described in {@link AssetDefinitionId.parse} + */ + public toString(): string { + return `${this.name.value satisfies string}#${this.domain.value satisfies string}` + } + + public toJSON(): string { + return this.toString() + } +} + +function assetDefIdFromObj({ name, domain }: { name: string; domain: string }) { + return new AssetDefinitionId(new Name(name), new Name(domain)) +} + +function assetDefIdFromStr(input: string) { + const parts = input.split('#') + if (parts.length !== 2) { + throw new SyntaxError( + `AssetDefinitionId should have format '⟨name⟩#⟨domain⟩, e.g. 'rose#wonderland', got '${input}'`, + ) + } + const [name, domain] = parts + return assetDefIdFromObj({ name, domain }) +} + +export class AssetId { + public static [SYMBOL_CODEC]: GenCodec = structCodec<{ + account: AccountId + definition: AssetDefinitionId + }>(['account', 'definition'], { + account: getCodec(AccountId), + definition: getCodec(AssetDefinitionId), + }).wrap({ + toBase: (higher) => higher, + fromBase: (lower) => new AssetId(lower.account, lower.definition), + }) + + /** + * Parses an asset id from its string representation in a form of either + * + * - `##@` + * - `##@` (when domains are the same) + * + * Throws an error if the string is invalid asset id. + */ + public static parse(str: string): AssetId { + return assetIdFromStr(str) + } + + public readonly account: AccountId + public readonly definition: AssetDefinitionId + + public constructor(account: AccountId, definition: AssetDefinitionId) { + this.account = account + this.definition = definition + } + + /** + * Produce a stringified ID, see {@link parse}. + */ + public toString(): string { + return this.account.domain.value === this.definition.domain.value + ? `${this.definition.name.value satisfies string}##${this.account.toString()}` + : `${this.definition.toString()}#${this.account.toString()}` + } + + public toJSON(): string { + return this.toString() + } +} + +function assetIdFromStr(input: string) { + const match = input.match(/^(.+)#(.+)?#(.+)@(.+)$/) + if (!match) { + throw new SyntaxError( + `AssetId should have format '⟨name⟩#⟨asset domain⟩#⟨account signatory⟩@⟨account domain⟩' ` + + `or '⟨name⟩##⟨account signatory⟩@⟨account domain⟩' (when asset and account domains are the same), got '${input}'`, + ) + } + const [, asset, domain1, account, domain2] = match + return new AssetId( + accountIdFromObj({ signatory: account, domain: domain2 }), + assetDefIdFromObj({ name: asset, domain: domain1 ?? domain2 }), + ) +} diff --git a/packages/core/data-model/mod.ts b/packages/core/data-model/mod.ts new file mode 100644 index 00000000..9c74c451 --- /dev/null +++ b/packages/core/data-model/mod.ts @@ -0,0 +1,4 @@ +export * from './primitives.ts' +export * from './compound.ts' +export * from './_generated_.ts' +export { Hash, KeyPair, PrivateKey, PublicKey, Signature } from '@iroha/core/crypto' diff --git a/packages/core/data-model/primitives.ts b/packages/core/data-model/primitives.ts new file mode 100644 index 00000000..3ee4479c --- /dev/null +++ b/packages/core/data-model/primitives.ts @@ -0,0 +1,148 @@ +import * as scale from '@scale-codec/core' +import { GenCodec, structCodec } from '../codec.ts' +import { type CodecContainer, defineCodec, type IsZero, type Ord, ordCompare } from '../traits.ts' +import { type CompareFn, toSortedSet } from '../util.ts' + +export type U8 = number +export const U8: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeU8, decode: scale.decodeU8 }), +) + +export type U16 = number +export const U16: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeU16, decode: scale.decodeU16 }), +) + +export type U32 = number +export const U32: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeU32, decode: scale.decodeU32 }), +) + +export type U64 = bigint +export const U64: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeU64, decode: scale.decodeU64 }), +) + +export type U128 = bigint +export const U128: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeU128, decode: scale.decodeU128 }), +) + +export type BytesVec = Uint8Array +export const BytesVec: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeUint8Vec, decode: scale.decodeUint8Vec }), +) + +export type Bool = boolean +export const Bool: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeBool, decode: scale.decodeBool }), +) + +export type String = string +export const String: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeStr, decode: scale.decodeStr }), +) + +export type Compact = bigint + +export const Compact: CodecContainer = defineCodec( + new GenCodec({ encode: scale.encodeCompact, decode: scale.decodeCompact }), +) + +export class NonZero { + public static with(codec: GenCodec): GenCodec> { + return codec.wrap>({ + toBase: (x) => x.value, + fromBase: (x) => new NonZero(x), + }) + } + + private _value: T + private __brand!: 'non-zero something' + + public constructor(value: T) { + const isZero = typeof value === 'number' || typeof value === 'bigint' ? value === 0 : value.isZero() + if (isZero) throw new TypeError(`Zero is passed to the NonZero constructor (${globalThis.String(value)})`) + this._value = value + } + + public get value(): T { + return this._value + } + + public map(fun: (value: T) => U): NonZero { + return new NonZero(fun(this.value)) + } + + public toJSON(): T { + return this.value + } +} + +export type Option = null | T + +export const Option = { + with: (value: GenCodec): GenCodec> => + new GenCodec({ + encode: scale.createOptionEncoder(value.raw.encode), + decode: scale.createOptionDecoder(value.raw.decode), + }).wrap>({ + fromBase: (base) => (base.tag === 'None' ? null : base.as('Some')), + toBase: (higher) => (higher === null ? scale.variant('None') : scale.variant('Some', higher)), + }), +} + +export type Vec = globalThis.Array + +export const Vec: { + with(item: GenCodec): GenCodec> +} = { + with: (item: GenCodec): GenCodec> => { + return new GenCodec({ + encode: scale.createVecEncoder(item.raw.encode), + decode: scale.createVecDecoder(item.raw.decode), + }) + }, +} + +export type BTreeSet = Vec + +export const BTreeSet: { + with | string>(type: GenCodec): GenCodec> + withCmp(codec: GenCodec, compare: CompareFn): GenCodec> +} = { + with | string>(type: GenCodec): GenCodec> { + return BTreeSet.withCmp(type, ordCompare) + }, + withCmp(codec: GenCodec, compare: CompareFn): GenCodec> { + return Vec.with(codec).wrap>({ + toBase: (x) => toSortedSet(x, compare), + fromBase: (x) => x, + }) + }, +} + +export interface MapEntry { + key: K + value: V +} + +/** + * Being represented as a plain array, its codec ensures that + * the entries are encoded in a deterministic manner, sorting and deduplicating items. + */ +export type BTreeMap = Array> + +export const BTreeMap = { + with: , V>(key: GenCodec, value: GenCodec): GenCodec> => { + return BTreeMap.withCmp(key, value, (a, b) => ordCompare(a.key, b.key)) + }, + withCmp: ( + key: GenCodec, + value: GenCodec, + compareFn: CompareFn>, + ): GenCodec> => { + const entry = structCodec>(['key', 'value'], { key, value }) + return BTreeSet.withCmp(entry, (a, b) => compareFn(a, b)) + }, +} diff --git a/packages/core/data-model/schema/json.ts b/packages/core/data-model/schema/json.ts new file mode 100644 index 00000000..d428a7d1 --- /dev/null +++ b/packages/core/data-model/schema/json.ts @@ -0,0 +1 @@ +export { default } from '../../../../prep/iroha/schema.json' with { type: 'json' } diff --git a/packages/data-model-schema/src/types.ts b/packages/core/data-model/schema/mod.ts similarity index 84% rename from packages/data-model-schema/src/types.ts rename to packages/core/data-model/schema/mod.ts index 480849c2..d85b44cf 100644 --- a/packages/data-model-schema/src/types.ts +++ b/packages/core/data-model/schema/mod.ts @@ -12,8 +12,8 @@ export type SchemaTypeDefinition = | EnumDefinition | ArrayDefinition | IntDefinition - | FixedPointDefinition - | TupleDef + | TupleDefinition + | BitmapDefinition export interface MapDefinition { Map: { @@ -22,7 +22,7 @@ export interface MapDefinition { } } -export interface TupleDef { +export interface TupleDefinition { Tuple: TypePath[] } @@ -64,10 +64,10 @@ export interface IntDefinition { Int: string } -export interface FixedPointDefinition { - FixedPoint: { - base: string - decimal_places: number +export interface BitmapDefinition { + Bitmap: { + repr: string + masks: { name: string; mask: number }[] } } diff --git a/packages/core/deno.jsonc b/packages/core/deno.jsonc new file mode 100644 index 00000000..a5c85d39 --- /dev/null +++ b/packages/core/deno.jsonc @@ -0,0 +1,16 @@ +{ + "name": "@iroha/core", + "version": "0.0.0", + "exports": { + ".": "./mod.ts", + "./data-model": "./data-model/mod.ts", + "./data-model/schema": "./data-model/schema/mod.ts", + "./data-model/schema-json": "./data-model/schema/json.ts", + "./crypto": "./crypto/mod.ts" + }, + "imports": { + "@scale-codec/core": "npm:@scale-codec/core@^2.0.1", + "@std/encoding": "jsr:@std/encoding@^1.0.7", + "type-fest": "npm:type-fest@^4.33.0" + } +} diff --git a/packages/core/mod.ts b/packages/core/mod.ts new file mode 100644 index 00000000..0daa7f23 --- /dev/null +++ b/packages/core/mod.ts @@ -0,0 +1,50 @@ +import * as crypto from '@iroha/core/crypto' +import { getCodec } from './traits.ts' +import * as types from '@iroha/core/data-model' + +export * from './query.ts' +export * from './transaction.ts' +export * from './codec.ts' +export * from './util.ts' +export * from './traits.ts' + +/** + * The one that is used for e.g. {@link types.TransactionEventFilter} + */ +export function transactionHash(tx: types.SignedTransaction): crypto.Hash { + const bytes = getCodec(types.SignedTransaction).encode(tx) + return crypto.Hash.hash(crypto.Bytes.array(bytes)) +} + +export function signQuery(payload: types.QueryRequestWithAuthority, privateKey: crypto.PrivateKey): types.SignedQuery { + const payloadBytes = getCodec(types.QueryRequestWithAuthority).encode(payload) + const signature = privateKey.sign(crypto.Hash.hash(crypto.Bytes.array(payloadBytes)).payload) + return { + kind: 'V1', + value: { + payload, + signature, + }, + } +} + +export function signTransaction( + payload: types.TransactionPayload, + privateKey: crypto.PrivateKey, +): types.SignedTransaction { + const payloadBytes = getCodec(types.TransactionPayload).encode(payload) + const signature = privateKey.sign(crypto.Hash.hash(crypto.Bytes.array(payloadBytes)).payload) + return { + kind: 'V1', + value: { + payload, + signature, + }, + } +} + +// TODO test +export function blockHash(header: types.BlockHeader): crypto.Hash { + const encoded = getCodec(types.BlockHeader).encode(header) + return crypto.Hash.hash(crypto.Bytes.array(encoded)) +} diff --git a/packages/core/query.spec-d.ts b/packages/core/query.spec-d.ts new file mode 100644 index 00000000..4f8b5b68 --- /dev/null +++ b/packages/core/query.spec-d.ts @@ -0,0 +1,124 @@ +import type { + Account, + AccountId, + Asset, + ExecutorDataModel, + Json, + Metadata, + Name, + Parameters, + QueryBox, + QueryOutputBatchBox, + QuerySelectorMap, + SelectorOutputMap, + SignedBlock, + SingularQueryBox, + SingularQueryOutputBox, +} from '@iroha/core/data-model' +import type { + DefaultQueryOutput, + GetQueryOutput, + GetSelectorOutput, + GetSingularQueryOutput, + SelectorToOutput, + SingularQueryOutputMap, +} from './query.ts' +import type { Variant, VariantUnit } from './util.ts' + +type Expect = T +type Equal = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false + +type test_query_selector_map_has_all_queries = Expect> + +type dbg1 = QuerySelectorMap[keyof QuerySelectorMap] +type dbg2 = keyof SelectorOutputMap + +type test_query_selector_map_matches_selector_output_map = Expect< + QuerySelectorMap[keyof QuerySelectorMap] extends keyof SelectorOutputMap ? true : false +> + +type selector_output_atoms = SelectorOutputMap[keyof SelectorOutputMap]['Atom'] +type query_output_box_kinds = QueryOutputBatchBox['kind'] + +type test_all_selector_output_atoms_are_present_in_output_box = Expect< + Equal, never> +> + +/** + * Effectively these output kinds are impossible to receive from Iroha at the moment. + * + * The `String` output exists because there is a `StringPredicateAtom`. It is a design + * limitation (or implementation issue?) of selectors & predicates in Iroha codebase - + * they mirror each other. + * + * As for `Parameter`, it is neither possible to use in predicates nor in selectors and is + * completely redundant at the moment. Maybe it was added as a stub for future. + */ +type test_few_output_options_arent_covered_by_selectors = Expect< + Equal, 'String' | 'Parameter'> +> + +type test_selector_account_domain_name = Expect< + Equal< + GetSelectorOutput<'Account', Variant<'Id', Variant<'Domain', Variant<'Name', VariantUnit<'Atom'>>>>>, + // + Name + > +> + +type test_selector_metadata_key = Expect< + Equal< + GetSelectorOutput<'Metadata', Variant<'Key', { key: Name; projection: VariantUnit<'Atom'> }>>, + // + Json + > +> + +type test_selector_accout_metadata_key = Expect< + Equal< + GetSelectorOutput<'Account', Variant<'Metadata', Variant<'Key', { key: Name; projection: VariantUnit<'Atom'> }>>>, + // + Json + > +> + +type test_selector_metadata_atom = Expect>, Metadata>> + +type test_find_account_and_id = Expect< + Equal< + SelectorToOutput<'FindAccounts', [VariantUnit<'Atom'>, Variant<'Id', VariantUnit<'Atom'>>]>, + [Account, AccountId] + > +> + +type test_find_account_metadata_key = Expect< + Equal< + SelectorToOutput< + 'FindAccounts', + Variant<'Metadata', Variant<'Key', { key: Name; projection: VariantUnit<'Atom'> }>> + >, + Json + > +> + +type test_default_output_for_blocks = Expect, SignedBlock>> + +type singular_queries_in_output = keyof SingularQueryOutputMap +type singular_query_output_kinds = SingularQueryOutputBox['kind'] + +type test_singular_query_output_map_covers_all_queries = Expect< + Equal +> + +type test_singular_query_output_map_matches_with_output_box = Expect< + Equal +> + +type test_singular_query_output_dm = Expect, ExecutorDataModel>> +type test_singular_query_output_params = Expect, Parameters>> + +type test_query_outputs = + & Expect>, Account>> + & Expect, Account>> + +type test_selector_as_array_not_tuple = Expect[]>, Asset[]>> diff --git a/packages/core/query.spec.ts b/packages/core/query.spec.ts new file mode 100644 index 00000000..88c7691d --- /dev/null +++ b/packages/core/query.spec.ts @@ -0,0 +1,31 @@ +import { describe, expect, test } from 'vitest' +import { buildQuery } from './query.ts' +import { DomainProjectionSelector } from '@iroha/core/data-model' + +describe('buildQuery()', () => { + test('default selector is [atom]', () => { + const res = buildQuery('FindDomains', null) + + expect(res.query.query.value.selector).toEqual([{ kind: 'Atom' }]) + }) + + test('when single selector is passed, it is wrapped into an array', () => { + const res = buildQuery('FindDomains', null, { selector: DomainProjectionSelector.Id.Atom }) + + expect(res.query.query.value.selector).toEqual([DomainProjectionSelector.Id.Atom]) + }) + + test('when array selector is passed, it is preserved as-is', () => { + const SELECTOR = [DomainProjectionSelector.Id.Name.Atom, DomainProjectionSelector.Metadata.Atom] + + const res = buildQuery('FindDomains', null, { selector: SELECTOR }) + + expect(res.query.query.value.selector).toEqual(SELECTOR) + }) + + test('uses PASS predicate by default (orphan "and")', () => { + const res = buildQuery('FindAssets', null) + + expect(res.query.query.value.predicate).toEqual({ kind: 'And', value: [] }) + }) +}) diff --git a/packages/core/query.ts b/packages/core/query.ts new file mode 100644 index 00000000..9ec2ee86 --- /dev/null +++ b/packages/core/query.ts @@ -0,0 +1,214 @@ +import * as types from '@iroha/core/data-model' +import type { VariantUnit } from './util.ts' + +/** + * Type map, defining relation between the variants of {@link types.SingularQueryBox} and its outputs in + * {@link types.SingularQueryOutputBox} + */ +export interface SingularQueryOutputMap { + FindExecutorDataModel: 'ExecutorDataModel' + FindParameters: 'Parameters' +} + +/** + * Kinds of singular queries. + */ +export type SingularQueryKind = keyof SingularQueryOutputMap & types.SingularQueryBox['kind'] + +/** + * Type function to map a singular query kind into the value of its output box. + */ +export type GetSingularQueryOutput = SingularQueryOutputMap[K] extends + infer OutputKind extends types.SingularQueryOutputBox['kind'] + ? (types.SingularQueryOutputBox & { kind: OutputKind })['value'] + : never + +/** + * Type function to map the selector of arbitrary shape to the corresponding output value. + */ +export type GetSelectorOutput = S extends { kind: 'Atom' } + ? types.SelectorOutputMap[K]['Atom'] extends infer OutputKind extends types.QueryOutputBatchBox['kind'] + ? (types.QueryOutputBatchBox & { kind: OutputKind })['value'] extends (infer Output)[] ? Output + : never + : never + : [K, S] extends ['Metadata', { kind: 'Key'; value: { key: types.Name; projection: infer NextS } }] + ? GetSelectorOutput<'Json', NextS> + : S extends { kind: infer SKind extends keyof types.SelectorOutputMap[K]; value: infer NextS } + ? types.SelectorOutputMap[K][SKind] extends infer NextK extends keyof types.SelectorOutputMap + ? GetSelectorOutput + : never + : never + +/** + * Kinds of _iterable_ queries. + * + * Note that this differs from {@link SingularQueryKind}. + */ +export type QueryKind = types.QueryBox['kind'] & keyof types.QuerySelectorMap + +/** + * Map a tuple with {@link GetSelectorOutput}. + */ +export type GetSelectorTupleOutput = Tuple extends [ + infer Head, + ...infer Tail, +] ? [GetSelectorOutput, ...GetSelectorTupleOutput] + : Tuple extends [] ? [] + // Not as ergonomic (lost `const` somewhere?), but still works and is correct + : Tuple extends Array ? GetSelectorOutput[] + : never + +/** + * Maps a query kind and a selector to the corresponding output of this query and this selector. + * + * The selector must be either a single value or an array. Values of the selectors are actual variants + * and structs of the selectors in the schema. + * + * If the selector is a single value or an array with a single value, the output will be just a value. + */ +export type SelectorToOutput< + Q extends QueryKind & keyof types.QuerySelectorMap, + Selection, +> = types.QuerySelectorMap[Q] extends infer Selector extends keyof types.SelectorOutputMap + ? Selection extends readonly [infer S] ? GetSelectorOutput + : Selection extends readonly [] ? never + : Selection extends readonly [...infer S] ? GetSelectorTupleOutput + : GetSelectorOutput + : never + +/** + * The default output is the root value of the query output, without any projections inside. + */ +export type DefaultQueryOutput = GetSelectorOutput< + Q extends keyof types.QuerySelectorMap + ? types.QuerySelectorMap[Q] extends infer Selector extends keyof types.SelectorOutputMap ? Selector + : never + : never, + VariantUnit<'Atom'> +> + +const DEFAULT_SELECTOR = [{ kind: 'Atom' }] + +/** + * Maps query kind to its corresponding predicate type. + */ +export type PredicateFor = (types.QueryBox & { kind: Q })['value'] extends + types.QueryWithFilter, any> ? P + : never + +/** + * Utility to build a query in a type-safe way. + * + * @param kind kind of the query + * @param payload payload of the query (for most, it's `null`) + * @param params params such as predicate, selector, pagination etc + * @returns a constructed {@link types.QueryWithParams} and a function that extracts the typed output from + * query response. + */ +export function buildQuery>( + kind: K, + payload: GetQueryPayload, + params?: P, +): BuildQueryResult> { + return { + query: { + query: { + kind, + value: { + query: payload, + predicate: params?.predicate || types.CompoundPredicate.PASS, + selector: params?.selector + ? Array.isArray(params?.selector) ? params.selector : [params.selector] + : DEFAULT_SELECTOR, + } as types.QueryWithFilter, unknown>, + } as types.QueryBox, + params: { + fetchSize: params?.fetchSize?.map(BigInt) ?? null, + pagination: { + offset: params?.offset ? BigInt(params.offset) : 0n, + limit: params?.limit?.map(BigInt) ?? null, + }, + sorting: { + sortByMetadataKey: params?.sorting?.byMetadataKey ?? null, + }, + }, + }, + parseResponse: generateOutputTuples, + } +} + +// TODO: document fields! +/** + * Params for {@link buildQuery}. + */ +export interface BuildQueryParams { + /** + * TODO how to work with predicates + */ + predicate?: types.CompoundPredicate> + /** + * TODO examples of selectors + */ + selector?: unknown + /** + * TODO what fetch size affects, why to set + */ + fetchSize?: types.NonZero + /** + * TODO pagination offset + */ + offset?: number | bigint + /** + * TODO pagination limit + */ + limit?: types.NonZero + /** + * Specify sorting of the output + */ + sorting?: { + /** + * Sort output by the key-value entry in the entity's metadata. + * TODO describe example + */ + byMetadataKey?: types.Name + } +} + +export type GetQueryPayload = (types.QueryBox & { kind: K })['value'] extends + types.QueryWithFilter ? Payload : never + +/** + * Result of {@link buildQuery} + */ +export interface BuildQueryResult { + query: types.QueryWithParams + parseResponse: (response: types.QueryOutputBatchBoxTuple) => Generator +} + +/** + * Utility type + */ +export type GetQueryOutput> = P extends { + selector: infer S +} ? SelectorToOutput + : SelectorToOutput> + +function* generateOutputTuples(response: types.QueryOutputBatchBoxTuple): Generator { + // FIXME: this is redundant in runtime, just a safe guard + // invariant( + // response.length === tuple.length, + // () => `Expected response to have exactly ${tuple.length} elements, got ${response.length}`, + // ) + // for (let i = 0; i < tuple.length; i++) { + // invariant( + // response[i].kind === tuple[i], + // () => `Expected response to have type ${tuple[i]} at element ${i}, got ${response[i].kind}`, + // ) + // } + const len = response[0].value.length + const tupleLen = response.length + for (let i = 0; i < len; i++) { + if (tupleLen === 1) yield response[0].value[i] as Output + else yield Array.from({ length: tupleLen }, (_v, j) => response[j].value[i]) as Output + } +} diff --git a/packages/core/test/misc.spec.ts b/packages/core/test/misc.spec.ts new file mode 100644 index 00000000..ec135083 --- /dev/null +++ b/packages/core/test/misc.spec.ts @@ -0,0 +1,158 @@ +import { describe, expect, test } from 'vitest' + +import { KeyPair } from '@iroha/core/crypto' +import * as dm from '@iroha/core/data-model' +import { getCodec } from '@iroha/core' +import { fromHexWithSpaces, SAMPLE_ACCOUNT_ID } from './util.ts' + +describe('JSON/string serialisation', () => { + test('AccountId', () => { + const SIGNATORY = `ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E` + const DOMAIN = 'badland' + const ID = `${SIGNATORY}@${DOMAIN}` + + expect(dm.AccountId.parse(ID).toJSON()).toEqual(ID) + expect(new dm.AccountId(dm.PublicKey.fromMultihash(SIGNATORY), new dm.Name(DOMAIN)).toJSON()).toEqual(ID) + }) + + test('AccountId (after being decoded)', () => { + const pk = KeyPair.random().publicKey() + const decoded = getCodec(dm.AccountId) + .decode(getCodec(dm.AccountId).encode(new dm.AccountId(pk, new dm.Name('test')))) + + expect(decoded.toJSON()).toEqual(`${pk.multihash()}@test`) + }) + + test('AssetId - different domains', () => { + const id = dm.AssetId.parse(`test#wonderland#${SAMPLE_ACCOUNT_ID.toString()}`) + + expect(id).toMatchInlineSnapshot( + `"test#wonderland#ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland"`, + ) + }) + + test('AssetId - same domains', () => { + const id = dm.AssetId.parse(`test#badland#${SAMPLE_ACCOUNT_ID.toString()}`) + + expect(id).toMatchInlineSnapshot( + `"test##ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland"`, + ) + }) + + test('NonZero serializes as its value', () => { + expect({ nonZero: new dm.NonZero(51) }).toMatchInlineSnapshot(` + { + "nonZero": 51, + } + `) + }) + + test('Duration serializes as { ms: }', () => { + expect({ duration: dm.Duration.fromMillis(51123) }).toMatchInlineSnapshot(` + { + "duration": { + "ms": 51123n, + }, + } + `) + }) + + test('Timestamp serialises as ISO string', () => { + expect(dm.Timestamp.fromDate(new Date(-41234040100)).toJSON()).toBe('1968-09-10T18:05:59.900Z') + }) +}) + +describe('Validation', () => { + test('Empty JSON string', () => { + expect(() => dm.Json.fromJsonString('')).toThrowErrorMatchingInlineSnapshot(`[Error: JSON string cannot be empty]`) + }) + + test.each([' alice ', 'ali ce', 'ali@ce', '', 'ali#ce'])('Name validation fails for %o', (sample) => { + expect(() => new dm.Name(sample)).toThrowError() + }) +}) + +test('Parse AssetId with different domains', () => { + const parsed = dm.AssetId.parse( + 'rose#wonderland#ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', + ) + + expect(parsed.definition.name.value).toEqual('rose') + expect(parsed.definition.domain.value).toEqual('wonderland') + expect(parsed.account.signatory.algorithm).toEqual('ed25519') + expect(parsed.account.signatory.payload.hex()).toEqual( + 'b23e14f659b91736aab980b6addce4b1db8a138ab0267e049c082a744471714e', + ) + expect(parsed.account.domain.value).toEqual('badland') +}) + +test('Fails to parse invalid account id with bad signatory', () => { + expect(() => console.log(dm.AccountId.parse('test@test'))).toThrowErrorMatchingInlineSnapshot( + `[Error: Invalid character 't' at position 0]`, + ) +}) + +test('Fails to parse account id with multiple @', () => { + expect(() => dm.AccountId.parse('a@b@c')).toThrowErrorMatchingInlineSnapshot( + `[SyntaxError: AccountId should have format '⟨signatory⟩@⟨domain⟩, got: 'a@b@c']`, + ) +}) + +describe('Status', () => { + test('Documented example at https://hyperledger.github.io/iroha-2-docs/reference/torii-endpoints.html#status', () => { + const STATUS: dm.Status = { + peers: 4n, + blocks: 5n, + txsAccepted: 31n, + txsRejected: 3n, + uptime: { + secs: 5n, + nanos: 937000000, + }, + viewChanges: 2n, + queueSize: 18n, + } + const ENCODED = '10 14 7C 0C 14 40 7C D9 37 08 48' + + expect(getCodec(dm.Status).encode(STATUS)).toEqual(fromHexWithSpaces(ENCODED)) + expect(getCodec(dm.Status).decode(fromHexWithSpaces(ENCODED))).toEqual(STATUS) + }) + + test('From zeros', () => { + expect(getCodec(dm.Status).decode(fromHexWithSpaces('00 00 00 00 00 00 00 00 00 00 00'))).toMatchInlineSnapshot(` + { + "blocks": 0n, + "peers": 0n, + "queueSize": 0n, + "txsAccepted": 0n, + "txsRejected": 0n, + "uptime": { + "nanos": 0, + "secs": 0n, + }, + "viewChanges": 0n, + } + `) + }) +}) + +describe('construct pub key', () => { + function assertMatches(key: dm.PublicKey) { + expect(key.algorithm).toEqual('ed25519') + expect(key.payload.hex()).toEqual('b23e14f659b91736aab980b6addce4b1db8a138ab0267e049c082a744471714e') + } + + test('from multihash', () => { + const key = dm.PublicKey.fromMultihash('ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E') + + assertMatches(key) + }) + + test('by decoding', () => { + const key = dm.PublicKey.fromMultihash('ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E') + const bytes = getCodec(dm.PublicKey).encode(key) + const key2 = getCodec(dm.PublicKey).decode(bytes) + + assertMatches(key2) + }) +}) diff --git a/packages/core/test/util.ts b/packages/core/test/util.ts new file mode 100644 index 00000000..f955231d --- /dev/null +++ b/packages/core/test/util.ts @@ -0,0 +1,23 @@ +import '@iroha/crypto-target-node/install' +import * as dm from '@iroha/core/data-model' + +function* hexes(hex: string): Generator { + for (let i = 0; i < hex.length;) { + if (/^[0-9a-fA-F]{2}/.test(hex.slice(i))) { + yield Number.parseInt(hex.slice(i, i + 2), 0x10) + i += 2 + } else i += 1 + } +} + +export function fromHexWithSpaces(hex: string): Uint8Array { + return new Uint8Array(hexes(hex)) +} + +export function toHex(data: Iterable): string { + return [...data].map((x) => x.toString(16).padStart(2, '0')).join('') +} + +export const SAMPLE_ACCOUNT_ID = dm.AccountId.parse( + 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', +) diff --git a/packages/core/traits.ts b/packages/core/traits.ts new file mode 100644 index 00000000..7ef1a2c7 --- /dev/null +++ b/packages/core/traits.ts @@ -0,0 +1,75 @@ +import type { GenCodec } from './codec.ts' + +export const SYMBOL_CODEC = '$codec' + +/** + * Extracts codec from its container. + */ +export function getCodec(type: CodecContainer): GenCodec { + return type[SYMBOL_CODEC] +} + +/** + * Wraps a codec into {@link CodecContainer}. + */ +export function defineCodec(codec: GenCodec): CodecContainer { + return { [SYMBOL_CODEC]: codec } +} + +/** + * A value that contains a codec under a "special" key ({@link SYMBOL_CODEC}). + */ +export interface CodecContainer { + [SYMBOL_CODEC]: GenCodec +} + +/** + * Ordering "trait". Tells how to compare values of the same type with each other. + */ +export interface Ord { + /** + * Compares `this` with `that`. + * + * @param that the other value to compare to + * @returns a negative number if `this` is less than `that`; + * a positive number if `this` is greater than `that`; + * zero if they are equal. Same behaviour as with {@link Array.sort} + */ + compare: (that: T) => number +} + +/** + * Types for which ordering is "known", that is, the comparison if built-in. + */ +export type OrdKnown = string | bigint | number + +function ordCompareString(a: string, b: string): number { + return a.localeCompare(b) +} + +function ordCompareNum(a: T, b: T): number { + return Number(a - b) +} + +/** + * Implementation of the compare function for types that are either {@link Ord} + * or for which ordering is "known" (i.e. {@link OrdKnown}). + * + * See {@link Ord.compare}. + */ +export function ordCompare>(a: T, b: T): number { + if (typeof a === 'string') return ordCompareString(a, b as string) + if (typeof a === 'bigint' || typeof a === 'number') return ordCompareNum(a, b as number | bigint) + return a.compare(b as T) +} + +/** + * A "trait" that specifies a method to check whether the value is zero or not. + */ +export interface IsZero { + /** + * Tells whether `this` is zero. + * @returns `true` if zero, `false` otherwise. + */ + isZero: () => boolean +} diff --git a/packages/core/transaction.ts b/packages/core/transaction.ts new file mode 100644 index 00000000..11041d12 --- /dev/null +++ b/packages/core/transaction.ts @@ -0,0 +1,47 @@ +import * as dm from '@iroha/core/data-model' + +export interface TransactionPayloadParams { + chain: dm.ChainId + authority: dm.AccountId + + /** + * @default dm.Timestamp.now() + */ + creationTime?: dm.Timestamp + /** + * @default new dm.NonZero(dm.Duration.fromMillis(100_000)) + */ + timeToLive?: dm.NonZero + /** + * @default null + */ + nonce?: dm.NonZero + /** + * @default [] + */ + metadata?: dm.Metadata +} + +/** + * Build {@link dm.TransactionPayload}. + * + * @param executable + * @param params + * @returns + */ +export function buildTransactionPayload( + executable: dm.Executable, + params: TransactionPayloadParams, +): dm.TransactionPayload { + const payload: dm.TransactionPayload = { + chain: params.chain, + authority: params.authority, + instructions: executable, + creationTime: params.creationTime ?? dm.Timestamp.fromDate(new Date()), + timeToLive: params.timeToLive ?? new dm.NonZero(dm.Duration.fromMillis(100_000)), + nonce: params.nonce ?? null, + metadata: params.metadata ?? [], + } + + return payload +} diff --git a/packages/core/util.spec.ts b/packages/core/util.spec.ts new file mode 100644 index 00000000..7f1ef827 --- /dev/null +++ b/packages/core/util.spec.ts @@ -0,0 +1,103 @@ +import { describe, expect, test } from 'vitest' +import { toSortedSet } from './util.ts' +import type { Ord, OrdKnown } from './traits.ts' +import { ordCompare } from './traits.ts' + +interface Entry { + key: K + value: V +} + +const compareEntries = | OrdKnown>(a: Entry, b: Entry): number => + ordCompare(a.key, b.key) + +class NumHolder implements Ord { + public readonly value: number + + public constructor(value: number) { + this.value = value + } + + public compare(other: NumHolder): number { + const a = this.value + const b = other.value + return a - b + } +} + +describe('toSortedSet()', () => { + test('sorts 3 unique strings', () => { + expect(toSortedSet(['foo', 'bar', 'baz'], ordCompare)).toEqual(['bar', 'baz', 'foo']) + }) + + test('deduplicates strings', () => { + expect(toSortedSet(['foo', '2', 'bar', 'foo', 'baz', 'baz', '12', '1', '12', '2'], ordCompare)).toEqual([ + '1', + '12', + '2', + 'bar', + 'baz', + 'foo', + ]) + }) + + test('sorts key-value pairs (key is string)', () => { + expect( + toSortedSet>( + [ + { key: 'baz', value: 2 }, + { key: 'foo', value: 3 }, + { key: 'bar', value: 1 }, + ], + compareEntries, + ), + ).toEqual([ + { key: 'bar', value: 1 }, + { key: 'baz', value: 2 }, + { key: 'foo', value: 3 }, + ]) + }) + + test('deduplicate entries, leaves the last occurences (key is string)', () => { + expect( + toSortedSet>( + [ + { key: 'baz', value: 2 }, + { key: 'foo', value: 3 }, + { key: 'bar', value: 1 }, + { key: 'baz', value: 4 }, + ], + compareEntries, + ), + ).toEqual([ + { key: 'bar', value: 1 }, + { key: 'baz', value: 4 }, + { key: 'foo', value: 3 }, + ]) + }) + + test('sorts & deduplicates custom ord implementations', () => { + expect( + toSortedSet( + [ + new NumHolder(10), + new NumHolder(100), + new NumHolder(1), + new NumHolder(100), + new NumHolder(9), + new NumHolder(1000), + new NumHolder(1), + ], + ordCompare, + ), + ).toEqual([new NumHolder(1), new NumHolder(9), new NumHolder(10), new NumHolder(100), new NumHolder(1000)]) + }) + + test('sort bigints with ordCompare', () => { + expect(toSortedSet([0n, 10n, 5n, 3n, 3n, 0n, 1n], ordCompare)).toEqual([0n, 1n, 3n, 5n, 10n]) + }) + + test('sort numbers with ordCompare', () => { + expect(toSortedSet([0, 5, 1, 6, 2], ordCompare)).toEqual([0, 1, 2, 5, 6]) + }) +}) diff --git a/packages/core/util.ts b/packages/core/util.ts new file mode 100644 index 00000000..ebe6c6f7 --- /dev/null +++ b/packages/core/util.ts @@ -0,0 +1,75 @@ +/** + * Variant of an enumeration (discriminated union) with value. + * + * Also: {@link VariantUnit} + */ +export interface Variant { + /** + * The kind of variant. This is the field by which the variants are discriminated. + */ + kind: Kind + /** + * The corresponding value of the variant. + */ + value: Value +} + +/** + * "Unit" variant of an enumeration (discriminated union). + * + * Also: {@link Variant} + */ +export interface VariantUnit { + /** + * The kind of variant. This is the field by which the variants are discriminated. + */ + kind: Kind +} + +// function hexChar(hex: string, index: number): number { +// const char = hex[index].toLowerCase() +// if (char >= '0' && char <= '9') return char.charCodeAt(0) - '0'.charCodeAt(0) +// if (char >= 'a' && char <= 'f') return 10 + char.charCodeAt(0) - 'a'.charCodeAt(0) +// throw new Error(`Expected 0..9/a..f/A..F, got '${hex[index]}' at position ${index}`) +// } + +// /** +// * Decode hex string and generate its bytes. +// */ +// export function* hexDecode(hex: string): Generator { +// for (let i = 0; i < hex.length; i += 2) { +// yield hexChar(hex, i) * 16 + hexChar(hex, i + 1) +// } +// } + +// /** +// * Encode array of bytes as a hex string +// */ +// export function hexEncode(bytes: Uint8Array): string { +// // TODO: optimise +// return [...bytes].map((x) => x.toString(16).padStart(2, '0')).join('') +// } + +export type CompareFn = (a: T, b: T) => number + +/** + * Sorts and deduplicates elements of an array given a comparator. + * + * Deduplication works for elements for which comparator returns zero. + * It leaves the last occurence of a value. + * + * @param items the array to sort and deduplicate + * @param compareFn comparator + * @returns a new array with items sorted and deduplicated. + */ +export function toSortedSet(items: T[], compareFn: CompareFn): T[] { + // TODO: optimise, not a very efficient implementation + return [...items].sort(compareFn).filter((val, i, arr) => { + if (i < arr.length - 1) { + const next = arr[i + 1] + const ordering = compareFn(val, next) + if (ordering === 0) return false + } + return true + }) +} diff --git a/packages/crypto/packages/target-node/CHANGELOG.md b/packages/crypto-target-node/CHANGELOG.md similarity index 81% rename from packages/crypto/packages/target-node/CHANGELOG.md rename to packages/crypto-target-node/CHANGELOG.md index a8ba99e5..ba6e02bc 100644 --- a/packages/crypto/packages/target-node/CHANGELOG.md +++ b/packages/crypto-target-node/CHANGELOG.md @@ -6,9 +6,12 @@ - 787a198: **Breaking:** Complete rewrite of crypto WASM, and major update of the surrounding API. - - Now WASM is made from the original `iroha_crypto` from Iroha 2 repo. As one of the outcomes, binary blob size is reduced from 2mb to 600kb. - - Remove `KeyGenConfiguration`. Use `KeyPair.deriveFromSeed`, `KeyPair.deriveFromPrivateKey`, and `KeyPair.random` instead. - - Normalise API across `PublicKey`, `PrivateKey`, `KeyPair`, and `Signature` classes (JSON methods, raw conversion methods etc.) + - Now WASM is made from the original `iroha_crypto` from Iroha 2 repo. As one of the outcomes, binary blob size is + reduced from 2mb to 600kb. + - Remove `KeyGenConfiguration`. Use `KeyPair.deriveFromSeed`, `KeyPair.deriveFromPrivateKey`, and `KeyPair.random` + instead. + - Normalise API across `PublicKey`, `PrivateKey`, `KeyPair`, and `Signature` classes (JSON methods, raw conversion + methods etc.) - Introduce `Bytes` utility to accept binary input either as `Bytes.array([1, 2, 3])` or `Bytes.hex('001122')` - Export more types¡ @@ -36,7 +39,8 @@ ### Minor Changes -- 40516f1: **refactor**: combine new `Algorithm` type and codec from `data-model` with the crypto's `Algorithm` type, which is simply a string. Add `Algorithm.toDataModel` and `Algorithm.fromDataModel` methods. +- 40516f1: **refactor**: combine new `Algorithm` type and codec from `data-model` with the crypto's `Algorithm` type, + which is simply a string. Add `Algorithm.toDataModel` and `Algorithm.fromDataModel` methods. ### Patch Changes @@ -63,14 +67,17 @@ #### What the braking change is - Each target now provides high-level wrappers around raw `wasm-pack` artifacts. These wrappers provide a better-designed interface with features like global `.free()`-objects tracking and integration with `@iroha2/data-model`. + Each target now provides high-level wrappers around raw `wasm-pack` artifacts. These wrappers provide a + better-designed interface with features like global `.free()`-objects tracking and integration with + `@iroha2/data-model`. - Moreover, the WASM itself is re-written and now provides more flexibility, such as working with JSON and HEX representations out of the box. + Moreover, the WASM itself is re-written and now provides more flexibility, such as working with JSON and HEX + representations out of the box. Here you can see how `@iroha2/crypto-core` and `@iroha2/crypto-target-*` are connected: ```ts - import { IrohaCryptoInterface, cryptoTypes } from '@iroha2/crypto-core' + import { cryptoTypes, IrohaCryptoInterface } from '@iroha2/crypto-core' import { crypto } from '@iroha2/crypto-target-node' // each target exports `crypto`, which is the `IrohaCryptoInterface` type from @@ -82,10 +89,11 @@ const hash: cryptoTypes.Hash = crypto.Hash.hash('hex', '00ff') ``` - `@iroha2/crypto-core` re-exports `@iroha2/crypto-util`, a new library which contains (for now) only utilities to work with `.free()` tracking: + `@iroha2/crypto-core` re-exports `@iroha2/crypto-util`, a new library which contains (for now) only utilities to work + with `.free()` tracking: ```ts - import { freeScope, FREE_HEAP } from '@iroha2/crypto-util' + import { FREE_HEAP, freeScope } from '@iroha2/crypto-util' import { crypto } from '@iroha2/crypto-target-web' const keyPair = freeScope((scope) => { @@ -113,15 +121,18 @@ #### Why the change was made - Codegen of `wasm_bindgen` is very limited. This change is made to provide a better quality and safer API over crypto WASM. + Codegen of `wasm_bindgen` is very limited. This change is made to provide a better quality and safer API over crypto + WASM. #### How a consumer should update their code Unfortunately, the code should be updated completely. Here are some major points you should note. - `IrohaCryptoInterface` type from the core package is still the same as `crypto` export from target packages, but the content of the type is completely different. + `IrohaCryptoInterface` type from the core package is still the same as `crypto` export from target packages, but the + content of the type is completely different. - Previously, types such as `Hash`, `Signature`, `PublicKey` were separate exports from the core library. Now they are contained within the `cryptoTypes` namespace: + Previously, types such as `Hash`, `Signature`, `PublicKey` were separate exports from the core library. Now they are + contained within the `cryptoTypes` namespace: ```ts // doesn't work anymore diff --git a/packages/crypto/packages/target-node/README.md b/packages/crypto-target-node/README.md similarity index 64% rename from packages/crypto/packages/target-node/README.md rename to packages/crypto-target-node/README.md index 2d493158..5ac62216 100644 --- a/packages/crypto/packages/target-node/README.md +++ b/packages/crypto-target-node/README.md @@ -1,7 +1,7 @@ # `@iroha2/crypto-target-node` -The `@iroha2/crypto-target-node` package contains a crypto WASM compiled with the `node` target. -This package provides crypto interface for the Node.js environment. +The `@iroha2/crypto-target-node` package contains a crypto WASM compiled with the `node` target. This package provides +crypto interface for the Node.js environment. ## Usage @@ -13,4 +13,5 @@ const { crypto } = require('@iroha2/crypto-target-node') import { crypto } from '@iroha2/crypto-target-node' ``` -See [`@iroha2/crypto-core`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/core) package for details. +See [`@iroha2/crypto-core`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/core) +package for details. diff --git a/packages/crypto-target-node/deno.jsonc b/packages/crypto-target-node/deno.jsonc new file mode 100644 index 00000000..e4edcaef --- /dev/null +++ b/packages/crypto-target-node/deno.jsonc @@ -0,0 +1,8 @@ +{ + "name": "@iroha/crypto-target-node", + "version": "0.0.0", + "exports": { + ".": "./mod.ts", + "./install": "./install.ts" + } +} diff --git a/packages/crypto-target-node/install.ts b/packages/crypto-target-node/install.ts new file mode 100644 index 00000000..4057e331 --- /dev/null +++ b/packages/crypto-target-node/install.ts @@ -0,0 +1,3 @@ +import { install } from './mod.ts' + +install() diff --git a/packages/crypto-target-node/mod.ts b/packages/crypto-target-node/mod.ts new file mode 100644 index 00000000..e939c50c --- /dev/null +++ b/packages/crypto-target-node/mod.ts @@ -0,0 +1,13 @@ +/** + * @module @iroha/crypto-target-node + */ + +import { setWASM } from '@iroha/core/crypto' +// @ts-types="./wasm-target/iroha_crypto.d.ts" +import wasmPkg from './wasm-target/iroha_crypto.js' + +export { wasmPkg } + +export function install() { + setWASM(wasmPkg) +} diff --git a/packages/crypto-target-web/deno.jsonc b/packages/crypto-target-web/deno.jsonc new file mode 100644 index 00000000..ce9799b6 --- /dev/null +++ b/packages/crypto-target-web/deno.jsonc @@ -0,0 +1,8 @@ +{ + "name": "@iroha/crypto-target-web", + "version": "0.0.0", + "exports": { + ".": "./mod.ts", + "./install": "./install.ts" + } +} diff --git a/packages/crypto-target-web/install.ts b/packages/crypto-target-web/install.ts new file mode 100644 index 00000000..e0c663f1 --- /dev/null +++ b/packages/crypto-target-web/install.ts @@ -0,0 +1,3 @@ +import { install } from './mod.ts' + +await install() diff --git a/packages/crypto-target-web/mod.ts b/packages/crypto-target-web/mod.ts new file mode 100644 index 00000000..cb942755 --- /dev/null +++ b/packages/crypto-target-web/mod.ts @@ -0,0 +1,15 @@ +/** + * @module @iroha/crypto-target-web + */ + +import { setWASM } from '@iroha/core/crypto' +// @ts-types="./wasm-target/iroha_crypto.d.ts" +import * as wasmPkg from './wasm-target/iroha_crypto.js' +import init from './wasm-target/iroha_crypto.js' + +export async function install() { + await init() + setWASM(wasmPkg) +} + +export { init, wasmPkg } diff --git a/packages/crypto/README.md b/packages/crypto/README.md deleted file mode 100644 index 4451e40f..00000000 --- a/packages/crypto/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# `@iroha2/monorepo-crypto` - -## Contents - -The directory contains the following packages: - -- [`crypto-core`](./packages/core/) provides the types and re-exports from `crypto-util` -- [`crypto-util`](./packages/util/) provides the shared utilities -- [`crypto-target-node`](./packages/target-node/) provides compiled crypto WASM for the Node.js environment -- [`crypto-target-web`](./packages/target-web/) provides compiled crypto WASM for native Web (ESM) -- [`crypto-target-bundler`](./packages/target-bundler/) provides compiled crypto WASM to use with bundlers such as - Webpack diff --git a/packages/crypto/crypto-rs/rust-toolchain.toml b/packages/crypto/crypto-rs/rust-toolchain.toml deleted file mode 100644 index 2dcf7269..00000000 --- a/packages/crypto/crypto-rs/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "nightly-2024-01-12" \ No newline at end of file diff --git a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto.d.ts b/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto.d.ts deleted file mode 100644 index 7ee7ec4c..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto.d.ts +++ /dev/null @@ -1,276 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** -* @returns {Algorithm} -*/ -export function algorithm_default(): Algorithm; -/** -*/ -export function main_js(): void; - -export type Algorithm = - | 'ed25519' - | 'secp256k1' - | 'bls_normal' - | 'bls_small' - - - -export interface PrivateKeyJson { - algorithm: string - /** Hex-encoded bytes */ - payload: string -} - -export interface KeyPairJson { - public_key: string - private_key: PrivateKeyJson -} - -export interface SignatureJson { - public_key: string - /** Hex-encoded bytes */ - payload: string -} - -export type VerifyResult = - | { t: 'ok' } - | { t: 'err', error: string } - - - -export type Bytes = - | { t: 'array', c: Uint8Array } - | { t: 'hex', c: string } - - -/** -*/ -export class Hash { - free(): void; -/** -* Construct zeroed hash -* @returns {Hash} -*/ - static zeroed(): Hash; -/** -* Hash the given bytes. -* -* # Errors -* If failed to parse bytes input -* @param {Binary} payload -*/ - constructor(payload: Binary); -/** -* @returns {Uint8Array} -*/ - bytes(): Uint8Array; -/** -* @returns {string} -*/ - bytes_hex(): string; -} -/** -* Pair of Public and Private keys. -*/ -export class KeyPair { - free(): void; -/** -* # Errors -* Fails if deserialization fails -* @param {KeyPairJson} value -* @returns {KeyPair} -*/ - static from_json(value: KeyPairJson): KeyPair; -/** -* Generate a random key pair -* -* # Errors -* If passed algorithm is not valid. -* @param {Algorithm | undefined} [algorithm] -* @returns {KeyPair} -*/ - static random(algorithm?: Algorithm): KeyPair; -/** -* Construct a key pair from its components -* -* # Errors -* If public and private keys don’t match, i.e. if they don’t make a pair -* @param {PublicKey} public_key -* @param {PrivateKey} private_key -* @returns {KeyPair} -*/ - static from_parts(public_key: PublicKey, private_key: PrivateKey): KeyPair; -/** -* @param {Binary} seed -* @param {Algorithm | undefined} [algorithm] -* @returns {KeyPair} -*/ - static derive_from_seed(seed: Binary, algorithm?: Algorithm): KeyPair; -/** -* @param {PrivateKey} key -* @returns {KeyPair} -*/ - static derive_from_private_key(key: PrivateKey): KeyPair; -/** -* @returns {PublicKey} -*/ - public_key(): PublicKey; -/** -* @returns {PrivateKey} -*/ - private_key(): PrivateKey; -/** -* # Errors -* Fails if serialisation fails -* @returns {KeyPairJson} -*/ - to_json(): KeyPairJson; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Private Key used in signatures. -*/ -export class PrivateKey { - free(): void; -/** -* # Errors -* Fails if serialization fails -* @param {PrivateKeyJson} value -* @returns {PrivateKey} -*/ - static from_json(value: PrivateKeyJson): PrivateKey; -/** -* # Errors -* Fails if parsing of digest function or payload byte input fails -* @param {Algorithm} algorithm -* @param {Binary} payload -* @returns {PrivateKey} -*/ - static from_bytes(algorithm: Algorithm, payload: Binary): PrivateKey; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -* # Errors -* Fails is serialisation fails -* @returns {PrivateKeyJson} -*/ - to_json(): PrivateKeyJson; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Public Key used in signatures. -*/ -export class PublicKey { - free(): void; -/** -* # Errors -* Fails if multihash parsing fails -* @param {string} multihash -* @returns {PublicKey} -*/ - static from_multihash_hex(multihash: string): PublicKey; -/** -* # Errors -* Fails if parsing of algorithm or payload byte input fails -* @param {Algorithm} algorithm -* @param {Binary} payload -* @returns {PublicKey} -*/ - static from_bytes(algorithm: Algorithm, payload: Binary): PublicKey; -/** -* @param {PrivateKey} key -* @returns {PublicKey} -*/ - static from_private_key(key: PrivateKey): PublicKey; -/** -* @returns {string} -*/ - to_multihash_hex(): string; -/** -* Equivalent to [`Self::to_multihash_hex`] -* @returns {string} -*/ - to_json(): string; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Represents the signature of the data -*/ -export class Signature { - free(): void; -/** -* # Errors -* If failed to deserialise JSON -* @param {SignatureJson} value -* @returns {Signature} -*/ - static from_json(value: SignatureJson): Signature; -/** -* Construct the signature from raw components received from elsewhere -* -* # Errors -* - Invalid bytes input -* @param {PublicKey} public_key -* @param {Binary} payload -* @returns {Signature} -*/ - static from_bytes(public_key: PublicKey, payload: Binary): Signature; -/** -* Creates new signature by signing the payload via the key pair's private key. -* -* # Errors -* If parsing bytes input fails -* @param {KeyPair} key_pair -* @param {Binary} payload -*/ - constructor(key_pair: KeyPair, payload: Binary); -/** -* Verify `payload` using signed data and the signature's public key -* -* # Errors -* - If parsing of bytes input fails -* - If failed to construct verify error -* @param {Binary} payload -* @returns {VerifyResult} -*/ - verify(payload: Binary): VerifyResult; -/** -* @returns {PublicKey} -*/ - public_key(): PublicKey; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -* # Errors -* If conversion fails -* @returns {SignatureJson} -*/ - to_json(): SignatureJson; -} diff --git a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto.js b/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto.js deleted file mode 100644 index 9b213d11..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto.js +++ /dev/null @@ -1,6 +0,0 @@ -import * as wasm from "./iroha_crypto_bg.wasm"; -import { __wbg_set_wasm } from "./iroha_crypto_bg.js"; -__wbg_set_wasm(wasm); -export * from "./iroha_crypto_bg.js"; - -wasm.__wbindgen_start(); diff --git a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.js b/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.js deleted file mode 100644 index a97955c5..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.js +++ /dev/null @@ -1,1351 +0,0 @@ -let wasm; -export function __wbg_set_wasm(val) { - wasm = val; -} - - -const lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder; - -let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - -cachedTextDecoder.decode(); - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -let heap_next = heap.length; - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -function getObject(idx) { return heap[idx]; } - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedFloat64Memory0 = null; - -function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -let WASM_VECTOR_LEN = 0; - -const lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder; - -let cachedTextEncoder = new lTextEncoder('utf-8'); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -let cachedBigInt64Memory0 = null; - -function getBigInt64Memory0() { - if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { - cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); - } - return cachedBigInt64Memory0; -} - -function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; - } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; -} -/** -* @returns {Algorithm} -*/ -export function algorithm_default() { - const ret = wasm.algorithm_default(); - return takeObject(ret); -} - -function getArrayU8FromWasm0(ptr, len) { - ptr = ptr >>> 0; - return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); -} - -function _assertClass(instance, klass) { - if (!(instance instanceof klass)) { - throw new Error(`expected instance of ${klass.name}`); - } - return instance.ptr; -} -/** -*/ -export function main_js() { - wasm.main_js(); -} - -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } -} - -const HashFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_hash_free(ptr >>> 0)); -/** -*/ -export class Hash { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(Hash.prototype); - obj.__wbg_ptr = ptr; - HashFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - HashFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_hash_free(ptr); - } - /** - * Construct zeroed hash - * @returns {Hash} - */ - static zeroed() { - const ret = wasm.hash_zeroed(); - return Hash.__wrap(ret); - } - /** - * Hash the given bytes. - * - * # Errors - * If failed to parse bytes input - * @param {Binary} payload - */ - constructor(payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_new(retptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - this.__wbg_ptr = r0 >>> 0; - return this; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Uint8Array} - */ - bytes() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_bytes(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - bytes_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_bytes_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } -} - -const KeyPairFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_keypair_free(ptr >>> 0)); -/** -* Pair of Public and Private keys. -*/ -export class KeyPair { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(KeyPair.prototype); - obj.__wbg_ptr = ptr; - KeyPairFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - KeyPairFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_keypair_free(ptr); - } - /** - * # Errors - * Fails if deserialization fails - * @param {KeyPairJson} value - * @returns {KeyPair} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Generate a random key pair - * - * # Errors - * If passed algorithm is not valid. - * @param {Algorithm | undefined} [algorithm] - * @returns {KeyPair} - */ - static random(algorithm) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_random(retptr, isLikeNone(algorithm) ? 0 : addHeapObject(algorithm)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Construct a key pair from its components - * - * # Errors - * If public and private keys don’t match, i.e. if they don’t make a pair - * @param {PublicKey} public_key - * @param {PrivateKey} private_key - * @returns {KeyPair} - */ - static from_parts(public_key, private_key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(public_key, PublicKey); - _assertClass(private_key, PrivateKey); - wasm.keypair_from_parts(retptr, public_key.__wbg_ptr, private_key.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {Binary} seed - * @param {Algorithm | undefined} [algorithm] - * @returns {KeyPair} - */ - static derive_from_seed(seed, algorithm) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_derive_from_seed(retptr, addHeapObject(seed), isLikeNone(algorithm) ? 0 : addHeapObject(algorithm)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {PrivateKey} key - * @returns {KeyPair} - */ - static derive_from_private_key(key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(key, PrivateKey); - wasm.keypair_derive_from_private_key(retptr, key.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.keypair_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {PublicKey} - */ - public_key() { - const ret = wasm.keypair_public_key(this.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {PrivateKey} - */ - private_key() { - const ret = wasm.keypair_private_key(this.__wbg_ptr); - return PrivateKey.__wrap(ret); - } - /** - * # Errors - * Fails if serialisation fails - * @returns {KeyPairJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} - -const PrivateKeyFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_privatekey_free(ptr >>> 0)); -/** -* Private Key used in signatures. -*/ -export class PrivateKey { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(PrivateKey.prototype); - obj.__wbg_ptr = ptr; - PrivateKeyFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - PrivateKeyFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_privatekey_free(ptr); - } - /** - * # Errors - * Fails if serialization fails - * @param {PrivateKeyJson} value - * @returns {PrivateKey} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PrivateKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * # Errors - * Fails if parsing of digest function or payload byte input fails - * @param {Algorithm} algorithm - * @param {Binary} payload - * @returns {PrivateKey} - */ - static from_bytes(algorithm, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_from_bytes(retptr, addHeapObject(algorithm), addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PrivateKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.privatekey_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * # Errors - * Fails is serialisation fails - * @returns {PrivateKeyJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} - -const PublicKeyFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_publickey_free(ptr >>> 0)); -/** -* Public Key used in signatures. -*/ -export class PublicKey { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(PublicKey.prototype); - obj.__wbg_ptr = ptr; - PublicKeyFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - PublicKeyFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_publickey_free(ptr); - } - /** - * # Errors - * Fails if multihash parsing fails - * @param {string} multihash - * @returns {PublicKey} - */ - static from_multihash_hex(multihash) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0(multihash, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - wasm.publickey_from_multihash_hex(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PublicKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * # Errors - * Fails if parsing of algorithm or payload byte input fails - * @param {Algorithm} algorithm - * @param {Binary} payload - * @returns {PublicKey} - */ - static from_bytes(algorithm, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_from_bytes(retptr, addHeapObject(algorithm), addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PublicKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {PrivateKey} key - * @returns {PublicKey} - */ - static from_private_key(key) { - _assertClass(key, PrivateKey); - const ret = wasm.publickey_from_private_key(key.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {string} - */ - to_multihash_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_to_multihash_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * Equivalent to [`Self::to_multihash_hex`] - * @returns {string} - */ - to_json() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.privatekey_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } -} - -const SignatureFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_signature_free(ptr >>> 0)); -/** -* Represents the signature of the data -*/ -export class Signature { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(Signature.prototype); - obj.__wbg_ptr = ptr; - SignatureFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - SignatureFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_signature_free(ptr); - } - /** - * # Errors - * If failed to deserialise JSON - * @param {SignatureJson} value - * @returns {Signature} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return Signature.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Construct the signature from raw components received from elsewhere - * - * # Errors - * - Invalid bytes input - * @param {PublicKey} public_key - * @param {Binary} payload - * @returns {Signature} - */ - static from_bytes(public_key, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(public_key, PublicKey); - wasm.signature_from_bytes(retptr, public_key.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return Signature.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Creates new signature by signing the payload via the key pair's private key. - * - * # Errors - * If parsing bytes input fails - * @param {KeyPair} key_pair - * @param {Binary} payload - */ - constructor(key_pair, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(key_pair, KeyPair); - wasm.signature_new(retptr, key_pair.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - this.__wbg_ptr = r0 >>> 0; - return this; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Verify `payload` using signed data and the signature's public key - * - * # Errors - * - If parsing of bytes input fails - * - If failed to construct verify error - * @param {Binary} payload - * @returns {VerifyResult} - */ - verify(payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_verify(retptr, this.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {PublicKey} - */ - public_key() { - const ret = wasm.keypair_public_key(this.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * # Errors - * If conversion fails - * @returns {SignatureJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} - -export function __wbindgen_error_new(arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); -}; - -export function __wbindgen_string_new(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); -}; - -export function __wbindgen_object_drop_ref(arg0) { - takeObject(arg0); -}; - -export function __wbindgen_is_object(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; -}; - -export function __wbindgen_boolean_get(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; - return ret; -}; - -export function __wbindgen_is_bigint(arg0) { - const ret = typeof(getObject(arg0)) === 'bigint'; - return ret; -}; - -export function __wbindgen_bigint_from_i64(arg0) { - const ret = arg0; - return addHeapObject(ret); -}; - -export function __wbindgen_jsval_eq(arg0, arg1) { - const ret = getObject(arg0) === getObject(arg1); - return ret; -}; - -export function __wbindgen_bigint_from_u64(arg0) { - const ret = BigInt.asUintN(64, arg0); - return addHeapObject(ret); -}; - -export function __wbindgen_number_get(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); -}; - -export function __wbindgen_string_get(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -export function __wbindgen_in(arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; -}; - -export function __wbindgen_is_undefined(arg0) { - const ret = getObject(arg0) === undefined; - return ret; -}; - -export function __wbindgen_is_string(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; -}; - -export function __wbindgen_as_number(arg0) { - const ret = +getObject(arg0); - return ret; -}; - -export function __wbindgen_object_clone_ref(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); -}; - -export function __wbg_crypto_d05b68a3572bb8ca(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); -}; - -export function __wbg_process_b02b3570280d0366(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); -}; - -export function __wbg_versions_c1cb42213cedf0f5(arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); -}; - -export function __wbg_node_43b1089f407e4ec2(arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); -}; - -export function __wbg_msCrypto_10fc94afee92bd76(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); -}; - -export function __wbg_require_9a7e0f667ead4995() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); -}, arguments) }; - -export function __wbindgen_is_function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; -}; - -export function __wbg_randomFillSync_b70ccbdf4926a99d() { return handleError(function (arg0, arg1) { - getObject(arg0).randomFillSync(takeObject(arg1)); -}, arguments) }; - -export function __wbg_getRandomValues_7e42b4fb8779dc6d() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); -}, arguments) }; - -export function __wbindgen_jsval_loose_eq(arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; -}; - -export function __wbg_String_389b54bd9d25375f(arg0, arg1) { - const ret = String(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -export function __wbg_getwithrefkey_4a92a5eca60879b9(arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); -}; - -export function __wbg_set_9182712abebf82ef(arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); -}; - -export function __wbg_get_0ee8ea3c7c984c45(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); -}; - -export function __wbg_length_161c0d89c6535c1d(arg0) { - const ret = getObject(arg0).length; - return ret; -}; - -export function __wbg_newnoargs_cfecb3965268594c(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); -}; - -export function __wbg_next_586204376d2ed373(arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); -}; - -export function __wbg_next_b2d3366343a208b3() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_done_90b14d6f6eacc42f(arg0) { - const ret = getObject(arg0).done; - return ret; -}; - -export function __wbg_value_3158be908c80a75e(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); -}; - -export function __wbg_iterator_40027cdd598da26b() { - const ret = Symbol.iterator; - return addHeapObject(ret); -}; - -export function __wbg_get_3fddfed2c83f434c() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_call_3f093dd26d5569f8() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_new_632630b5cec17f21() { - const ret = new Object(); - return addHeapObject(ret); -}; - -export function __wbg_self_05040bd9523805b9() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_window_adc720039f2cb14f() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_globalThis_622105db80c1457d() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_global_f56b013ed9bcf359() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_isArray_e783c41d0dd19b44(arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; -}; - -export function __wbg_instanceof_ArrayBuffer_9221fa854ffb71b5(arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch (_) { - result = false; - } - const ret = result; - return ret; -}; - -export function __wbg_call_67f2111acd2dfdb6() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); -}, arguments) }; - -export function __wbg_isSafeInteger_a23a66ee7c41b273(arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; -}; - -export function __wbg_entries_488960b196cfb6a5(arg0) { - const ret = Object.entries(getObject(arg0)); - return addHeapObject(ret); -}; - -export function __wbg_buffer_b914fb8b50ebbc3e(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); -}; - -export function __wbg_newwithbyteoffsetandlength_0de9ee56e9f6ee6e(arg0, arg1, arg2) { - const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); -}; - -export function __wbg_new_b1f2d6842d615181(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); -}; - -export function __wbg_set_7d988c98e6ced92d(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); -}; - -export function __wbg_length_21c4b0ae73cba59d(arg0) { - const ret = getObject(arg0).length; - return ret; -}; - -export function __wbg_instanceof_Uint8Array_c299a4ee232e76ba(arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch (_) { - result = false; - } - const ret = result; - return ret; -}; - -export function __wbg_newwithlength_0d03cef43b68a530(arg0) { - const ret = new Uint8Array(arg0 >>> 0); - return addHeapObject(ret); -}; - -export function __wbg_subarray_adc418253d76e2f1(arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); -}; - -export function __wbg_new_abda76e883ba8a5f() { - const ret = new Error(); - return addHeapObject(ret); -}; - -export function __wbg_stack_658279fe44541cf6(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -export function __wbg_error_f851667af71bcfc6(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } -}; - -export function __wbindgen_bigint_get_as_i64(arg0, arg1) { - const v = getObject(arg1); - const ret = typeof(v) === 'bigint' ? v : undefined; - getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); -}; - -export function __wbindgen_debug_string(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -export function __wbindgen_throw(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); -}; - -export function __wbindgen_memory() { - const ret = wasm.memory; - return addHeapObject(ret); -}; - diff --git a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.wasm b/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.wasm deleted file mode 100644 index 8fc6b29f..00000000 Binary files a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.wasm and /dev/null differ diff --git a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.wasm.d.ts b/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.wasm.d.ts deleted file mode 100644 index 588eedb5..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-bundler/iroha_crypto_bg.wasm.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -export const memory: WebAssembly.Memory; -export function algorithm_default(): number; -export function __wbg_hash_free(a: number): void; -export function hash_zeroed(): number; -export function hash_new(a: number, b: number): void; -export function hash_bytes(a: number, b: number): void; -export function hash_bytes_hex(a: number, b: number): void; -export function __wbg_publickey_free(a: number): void; -export function publickey_from_multihash_hex(a: number, b: number, c: number): void; -export function publickey_from_bytes(a: number, b: number, c: number): void; -export function publickey_from_private_key(a: number): number; -export function publickey_to_multihash_hex(a: number, b: number): void; -export function publickey_to_json(a: number, b: number): void; -export function publickey_payload(a: number, b: number): void; -export function publickey_payload_hex(a: number, b: number): void; -export function __wbg_privatekey_free(a: number): void; -export function privatekey_from_json(a: number, b: number): void; -export function privatekey_from_bytes(a: number, b: number, c: number): void; -export function privatekey_algorithm(a: number): number; -export function privatekey_payload(a: number, b: number): void; -export function privatekey_payload_hex(a: number, b: number): void; -export function privatekey_to_json(a: number, b: number): void; -export function __wbg_keypair_free(a: number): void; -export function keypair_from_json(a: number, b: number): void; -export function keypair_random(a: number, b: number): void; -export function keypair_from_parts(a: number, b: number, c: number): void; -export function keypair_derive_from_seed(a: number, b: number, c: number): void; -export function keypair_derive_from_private_key(a: number, b: number): void; -export function keypair_algorithm(a: number): number; -export function keypair_public_key(a: number): number; -export function keypair_private_key(a: number): number; -export function keypair_to_json(a: number, b: number): void; -export function __wbg_signature_free(a: number): void; -export function signature_from_json(a: number, b: number): void; -export function signature_from_bytes(a: number, b: number, c: number): void; -export function signature_new(a: number, b: number, c: number): void; -export function signature_verify(a: number, b: number, c: number): void; -export function signature_payload(a: number, b: number): void; -export function signature_payload_hex(a: number, b: number): void; -export function signature_to_json(a: number, b: number): void; -export function publickey_algorithm(a: number): number; -export function signature_public_key(a: number): number; -export function main_js(): void; -export function __wbindgen_malloc(a: number, b: number): number; -export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; -export function __wbindgen_add_to_stack_pointer(a: number): number; -export function __wbindgen_free(a: number, b: number, c: number): void; -export function __wbindgen_exn_store(a: number): void; -export function __wbindgen_start(): void; diff --git a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto.d.ts b/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto.d.ts deleted file mode 100644 index 7ee7ec4c..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto.d.ts +++ /dev/null @@ -1,276 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** -* @returns {Algorithm} -*/ -export function algorithm_default(): Algorithm; -/** -*/ -export function main_js(): void; - -export type Algorithm = - | 'ed25519' - | 'secp256k1' - | 'bls_normal' - | 'bls_small' - - - -export interface PrivateKeyJson { - algorithm: string - /** Hex-encoded bytes */ - payload: string -} - -export interface KeyPairJson { - public_key: string - private_key: PrivateKeyJson -} - -export interface SignatureJson { - public_key: string - /** Hex-encoded bytes */ - payload: string -} - -export type VerifyResult = - | { t: 'ok' } - | { t: 'err', error: string } - - - -export type Bytes = - | { t: 'array', c: Uint8Array } - | { t: 'hex', c: string } - - -/** -*/ -export class Hash { - free(): void; -/** -* Construct zeroed hash -* @returns {Hash} -*/ - static zeroed(): Hash; -/** -* Hash the given bytes. -* -* # Errors -* If failed to parse bytes input -* @param {Binary} payload -*/ - constructor(payload: Binary); -/** -* @returns {Uint8Array} -*/ - bytes(): Uint8Array; -/** -* @returns {string} -*/ - bytes_hex(): string; -} -/** -* Pair of Public and Private keys. -*/ -export class KeyPair { - free(): void; -/** -* # Errors -* Fails if deserialization fails -* @param {KeyPairJson} value -* @returns {KeyPair} -*/ - static from_json(value: KeyPairJson): KeyPair; -/** -* Generate a random key pair -* -* # Errors -* If passed algorithm is not valid. -* @param {Algorithm | undefined} [algorithm] -* @returns {KeyPair} -*/ - static random(algorithm?: Algorithm): KeyPair; -/** -* Construct a key pair from its components -* -* # Errors -* If public and private keys don’t match, i.e. if they don’t make a pair -* @param {PublicKey} public_key -* @param {PrivateKey} private_key -* @returns {KeyPair} -*/ - static from_parts(public_key: PublicKey, private_key: PrivateKey): KeyPair; -/** -* @param {Binary} seed -* @param {Algorithm | undefined} [algorithm] -* @returns {KeyPair} -*/ - static derive_from_seed(seed: Binary, algorithm?: Algorithm): KeyPair; -/** -* @param {PrivateKey} key -* @returns {KeyPair} -*/ - static derive_from_private_key(key: PrivateKey): KeyPair; -/** -* @returns {PublicKey} -*/ - public_key(): PublicKey; -/** -* @returns {PrivateKey} -*/ - private_key(): PrivateKey; -/** -* # Errors -* Fails if serialisation fails -* @returns {KeyPairJson} -*/ - to_json(): KeyPairJson; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Private Key used in signatures. -*/ -export class PrivateKey { - free(): void; -/** -* # Errors -* Fails if serialization fails -* @param {PrivateKeyJson} value -* @returns {PrivateKey} -*/ - static from_json(value: PrivateKeyJson): PrivateKey; -/** -* # Errors -* Fails if parsing of digest function or payload byte input fails -* @param {Algorithm} algorithm -* @param {Binary} payload -* @returns {PrivateKey} -*/ - static from_bytes(algorithm: Algorithm, payload: Binary): PrivateKey; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -* # Errors -* Fails is serialisation fails -* @returns {PrivateKeyJson} -*/ - to_json(): PrivateKeyJson; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Public Key used in signatures. -*/ -export class PublicKey { - free(): void; -/** -* # Errors -* Fails if multihash parsing fails -* @param {string} multihash -* @returns {PublicKey} -*/ - static from_multihash_hex(multihash: string): PublicKey; -/** -* # Errors -* Fails if parsing of algorithm or payload byte input fails -* @param {Algorithm} algorithm -* @param {Binary} payload -* @returns {PublicKey} -*/ - static from_bytes(algorithm: Algorithm, payload: Binary): PublicKey; -/** -* @param {PrivateKey} key -* @returns {PublicKey} -*/ - static from_private_key(key: PrivateKey): PublicKey; -/** -* @returns {string} -*/ - to_multihash_hex(): string; -/** -* Equivalent to [`Self::to_multihash_hex`] -* @returns {string} -*/ - to_json(): string; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Represents the signature of the data -*/ -export class Signature { - free(): void; -/** -* # Errors -* If failed to deserialise JSON -* @param {SignatureJson} value -* @returns {Signature} -*/ - static from_json(value: SignatureJson): Signature; -/** -* Construct the signature from raw components received from elsewhere -* -* # Errors -* - Invalid bytes input -* @param {PublicKey} public_key -* @param {Binary} payload -* @returns {Signature} -*/ - static from_bytes(public_key: PublicKey, payload: Binary): Signature; -/** -* Creates new signature by signing the payload via the key pair's private key. -* -* # Errors -* If parsing bytes input fails -* @param {KeyPair} key_pair -* @param {Binary} payload -*/ - constructor(key_pair: KeyPair, payload: Binary); -/** -* Verify `payload` using signed data and the signature's public key -* -* # Errors -* - If parsing of bytes input fails -* - If failed to construct verify error -* @param {Binary} payload -* @returns {VerifyResult} -*/ - verify(payload: Binary): VerifyResult; -/** -* @returns {PublicKey} -*/ - public_key(): PublicKey; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -* # Errors -* If conversion fails -* @returns {SignatureJson} -*/ - to_json(): SignatureJson; -} diff --git a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto.js b/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto.js deleted file mode 100644 index b9352b68..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto.js +++ /dev/null @@ -1,1361 +0,0 @@ -let imports = {}; -imports['__wbindgen_placeholder__'] = module.exports; -let wasm; -const { TextDecoder, TextEncoder } = require(`util`); - -let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - -cachedTextDecoder.decode(); - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -let heap_next = heap.length; - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -function getObject(idx) { return heap[idx]; } - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedFloat64Memory0 = null; - -function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -let WASM_VECTOR_LEN = 0; - -let cachedTextEncoder = new TextEncoder('utf-8'); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -let cachedBigInt64Memory0 = null; - -function getBigInt64Memory0() { - if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { - cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); - } - return cachedBigInt64Memory0; -} - -function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; - } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; -} -/** -* @returns {Algorithm} -*/ -module.exports.algorithm_default = function() { - const ret = wasm.algorithm_default(); - return takeObject(ret); -}; - -function getArrayU8FromWasm0(ptr, len) { - ptr = ptr >>> 0; - return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); -} - -function _assertClass(instance, klass) { - if (!(instance instanceof klass)) { - throw new Error(`expected instance of ${klass.name}`); - } - return instance.ptr; -} -/** -*/ -module.exports.main_js = function() { - wasm.main_js(); -}; - -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } -} - -const HashFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_hash_free(ptr >>> 0)); -/** -*/ -class Hash { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(Hash.prototype); - obj.__wbg_ptr = ptr; - HashFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - HashFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_hash_free(ptr); - } - /** - * Construct zeroed hash - * @returns {Hash} - */ - static zeroed() { - const ret = wasm.hash_zeroed(); - return Hash.__wrap(ret); - } - /** - * Hash the given bytes. - * - * # Errors - * If failed to parse bytes input - * @param {Binary} payload - */ - constructor(payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_new(retptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - this.__wbg_ptr = r0 >>> 0; - return this; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Uint8Array} - */ - bytes() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_bytes(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - bytes_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_bytes_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } -} -module.exports.Hash = Hash; - -const KeyPairFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_keypair_free(ptr >>> 0)); -/** -* Pair of Public and Private keys. -*/ -class KeyPair { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(KeyPair.prototype); - obj.__wbg_ptr = ptr; - KeyPairFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - KeyPairFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_keypair_free(ptr); - } - /** - * # Errors - * Fails if deserialization fails - * @param {KeyPairJson} value - * @returns {KeyPair} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Generate a random key pair - * - * # Errors - * If passed algorithm is not valid. - * @param {Algorithm | undefined} [algorithm] - * @returns {KeyPair} - */ - static random(algorithm) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_random(retptr, isLikeNone(algorithm) ? 0 : addHeapObject(algorithm)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Construct a key pair from its components - * - * # Errors - * If public and private keys don’t match, i.e. if they don’t make a pair - * @param {PublicKey} public_key - * @param {PrivateKey} private_key - * @returns {KeyPair} - */ - static from_parts(public_key, private_key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(public_key, PublicKey); - _assertClass(private_key, PrivateKey); - wasm.keypair_from_parts(retptr, public_key.__wbg_ptr, private_key.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {Binary} seed - * @param {Algorithm | undefined} [algorithm] - * @returns {KeyPair} - */ - static derive_from_seed(seed, algorithm) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_derive_from_seed(retptr, addHeapObject(seed), isLikeNone(algorithm) ? 0 : addHeapObject(algorithm)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {PrivateKey} key - * @returns {KeyPair} - */ - static derive_from_private_key(key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(key, PrivateKey); - wasm.keypair_derive_from_private_key(retptr, key.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.keypair_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {PublicKey} - */ - public_key() { - const ret = wasm.keypair_public_key(this.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {PrivateKey} - */ - private_key() { - const ret = wasm.keypair_private_key(this.__wbg_ptr); - return PrivateKey.__wrap(ret); - } - /** - * # Errors - * Fails if serialisation fails - * @returns {KeyPairJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} -module.exports.KeyPair = KeyPair; - -const PrivateKeyFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_privatekey_free(ptr >>> 0)); -/** -* Private Key used in signatures. -*/ -class PrivateKey { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(PrivateKey.prototype); - obj.__wbg_ptr = ptr; - PrivateKeyFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - PrivateKeyFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_privatekey_free(ptr); - } - /** - * # Errors - * Fails if serialization fails - * @param {PrivateKeyJson} value - * @returns {PrivateKey} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PrivateKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * # Errors - * Fails if parsing of digest function or payload byte input fails - * @param {Algorithm} algorithm - * @param {Binary} payload - * @returns {PrivateKey} - */ - static from_bytes(algorithm, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_from_bytes(retptr, addHeapObject(algorithm), addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PrivateKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.privatekey_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * # Errors - * Fails is serialisation fails - * @returns {PrivateKeyJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} -module.exports.PrivateKey = PrivateKey; - -const PublicKeyFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_publickey_free(ptr >>> 0)); -/** -* Public Key used in signatures. -*/ -class PublicKey { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(PublicKey.prototype); - obj.__wbg_ptr = ptr; - PublicKeyFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - PublicKeyFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_publickey_free(ptr); - } - /** - * # Errors - * Fails if multihash parsing fails - * @param {string} multihash - * @returns {PublicKey} - */ - static from_multihash_hex(multihash) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0(multihash, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - wasm.publickey_from_multihash_hex(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PublicKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * # Errors - * Fails if parsing of algorithm or payload byte input fails - * @param {Algorithm} algorithm - * @param {Binary} payload - * @returns {PublicKey} - */ - static from_bytes(algorithm, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_from_bytes(retptr, addHeapObject(algorithm), addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PublicKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {PrivateKey} key - * @returns {PublicKey} - */ - static from_private_key(key) { - _assertClass(key, PrivateKey); - const ret = wasm.publickey_from_private_key(key.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {string} - */ - to_multihash_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_to_multihash_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * Equivalent to [`Self::to_multihash_hex`] - * @returns {string} - */ - to_json() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.privatekey_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } -} -module.exports.PublicKey = PublicKey; - -const SignatureFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_signature_free(ptr >>> 0)); -/** -* Represents the signature of the data -*/ -class Signature { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(Signature.prototype); - obj.__wbg_ptr = ptr; - SignatureFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - SignatureFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_signature_free(ptr); - } - /** - * # Errors - * If failed to deserialise JSON - * @param {SignatureJson} value - * @returns {Signature} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return Signature.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Construct the signature from raw components received from elsewhere - * - * # Errors - * - Invalid bytes input - * @param {PublicKey} public_key - * @param {Binary} payload - * @returns {Signature} - */ - static from_bytes(public_key, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(public_key, PublicKey); - wasm.signature_from_bytes(retptr, public_key.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return Signature.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Creates new signature by signing the payload via the key pair's private key. - * - * # Errors - * If parsing bytes input fails - * @param {KeyPair} key_pair - * @param {Binary} payload - */ - constructor(key_pair, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(key_pair, KeyPair); - wasm.signature_new(retptr, key_pair.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - this.__wbg_ptr = r0 >>> 0; - return this; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Verify `payload` using signed data and the signature's public key - * - * # Errors - * - If parsing of bytes input fails - * - If failed to construct verify error - * @param {Binary} payload - * @returns {VerifyResult} - */ - verify(payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_verify(retptr, this.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {PublicKey} - */ - public_key() { - const ret = wasm.keypair_public_key(this.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * # Errors - * If conversion fails - * @returns {SignatureJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} -module.exports.Signature = Signature; - -module.exports.__wbindgen_error_new = function(arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); -}; - -module.exports.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); -}; - -module.exports.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); -}; - -module.exports.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; -}; - -module.exports.__wbindgen_boolean_get = function(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; - return ret; -}; - -module.exports.__wbindgen_is_bigint = function(arg0) { - const ret = typeof(getObject(arg0)) === 'bigint'; - return ret; -}; - -module.exports.__wbindgen_bigint_from_i64 = function(arg0) { - const ret = arg0; - return addHeapObject(ret); -}; - -module.exports.__wbindgen_jsval_eq = function(arg0, arg1) { - const ret = getObject(arg0) === getObject(arg1); - return ret; -}; - -module.exports.__wbindgen_bigint_from_u64 = function(arg0) { - const ret = BigInt.asUintN(64, arg0); - return addHeapObject(ret); -}; - -module.exports.__wbindgen_number_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); -}; - -module.exports.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -module.exports.__wbindgen_in = function(arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; -}; - -module.exports.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; -}; - -module.exports.__wbindgen_is_string = function(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; -}; - -module.exports.__wbindgen_as_number = function(arg0) { - const ret = +getObject(arg0); - return ret; -}; - -module.exports.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); -}; - -module.exports.__wbg_crypto_d05b68a3572bb8ca = function(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); -}; - -module.exports.__wbg_process_b02b3570280d0366 = function(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); -}; - -module.exports.__wbg_versions_c1cb42213cedf0f5 = function(arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); -}; - -module.exports.__wbg_node_43b1089f407e4ec2 = function(arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); -}; - -module.exports.__wbg_msCrypto_10fc94afee92bd76 = function(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); -}; - -module.exports.__wbg_require_9a7e0f667ead4995 = function() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; -}; - -module.exports.__wbg_randomFillSync_b70ccbdf4926a99d = function() { return handleError(function (arg0, arg1) { - getObject(arg0).randomFillSync(takeObject(arg1)); -}, arguments) }; - -module.exports.__wbg_getRandomValues_7e42b4fb8779dc6d = function() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); -}, arguments) }; - -module.exports.__wbindgen_jsval_loose_eq = function(arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; -}; - -module.exports.__wbg_String_389b54bd9d25375f = function(arg0, arg1) { - const ret = String(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -module.exports.__wbg_getwithrefkey_4a92a5eca60879b9 = function(arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); -}; - -module.exports.__wbg_set_9182712abebf82ef = function(arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); -}; - -module.exports.__wbg_get_0ee8ea3c7c984c45 = function(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); -}; - -module.exports.__wbg_length_161c0d89c6535c1d = function(arg0) { - const ret = getObject(arg0).length; - return ret; -}; - -module.exports.__wbg_newnoargs_cfecb3965268594c = function(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); -}; - -module.exports.__wbg_next_586204376d2ed373 = function(arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); -}; - -module.exports.__wbg_next_b2d3366343a208b3 = function() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_done_90b14d6f6eacc42f = function(arg0) { - const ret = getObject(arg0).done; - return ret; -}; - -module.exports.__wbg_value_3158be908c80a75e = function(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); -}; - -module.exports.__wbg_iterator_40027cdd598da26b = function() { - const ret = Symbol.iterator; - return addHeapObject(ret); -}; - -module.exports.__wbg_get_3fddfed2c83f434c = function() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_call_3f093dd26d5569f8 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_new_632630b5cec17f21 = function() { - const ret = new Object(); - return addHeapObject(ret); -}; - -module.exports.__wbg_self_05040bd9523805b9 = function() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_window_adc720039f2cb14f = function() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_globalThis_622105db80c1457d = function() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_global_f56b013ed9bcf359 = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_isArray_e783c41d0dd19b44 = function(arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; -}; - -module.exports.__wbg_instanceof_ArrayBuffer_9221fa854ffb71b5 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch (_) { - result = false; - } - const ret = result; - return ret; -}; - -module.exports.__wbg_call_67f2111acd2dfdb6 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_isSafeInteger_a23a66ee7c41b273 = function(arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; -}; - -module.exports.__wbg_entries_488960b196cfb6a5 = function(arg0) { - const ret = Object.entries(getObject(arg0)); - return addHeapObject(ret); -}; - -module.exports.__wbg_buffer_b914fb8b50ebbc3e = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); -}; - -module.exports.__wbg_newwithbyteoffsetandlength_0de9ee56e9f6ee6e = function(arg0, arg1, arg2) { - const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); -}; - -module.exports.__wbg_new_b1f2d6842d615181 = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); -}; - -module.exports.__wbg_set_7d988c98e6ced92d = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); -}; - -module.exports.__wbg_length_21c4b0ae73cba59d = function(arg0) { - const ret = getObject(arg0).length; - return ret; -}; - -module.exports.__wbg_instanceof_Uint8Array_c299a4ee232e76ba = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch (_) { - result = false; - } - const ret = result; - return ret; -}; - -module.exports.__wbg_newwithlength_0d03cef43b68a530 = function(arg0) { - const ret = new Uint8Array(arg0 >>> 0); - return addHeapObject(ret); -}; - -module.exports.__wbg_subarray_adc418253d76e2f1 = function(arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); -}; - -module.exports.__wbg_new_abda76e883ba8a5f = function() { - const ret = new Error(); - return addHeapObject(ret); -}; - -module.exports.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -module.exports.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } -}; - -module.exports.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { - const v = getObject(arg1); - const ret = typeof(v) === 'bigint' ? v : undefined; - getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); -}; - -module.exports.__wbindgen_debug_string = function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -module.exports.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); -}; - -module.exports.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); -}; - -const path = require('path').join(__dirname, 'iroha_crypto_bg.wasm'); -const bytes = require('fs').readFileSync(path); - -const wasmModule = new WebAssembly.Module(bytes); -const wasmInstance = new WebAssembly.Instance(wasmModule, imports); -wasm = wasmInstance.exports; -module.exports.__wasm = wasm; - -wasm.__wbindgen_start(); - diff --git a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto_bg.wasm b/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto_bg.wasm deleted file mode 100644 index 47a47e0f..00000000 Binary files a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto_bg.wasm and /dev/null differ diff --git a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto_bg.wasm.d.ts b/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto_bg.wasm.d.ts deleted file mode 100644 index 588eedb5..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto_bg.wasm.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -export const memory: WebAssembly.Memory; -export function algorithm_default(): number; -export function __wbg_hash_free(a: number): void; -export function hash_zeroed(): number; -export function hash_new(a: number, b: number): void; -export function hash_bytes(a: number, b: number): void; -export function hash_bytes_hex(a: number, b: number): void; -export function __wbg_publickey_free(a: number): void; -export function publickey_from_multihash_hex(a: number, b: number, c: number): void; -export function publickey_from_bytes(a: number, b: number, c: number): void; -export function publickey_from_private_key(a: number): number; -export function publickey_to_multihash_hex(a: number, b: number): void; -export function publickey_to_json(a: number, b: number): void; -export function publickey_payload(a: number, b: number): void; -export function publickey_payload_hex(a: number, b: number): void; -export function __wbg_privatekey_free(a: number): void; -export function privatekey_from_json(a: number, b: number): void; -export function privatekey_from_bytes(a: number, b: number, c: number): void; -export function privatekey_algorithm(a: number): number; -export function privatekey_payload(a: number, b: number): void; -export function privatekey_payload_hex(a: number, b: number): void; -export function privatekey_to_json(a: number, b: number): void; -export function __wbg_keypair_free(a: number): void; -export function keypair_from_json(a: number, b: number): void; -export function keypair_random(a: number, b: number): void; -export function keypair_from_parts(a: number, b: number, c: number): void; -export function keypair_derive_from_seed(a: number, b: number, c: number): void; -export function keypair_derive_from_private_key(a: number, b: number): void; -export function keypair_algorithm(a: number): number; -export function keypair_public_key(a: number): number; -export function keypair_private_key(a: number): number; -export function keypair_to_json(a: number, b: number): void; -export function __wbg_signature_free(a: number): void; -export function signature_from_json(a: number, b: number): void; -export function signature_from_bytes(a: number, b: number, c: number): void; -export function signature_new(a: number, b: number, c: number): void; -export function signature_verify(a: number, b: number, c: number): void; -export function signature_payload(a: number, b: number): void; -export function signature_payload_hex(a: number, b: number): void; -export function signature_to_json(a: number, b: number): void; -export function publickey_algorithm(a: number): number; -export function signature_public_key(a: number): number; -export function main_js(): void; -export function __wbindgen_malloc(a: number, b: number): number; -export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; -export function __wbindgen_add_to_stack_pointer(a: number): number; -export function __wbindgen_free(a: number, b: number, c: number): void; -export function __wbindgen_exn_store(a: number): void; -export function __wbindgen_start(): void; diff --git a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto.d.ts b/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto.d.ts deleted file mode 100644 index dc07093b..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto.d.ts +++ /dev/null @@ -1,351 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** -* @returns {Algorithm} -*/ -export function algorithm_default(): Algorithm; -/** -*/ -export function main_js(): void; - -export type Algorithm = - | 'ed25519' - | 'secp256k1' - | 'bls_normal' - | 'bls_small' - - - -export interface PrivateKeyJson { - algorithm: string - /** Hex-encoded bytes */ - payload: string -} - -export interface KeyPairJson { - public_key: string - private_key: PrivateKeyJson -} - -export interface SignatureJson { - public_key: string - /** Hex-encoded bytes */ - payload: string -} - -export type VerifyResult = - | { t: 'ok' } - | { t: 'err', error: string } - - - -export type Bytes = - | { t: 'array', c: Uint8Array } - | { t: 'hex', c: string } - - -/** -*/ -export class Hash { - free(): void; -/** -* Construct zeroed hash -* @returns {Hash} -*/ - static zeroed(): Hash; -/** -* Hash the given bytes. -* -* # Errors -* If failed to parse bytes input -* @param {Binary} payload -*/ - constructor(payload: Binary); -/** -* @returns {Uint8Array} -*/ - bytes(): Uint8Array; -/** -* @returns {string} -*/ - bytes_hex(): string; -} -/** -* Pair of Public and Private keys. -*/ -export class KeyPair { - free(): void; -/** -* # Errors -* Fails if deserialization fails -* @param {KeyPairJson} value -* @returns {KeyPair} -*/ - static from_json(value: KeyPairJson): KeyPair; -/** -* Generate a random key pair -* -* # Errors -* If passed algorithm is not valid. -* @param {Algorithm | undefined} [algorithm] -* @returns {KeyPair} -*/ - static random(algorithm?: Algorithm): KeyPair; -/** -* Construct a key pair from its components -* -* # Errors -* If public and private keys don’t match, i.e. if they don’t make a pair -* @param {PublicKey} public_key -* @param {PrivateKey} private_key -* @returns {KeyPair} -*/ - static from_parts(public_key: PublicKey, private_key: PrivateKey): KeyPair; -/** -* @param {Binary} seed -* @param {Algorithm | undefined} [algorithm] -* @returns {KeyPair} -*/ - static derive_from_seed(seed: Binary, algorithm?: Algorithm): KeyPair; -/** -* @param {PrivateKey} key -* @returns {KeyPair} -*/ - static derive_from_private_key(key: PrivateKey): KeyPair; -/** -* @returns {PublicKey} -*/ - public_key(): PublicKey; -/** -* @returns {PrivateKey} -*/ - private_key(): PrivateKey; -/** -* # Errors -* Fails if serialisation fails -* @returns {KeyPairJson} -*/ - to_json(): KeyPairJson; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Private Key used in signatures. -*/ -export class PrivateKey { - free(): void; -/** -* # Errors -* Fails if serialization fails -* @param {PrivateKeyJson} value -* @returns {PrivateKey} -*/ - static from_json(value: PrivateKeyJson): PrivateKey; -/** -* # Errors -* Fails if parsing of digest function or payload byte input fails -* @param {Algorithm} algorithm -* @param {Binary} payload -* @returns {PrivateKey} -*/ - static from_bytes(algorithm: Algorithm, payload: Binary): PrivateKey; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -* # Errors -* Fails is serialisation fails -* @returns {PrivateKeyJson} -*/ - to_json(): PrivateKeyJson; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Public Key used in signatures. -*/ -export class PublicKey { - free(): void; -/** -* # Errors -* Fails if multihash parsing fails -* @param {string} multihash -* @returns {PublicKey} -*/ - static from_multihash_hex(multihash: string): PublicKey; -/** -* # Errors -* Fails if parsing of algorithm or payload byte input fails -* @param {Algorithm} algorithm -* @param {Binary} payload -* @returns {PublicKey} -*/ - static from_bytes(algorithm: Algorithm, payload: Binary): PublicKey; -/** -* @param {PrivateKey} key -* @returns {PublicKey} -*/ - static from_private_key(key: PrivateKey): PublicKey; -/** -* @returns {string} -*/ - to_multihash_hex(): string; -/** -* Equivalent to [`Self::to_multihash_hex`] -* @returns {string} -*/ - to_json(): string; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -*/ - readonly algorithm: Algorithm; -} -/** -* Represents the signature of the data -*/ -export class Signature { - free(): void; -/** -* # Errors -* If failed to deserialise JSON -* @param {SignatureJson} value -* @returns {Signature} -*/ - static from_json(value: SignatureJson): Signature; -/** -* Construct the signature from raw components received from elsewhere -* -* # Errors -* - Invalid bytes input -* @param {PublicKey} public_key -* @param {Binary} payload -* @returns {Signature} -*/ - static from_bytes(public_key: PublicKey, payload: Binary): Signature; -/** -* Creates new signature by signing the payload via the key pair's private key. -* -* # Errors -* If parsing bytes input fails -* @param {KeyPair} key_pair -* @param {Binary} payload -*/ - constructor(key_pair: KeyPair, payload: Binary); -/** -* Verify `payload` using signed data and the signature's public key -* -* # Errors -* - If parsing of bytes input fails -* - If failed to construct verify error -* @param {Binary} payload -* @returns {VerifyResult} -*/ - verify(payload: Binary): VerifyResult; -/** -* @returns {PublicKey} -*/ - public_key(): PublicKey; -/** -* @returns {Uint8Array} -*/ - payload(): Uint8Array; -/** -* @returns {string} -*/ - payload_hex(): string; -/** -* # Errors -* If conversion fails -* @returns {SignatureJson} -*/ - to_json(): SignatureJson; -} - -export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; - -export interface InitOutput { - readonly memory: WebAssembly.Memory; - readonly algorithm_default: () => number; - readonly __wbg_hash_free: (a: number) => void; - readonly hash_zeroed: () => number; - readonly hash_new: (a: number, b: number) => void; - readonly hash_bytes: (a: number, b: number) => void; - readonly hash_bytes_hex: (a: number, b: number) => void; - readonly __wbg_publickey_free: (a: number) => void; - readonly publickey_from_multihash_hex: (a: number, b: number, c: number) => void; - readonly publickey_from_bytes: (a: number, b: number, c: number) => void; - readonly publickey_from_private_key: (a: number) => number; - readonly publickey_to_multihash_hex: (a: number, b: number) => void; - readonly publickey_to_json: (a: number, b: number) => void; - readonly publickey_payload: (a: number, b: number) => void; - readonly publickey_payload_hex: (a: number, b: number) => void; - readonly __wbg_privatekey_free: (a: number) => void; - readonly privatekey_from_json: (a: number, b: number) => void; - readonly privatekey_from_bytes: (a: number, b: number, c: number) => void; - readonly privatekey_algorithm: (a: number) => number; - readonly privatekey_payload: (a: number, b: number) => void; - readonly privatekey_payload_hex: (a: number, b: number) => void; - readonly privatekey_to_json: (a: number, b: number) => void; - readonly __wbg_keypair_free: (a: number) => void; - readonly keypair_from_json: (a: number, b: number) => void; - readonly keypair_random: (a: number, b: number) => void; - readonly keypair_from_parts: (a: number, b: number, c: number) => void; - readonly keypair_derive_from_seed: (a: number, b: number, c: number) => void; - readonly keypair_derive_from_private_key: (a: number, b: number) => void; - readonly keypair_algorithm: (a: number) => number; - readonly keypair_public_key: (a: number) => number; - readonly keypair_private_key: (a: number) => number; - readonly keypair_to_json: (a: number, b: number) => void; - readonly __wbg_signature_free: (a: number) => void; - readonly signature_from_json: (a: number, b: number) => void; - readonly signature_from_bytes: (a: number, b: number, c: number) => void; - readonly signature_new: (a: number, b: number, c: number) => void; - readonly signature_verify: (a: number, b: number, c: number) => void; - readonly signature_payload: (a: number, b: number) => void; - readonly signature_payload_hex: (a: number, b: number) => void; - readonly signature_to_json: (a: number, b: number) => void; - readonly publickey_algorithm: (a: number) => number; - readonly signature_public_key: (a: number) => number; - readonly main_js: () => void; - readonly __wbindgen_malloc: (a: number, b: number) => number; - readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; - readonly __wbindgen_add_to_stack_pointer: (a: number) => number; - readonly __wbindgen_free: (a: number, b: number, c: number) => void; - readonly __wbindgen_exn_store: (a: number) => void; - readonly __wbindgen_start: () => void; -} - -export type SyncInitInput = BufferSource | WebAssembly.Module; -/** -* Instantiates the given `module`, which can either be bytes or -* a precompiled `WebAssembly.Module`. -* -* @param {SyncInitInput} module -* -* @returns {InitOutput} -*/ -export function initSync(module: SyncInitInput): InitOutput; - -/** -* If `module_or_path` is {RequestInfo} or {URL}, makes a request and -* for everything else, calls `WebAssembly.instantiate` directly. -* -* @param {InitInput | Promise} module_or_path -* -* @returns {Promise} -*/ -export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto.js b/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto.js deleted file mode 100644 index d069aa32..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto.js +++ /dev/null @@ -1,1370 +0,0 @@ -let wasm; - -const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); - -if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -let heap_next = heap.length; - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -function getObject(idx) { return heap[idx]; } - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedFloat64Memory0 = null; - -function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -let WASM_VECTOR_LEN = 0; - -const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -let cachedBigInt64Memory0 = null; - -function getBigInt64Memory0() { - if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { - cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); - } - return cachedBigInt64Memory0; -} - -function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; - } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; -} -/** -* @returns {Algorithm} -*/ -export function algorithm_default() { - const ret = wasm.algorithm_default(); - return takeObject(ret); -} - -function getArrayU8FromWasm0(ptr, len) { - ptr = ptr >>> 0; - return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); -} - -function _assertClass(instance, klass) { - if (!(instance instanceof klass)) { - throw new Error(`expected instance of ${klass.name}`); - } - return instance.ptr; -} -/** -*/ -export function main_js() { - wasm.main_js(); -} - -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } -} - -const HashFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_hash_free(ptr >>> 0)); -/** -*/ -export class Hash { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(Hash.prototype); - obj.__wbg_ptr = ptr; - HashFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - HashFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_hash_free(ptr); - } - /** - * Construct zeroed hash - * @returns {Hash} - */ - static zeroed() { - const ret = wasm.hash_zeroed(); - return Hash.__wrap(ret); - } - /** - * Hash the given bytes. - * - * # Errors - * If failed to parse bytes input - * @param {Binary} payload - */ - constructor(payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_new(retptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - this.__wbg_ptr = r0 >>> 0; - return this; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Uint8Array} - */ - bytes() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_bytes(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - bytes_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.hash_bytes_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } -} - -const KeyPairFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_keypair_free(ptr >>> 0)); -/** -* Pair of Public and Private keys. -*/ -export class KeyPair { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(KeyPair.prototype); - obj.__wbg_ptr = ptr; - KeyPairFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - KeyPairFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_keypair_free(ptr); - } - /** - * # Errors - * Fails if deserialization fails - * @param {KeyPairJson} value - * @returns {KeyPair} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Generate a random key pair - * - * # Errors - * If passed algorithm is not valid. - * @param {Algorithm | undefined} [algorithm] - * @returns {KeyPair} - */ - static random(algorithm) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_random(retptr, isLikeNone(algorithm) ? 0 : addHeapObject(algorithm)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Construct a key pair from its components - * - * # Errors - * If public and private keys don’t match, i.e. if they don’t make a pair - * @param {PublicKey} public_key - * @param {PrivateKey} private_key - * @returns {KeyPair} - */ - static from_parts(public_key, private_key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(public_key, PublicKey); - _assertClass(private_key, PrivateKey); - wasm.keypair_from_parts(retptr, public_key.__wbg_ptr, private_key.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {Binary} seed - * @param {Algorithm | undefined} [algorithm] - * @returns {KeyPair} - */ - static derive_from_seed(seed, algorithm) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_derive_from_seed(retptr, addHeapObject(seed), isLikeNone(algorithm) ? 0 : addHeapObject(algorithm)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {PrivateKey} key - * @returns {KeyPair} - */ - static derive_from_private_key(key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(key, PrivateKey); - wasm.keypair_derive_from_private_key(retptr, key.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return KeyPair.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.keypair_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {PublicKey} - */ - public_key() { - const ret = wasm.keypair_public_key(this.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {PrivateKey} - */ - private_key() { - const ret = wasm.keypair_private_key(this.__wbg_ptr); - return PrivateKey.__wrap(ret); - } - /** - * # Errors - * Fails if serialisation fails - * @returns {KeyPairJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.keypair_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} - -const PrivateKeyFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_privatekey_free(ptr >>> 0)); -/** -* Private Key used in signatures. -*/ -export class PrivateKey { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(PrivateKey.prototype); - obj.__wbg_ptr = ptr; - PrivateKeyFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - PrivateKeyFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_privatekey_free(ptr); - } - /** - * # Errors - * Fails if serialization fails - * @param {PrivateKeyJson} value - * @returns {PrivateKey} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PrivateKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * # Errors - * Fails if parsing of digest function or payload byte input fails - * @param {Algorithm} algorithm - * @param {Binary} payload - * @returns {PrivateKey} - */ - static from_bytes(algorithm, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_from_bytes(retptr, addHeapObject(algorithm), addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PrivateKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.privatekey_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * # Errors - * Fails is serialisation fails - * @returns {PrivateKeyJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.privatekey_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} - -const PublicKeyFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_publickey_free(ptr >>> 0)); -/** -* Public Key used in signatures. -*/ -export class PublicKey { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(PublicKey.prototype); - obj.__wbg_ptr = ptr; - PublicKeyFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - PublicKeyFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_publickey_free(ptr); - } - /** - * # Errors - * Fails if multihash parsing fails - * @param {string} multihash - * @returns {PublicKey} - */ - static from_multihash_hex(multihash) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0(multihash, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - wasm.publickey_from_multihash_hex(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PublicKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * # Errors - * Fails if parsing of algorithm or payload byte input fails - * @param {Algorithm} algorithm - * @param {Binary} payload - * @returns {PublicKey} - */ - static from_bytes(algorithm, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_from_bytes(retptr, addHeapObject(algorithm), addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return PublicKey.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @param {PrivateKey} key - * @returns {PublicKey} - */ - static from_private_key(key) { - _assertClass(key, PrivateKey); - const ret = wasm.publickey_from_private_key(key.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {string} - */ - to_multihash_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_to_multihash_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * Equivalent to [`Self::to_multihash_hex`] - * @returns {string} - */ - to_json() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * @returns {Algorithm} - */ - get algorithm() { - const ret = wasm.privatekey_algorithm(this.__wbg_ptr); - return takeObject(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.publickey_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } -} - -const SignatureFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_signature_free(ptr >>> 0)); -/** -* Represents the signature of the data -*/ -export class Signature { - - static __wrap(ptr) { - ptr = ptr >>> 0; - const obj = Object.create(Signature.prototype); - obj.__wbg_ptr = ptr; - SignatureFinalization.register(obj, obj.__wbg_ptr, obj); - return obj; - } - - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - SignatureFinalization.unregister(this); - return ptr; - } - - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_signature_free(ptr); - } - /** - * # Errors - * If failed to deserialise JSON - * @param {SignatureJson} value - * @returns {Signature} - */ - static from_json(value) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_from_json(retptr, addHeapObject(value)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return Signature.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Construct the signature from raw components received from elsewhere - * - * # Errors - * - Invalid bytes input - * @param {PublicKey} public_key - * @param {Binary} payload - * @returns {Signature} - */ - static from_bytes(public_key, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(public_key, PublicKey); - wasm.signature_from_bytes(retptr, public_key.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return Signature.__wrap(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Creates new signature by signing the payload via the key pair's private key. - * - * # Errors - * If parsing bytes input fails - * @param {KeyPair} key_pair - * @param {Binary} payload - */ - constructor(key_pair, payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertClass(key_pair, KeyPair); - wasm.signature_new(retptr, key_pair.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - this.__wbg_ptr = r0 >>> 0; - return this; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Verify `payload` using signed data and the signature's public key - * - * # Errors - * - If parsing of bytes input fails - * - If failed to construct verify error - * @param {Binary} payload - * @returns {VerifyResult} - */ - verify(payload) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_verify(retptr, this.__wbg_ptr, addHeapObject(payload)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {PublicKey} - */ - public_key() { - const ret = wasm.keypair_public_key(this.__wbg_ptr); - return PublicKey.__wrap(ret); - } - /** - * @returns {Uint8Array} - */ - payload() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_payload(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {string} - */ - payload_hex() { - let deferred1_0; - let deferred1_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_payload_hex(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred1_0 = r0; - deferred1_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); - } - } - /** - * # Errors - * If conversion fails - * @returns {SignatureJson} - */ - to_json() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.signature_to_json(retptr, this.__wbg_ptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } -} - -async function __wbg_load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - - } else { - return instance; - } - } -} - -function __wbg_get_imports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbindgen_error_new = function(arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; - }; - imports.wbg.__wbindgen_boolean_get = function(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; - return ret; - }; - imports.wbg.__wbindgen_is_bigint = function(arg0) { - const ret = typeof(getObject(arg0)) === 'bigint'; - return ret; - }; - imports.wbg.__wbindgen_bigint_from_i64 = function(arg0) { - const ret = arg0; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_jsval_eq = function(arg0, arg1) { - const ret = getObject(arg0) === getObject(arg1); - return ret; - }; - imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { - const ret = BigInt.asUintN(64, arg0); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_number_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_in = function(arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; - }; - imports.wbg.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; - }; - imports.wbg.__wbindgen_is_string = function(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; - }; - imports.wbg.__wbindgen_as_number = function(arg0) { - const ret = +getObject(arg0); - return ret; - }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_crypto_d05b68a3572bb8ca = function(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); - }; - imports.wbg.__wbg_process_b02b3570280d0366 = function(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); - }; - imports.wbg.__wbg_versions_c1cb42213cedf0f5 = function(arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); - }; - imports.wbg.__wbg_node_43b1089f407e4ec2 = function(arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); - }; - imports.wbg.__wbg_msCrypto_10fc94afee92bd76 = function(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); - }; - imports.wbg.__wbg_require_9a7e0f667ead4995 = function() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; - }; - imports.wbg.__wbg_randomFillSync_b70ccbdf4926a99d = function() { return handleError(function (arg0, arg1) { - getObject(arg0).randomFillSync(takeObject(arg1)); - }, arguments) }; - imports.wbg.__wbg_getRandomValues_7e42b4fb8779dc6d = function() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); - }, arguments) }; - imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; - }; - imports.wbg.__wbg_String_389b54bd9d25375f = function(arg0, arg1) { - const ret = String(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbg_getwithrefkey_4a92a5eca60879b9 = function(arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_9182712abebf82ef = function(arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); - }; - imports.wbg.__wbg_get_0ee8ea3c7c984c45 = function(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_length_161c0d89c6535c1d = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_newnoargs_cfecb3965268594c = function(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_next_586204376d2ed373 = function(arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); - }; - imports.wbg.__wbg_next_b2d3366343a208b3 = function() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_done_90b14d6f6eacc42f = function(arg0) { - const ret = getObject(arg0).done; - return ret; - }; - imports.wbg.__wbg_value_3158be908c80a75e = function(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }; - imports.wbg.__wbg_iterator_40027cdd598da26b = function() { - const ret = Symbol.iterator; - return addHeapObject(ret); - }; - imports.wbg.__wbg_get_3fddfed2c83f434c = function() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_call_3f093dd26d5569f8 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_632630b5cec17f21 = function() { - const ret = new Object(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_self_05040bd9523805b9 = function() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_window_adc720039f2cb14f = function() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_globalThis_622105db80c1457d = function() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_global_f56b013ed9bcf359 = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_isArray_e783c41d0dd19b44 = function(arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; - }; - imports.wbg.__wbg_instanceof_ArrayBuffer_9221fa854ffb71b5 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_call_67f2111acd2dfdb6 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_isSafeInteger_a23a66ee7c41b273 = function(arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; - }; - imports.wbg.__wbg_entries_488960b196cfb6a5 = function(arg0) { - const ret = Object.entries(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_buffer_b914fb8b50ebbc3e = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }; - imports.wbg.__wbg_newwithbyteoffsetandlength_0de9ee56e9f6ee6e = function(arg0, arg1, arg2) { - const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_b1f2d6842d615181 = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_7d988c98e6ced92d = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }; - imports.wbg.__wbg_length_21c4b0ae73cba59d = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_instanceof_Uint8Array_c299a4ee232e76ba = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_newwithlength_0d03cef43b68a530 = function(arg0) { - const ret = new Uint8Array(arg0 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_subarray_adc418253d76e2f1 = function(arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_abda76e883ba8a5f = function() { - const ret = new Error(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } - }; - imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { - const v = getObject(arg1); - const ret = typeof(v) === 'bigint' ? v : undefined; - getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }; - imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - imports.wbg.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); - }; - - return imports; -} - -function __wbg_init_memory(imports, maybe_memory) { - -} - -function __wbg_finalize_init(instance, module) { - wasm = instance.exports; - __wbg_init.__wbindgen_wasm_module = module; - cachedBigInt64Memory0 = null; - cachedFloat64Memory0 = null; - cachedInt32Memory0 = null; - cachedUint8Memory0 = null; - - wasm.__wbindgen_start(); - return wasm; -} - -function initSync(module) { - if (wasm !== undefined) return wasm; - - const imports = __wbg_get_imports(); - - __wbg_init_memory(imports); - - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } - - const instance = new WebAssembly.Instance(module, imports); - - return __wbg_finalize_init(instance, module); -} - -async function __wbg_init(input) { - if (wasm !== undefined) return wasm; - - if (typeof input === 'undefined') { - input = new URL('iroha_crypto_bg.wasm', import.meta.url); - } - const imports = __wbg_get_imports(); - - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } - - __wbg_init_memory(imports); - - const { instance, module } = await __wbg_load(await input, imports); - - return __wbg_finalize_init(instance, module); -} - -export { initSync } -export default __wbg_init; diff --git a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto_bg.wasm b/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto_bg.wasm deleted file mode 100644 index 0987b9ae..00000000 Binary files a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto_bg.wasm and /dev/null differ diff --git a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto_bg.wasm.d.ts b/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto_bg.wasm.d.ts deleted file mode 100644 index 588eedb5..00000000 --- a/packages/crypto/crypto-rs/wasm-pkg-web/iroha_crypto_bg.wasm.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -export const memory: WebAssembly.Memory; -export function algorithm_default(): number; -export function __wbg_hash_free(a: number): void; -export function hash_zeroed(): number; -export function hash_new(a: number, b: number): void; -export function hash_bytes(a: number, b: number): void; -export function hash_bytes_hex(a: number, b: number): void; -export function __wbg_publickey_free(a: number): void; -export function publickey_from_multihash_hex(a: number, b: number, c: number): void; -export function publickey_from_bytes(a: number, b: number, c: number): void; -export function publickey_from_private_key(a: number): number; -export function publickey_to_multihash_hex(a: number, b: number): void; -export function publickey_to_json(a: number, b: number): void; -export function publickey_payload(a: number, b: number): void; -export function publickey_payload_hex(a: number, b: number): void; -export function __wbg_privatekey_free(a: number): void; -export function privatekey_from_json(a: number, b: number): void; -export function privatekey_from_bytes(a: number, b: number, c: number): void; -export function privatekey_algorithm(a: number): number; -export function privatekey_payload(a: number, b: number): void; -export function privatekey_payload_hex(a: number, b: number): void; -export function privatekey_to_json(a: number, b: number): void; -export function __wbg_keypair_free(a: number): void; -export function keypair_from_json(a: number, b: number): void; -export function keypair_random(a: number, b: number): void; -export function keypair_from_parts(a: number, b: number, c: number): void; -export function keypair_derive_from_seed(a: number, b: number, c: number): void; -export function keypair_derive_from_private_key(a: number, b: number): void; -export function keypair_algorithm(a: number): number; -export function keypair_public_key(a: number): number; -export function keypair_private_key(a: number): number; -export function keypair_to_json(a: number, b: number): void; -export function __wbg_signature_free(a: number): void; -export function signature_from_json(a: number, b: number): void; -export function signature_from_bytes(a: number, b: number, c: number): void; -export function signature_new(a: number, b: number, c: number): void; -export function signature_verify(a: number, b: number, c: number): void; -export function signature_payload(a: number, b: number): void; -export function signature_payload_hex(a: number, b: number): void; -export function signature_to_json(a: number, b: number): void; -export function publickey_algorithm(a: number): number; -export function signature_public_key(a: number): number; -export function main_js(): void; -export function __wbindgen_malloc(a: number, b: number): number; -export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; -export function __wbindgen_add_to_stack_pointer(a: number): number; -export function __wbindgen_free(a: number, b: number, c: number): void; -export function __wbindgen_exn_store(a: number): void; -export function __wbindgen_start(): void; diff --git a/packages/crypto/package.json b/packages/crypto/package.json deleted file mode 100644 index 328b37d7..00000000 --- a/packages/crypto/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@iroha2/monorepo-crypto", - "private": true, - "scripts": { - "test:integration": "pnpm --parallel --filter \"@iroha2/crypto-test-*\" run test" - } -} diff --git a/packages/crypto/packages/core/CHANGELOG.md b/packages/crypto/packages/core/CHANGELOG.md deleted file mode 100644 index 23100290..00000000 --- a/packages/crypto/packages/core/CHANGELOG.md +++ /dev/null @@ -1,139 +0,0 @@ -# @iroha2/crypto-core - -## 2.0.0 - -### Major Changes - -- 787a198: **Breaking:** Complete rewrite of crypto WASM, and major update of the surrounding API. - - - Now WASM is made from the original `iroha_crypto` from Iroha 2 repo. As one of the outcomes, binary blob size is reduced from 2mb to 600kb. - - Remove `KeyGenConfiguration`. Use `KeyPair.deriveFromSeed`, `KeyPair.deriveFromPrivateKey`, and `KeyPair.random` instead. - - Normalise API across `PublicKey`, `PrivateKey`, `KeyPair`, and `Signature` classes (JSON methods, raw conversion methods etc.) - - Introduce `Bytes` utility to accept binary input either as `Bytes.array([1, 2, 3])` or `Bytes.hex('001122')` - - Export more types¡ - - See the [issue](https://github.com/hyperledger/iroha-javascript/issues/186) for related context. - -### Patch Changes - -- Updated dependencies [787a198] - - @iroha2/crypto-util@0.2.0 - - @iroha2/data-model@7.1.0 - -## 1.1.1 - -### Patch Changes - -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] - - @iroha2/data-model@7.0.0 - -## 1.1.0 - -### Minor Changes - -- 40516f1: **refactor**: combine new `Algorithm` type and codec from `data-model` with the crypto's `Algorithm` type, which is simply a string. Add `Algorithm.toDataModel` and `Algorithm.fromDataModel` methods. - -### Patch Changes - -- Updated dependencies [40516f1] - - @iroha2/data-model@6.0.0 - -## 1.0.1 - -### Patch Changes - -- Updated dependencies [d1e5f68] -- Updated dependencies [3ff768d] -- Updated dependencies [d1e5f68] - - @iroha2/data-model@5.0.0 - -## 1.0.0 - -### Major Changes - -- ddfeeac: **feature**: re-write WASM and provide high-level wrappers around it. - - #### What the braking change is - - Each target now provides high-level wrappers around raw `wasm-pack` artifacts. These wrappers provide a better-designed interface with features like global `.free()`-objects tracking and integration with `@iroha2/data-model`. - - Moreover, the WASM itself is re-written and now provides more flexibility, such as working with JSON and HEX representations out of the box. - - Here you can see how `@iroha2/crypto-core` and `@iroha2/crypto-target-*` are connected: - - ```ts - import { IrohaCryptoInterface, cryptoTypes } from '@iroha2/crypto-core' - import { crypto } from '@iroha2/crypto-target-node' - - // each target exports `crypto`, which is the `IrohaCryptoInterface` type from - // the core library - const cryptoAsserted: IrohaCryptoInterface = crypto - - // the core library exports `cryptoTypes` namespace which contains all the types - // used in crypto you might need - const hash: cryptoTypes.Hash = crypto.Hash.hash('hex', '00ff') - ``` - - `@iroha2/crypto-core` re-exports `@iroha2/crypto-util`, a new library which contains (for now) only utilities to work with `.free()` tracking: - - ```ts - import { freeScope, FREE_HEAP } from '@iroha2/crypto-util' - import { crypto } from '@iroha2/crypto-target-web' - - const keyPair = freeScope((scope) => { - const pair = crypto.KeyGenConfiguration - // Create a configuration object that you can later `.free()` manually. - // It is automatically attached to the scope it is created within, - // so when the scope is over, everything attached to it will be freed. - .default() - .useSeed('hex', 'ff') - // Create a new `.free()` object: a key pair - .generate() - - // to use the key pair (and nothing else) out of scope, - // you need to "untrack" it - scope.forget(pair) - - return pair - }) - - // inspect the heap in order to determine if there are memory leaks - if (FREE_HEAP.size > 1) { - console.log('Something went wrong, I guess?') - } - ``` - - #### Why the change was made - - Codegen of `wasm_bindgen` is very limited. This change is made to provide a better quality and safer API over crypto WASM. - - #### How a consumer should update their code - - Unfortunately, the code should be updated completely. Here are some major points you should note. - - `IrohaCryptoInterface` type from the core package is still the same as `crypto` export from target packages, but the content of the type is completely different. - - Previously, types such as `Hash`, `Signature`, `PublicKey` were separate exports from the core library. Now they are contained within the `cryptoTypes` namespace: - - ```ts - // doesn't work anymore - // import { Hash } from '@iroha2/crypto-core' - - import { cryptoTypes } from '@iroha2/crypto-core' - - type Hash = cryptoTypes.Hash - ``` - -### Patch Changes - -- @iroha2/data-model@4.1.0 - -## 0.1.1 - -### Patch Changes - -- 49c8451: chore: include only necessary files into `files` field in the `package.json` diff --git a/packages/crypto/packages/core/README.md b/packages/crypto/packages/core/README.md deleted file mode 100644 index ad0e63ae..00000000 --- a/packages/crypto/packages/core/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# `@iroha2/crypto-core` - -The core package primary contains types, so you can base your code on them instead of relying on a particular target implementation. Compiled implementations for each target (`node`, `web`, `bundler`) are in their own packages: - -- [`@iroha2/crypto-target-node`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/target-node) -- [`@iroha2/crypto-target-web`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/target-web) -- [`@iroha2/crypto-target-bundler`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/target-bundler) - -You can learn more about targets in the [`wasm-bindgen` documentation](https://rustwasm.github.io/docs/wasm-bindgen/reference/deployment.html). - -Also, this package re-exports everything from [`@iroha2/crypto-util` package](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/util). - -## Installation - -The packages are published under the `@iroha2` scope into Iroha Nexus Registry. -To install the necessary packages with `npm`/`pnpm`: - -1. Configure your package manager to fetch scoped packages from Nexus Registry. - - ```ini - # FILE: .npmrc - @iroha2:registry=https://nexus.iroha.tech/repository/npm-group/ - ``` - -2. Install the packages you need: - - ```shell - pnpm add @iroha2/crypto-core @iroha2/crypto-target-node - ``` - -## Guide - -### Use target implementation - -Each target exports the same `crypto` namespace containing all the types and classes to work with hashes, keys, and signatures: - -```ts -import { crypto } from '@iroha2/crypto-target-node' - -const hex = crypto.Hash.hash('hex', '0011ff').bytes('hex') - -const signature: crypto.Signature = crypto.KeyGenConfiguration.default() - .generate() - .sign('array', new Uint8Array([1, 1, 2, 3])) -``` - -### Write target-agnostic logic - -`cryptoTypes` namespace export in `@iroha2/crypto-core` contains all the **types** you may find in `crypto` namespace export from `@iroha2/crypto-target-*`: - -```ts -import { cryptoTypes } from '@iroha2/crypto-core' - -function hashAsHex(hash: cryptoTypes.Hash): string { - return hash.bytes('hex') -} -``` - -`IrohaCryptoInterface` type represents the type of `crypto` itself: - -```ts -import { IrohaCryptoInterface } from '@iroha2/crypto-core' - -function printHexHash(data: Uint8Array, crypto: IrohaCryptoInterface) { - const hex = crypto.Hash.hash('array', data).bytes('hex') - console.log({ hex }) -} -``` - -### Avoid memory leaks - -WASM objects are not deallocated automatically. All the objects that reflect some struct in WASM have `.free()` method to trigger deallocation manually, for example: - -```ts -import { crypto } from '@iroha2/crypto-target-node' - -const hash = crypto.Hash.hash('hex', '0011ff') -const conf = crypto.KeyGenConfiguration.default().useSeed('array', hash.bytes()) -const keypair = conf.generate() - -for (const x of [hash, conf]) { - x.free() -} -``` - -Fortunately, all such objects are wrapped and tracked so this process can be automated. The previous example can be re-written in a more _robust_ way that ensures every object is freed: - -```ts -// re-export from `@iroha2/crypto-util` -import { freeScope } from '@iroha2/crypto-core' - -import { crypto } from '@iroha2/crypto-target-node' - -const keypair = freeScope((scope) => { - const seed = crypto.Hash.hash('hex', '00aa11').bytes() - const keypair = crypto.KeyGenConfiguration.default().useSeed('array', seed).generate() - scope.forget(keypair) - return keypair -}) -``` - -Please refer to [`@iroha2/crypto-util`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/util) package documentation for more details. diff --git a/packages/crypto/packages/core/package.json b/packages/crypto/packages/core/package.json deleted file mode 100644 index c099a9b2..00000000 --- a/packages/crypto/packages/core/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "@iroha2/crypto-core", - "version": "2.0.0", - "module": "dist/lib.mjs", - "main": "dist/lib.cjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "require": "./dist/lib.cjs", - "types": "./dist/lib.d.ts" - } - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "devDependencies": { - "@iroha2/crypto-interface-wrap": "workspace:^0.0.0" - }, - "dependencies": { - "@iroha2/crypto-util": "workspace:^0.2.0", - "@iroha2/data-model": "workspace:^7.1.0" - } -} diff --git a/packages/crypto/packages/core/src/lib.ts b/packages/crypto/packages/core/src/lib.ts deleted file mode 100644 index 9ba96305..00000000 --- a/packages/crypto/packages/core/src/lib.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as crypto from '@iroha2/crypto-interface-wrap' - -export * from '@iroha2/crypto-util' -export type { crypto as cryptoTypes } -export type IrohaCryptoInterface = typeof crypto diff --git a/packages/crypto/packages/interface-wrap/README.md b/packages/crypto/packages/interface-wrap/README.md deleted file mode 100644 index 1b052c36..00000000 --- a/packages/crypto/packages/interface-wrap/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# `@iroha2/crypto-interface-wrap` - -This package contains the target-agnostic wrapper code around the WASM bindings produced by `wasm-bindgen`. The package is intended not for publication but to be included in other packages. - -## Magic target import - -In order for the wrapper code to be target-agnostic, it uses the virtual import, which is then replaced in Rollup when the particular target wrapper is built: - -```ts -import { wasmPkg } from '@iroha2/crypto-interface-wrap/~wasm-pack-proxy' -``` - -For development, on type-level mode it is [replaced](./src/wasm-pack-proxy-shim.d.ts) with the types from `wasm-pkg-nodejs` (it doesn't matter which target is used for it). In Rollup, it is replaced with a particular target: - -```ts -// @iroha2/crypto-interface-wrap/~wasm-pack-proxy -export * as wasmPkg from 'crypto-rs/wasm-pkg-nodejs/iroha_crypto' -``` - -Accessing the target code via namespace import (`* as wasmPkg`) is necessary for Rollup to build the code both for CJS and ESM targets. - -## Specifying dependencies - -This package is included into other package's **dev** dependencies. `@iroha2/data-model` and `@iroha2/crypto-core` are included into other package's **prod** dependencies because they are used in the wrapper source code. - -Under the hood, this package imports `@iroha2/crypto-util`, which is then replaced with `@iroha2/crypto-core` in Rollup since the latter re-exports the util package. - -## How this package is used - -See the source code of `crypto-target-*` and `crypto-core` packages. diff --git a/packages/crypto/packages/interface-wrap/package.json b/packages/crypto/packages/interface-wrap/package.json deleted file mode 100644 index aa0a60a8..00000000 --- a/packages/crypto/packages/interface-wrap/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@iroha2/crypto-interface-wrap", - "version": "0.0.0", - "private": true, - "main": "src/lib.ts", - "devDependencies": { - "@iroha2/crypto-util": "workspace:^0.2.0", - "@iroha2/data-model": "workspace:^7.1.0" - } -} diff --git a/packages/crypto/packages/interface-wrap/src/lib.ts b/packages/crypto/packages/interface-wrap/src/lib.ts deleted file mode 100644 index e5402d91..00000000 --- a/packages/crypto/packages/interface-wrap/src/lib.ts +++ /dev/null @@ -1,308 +0,0 @@ -import { wasmPkg } from '@iroha2/crypto-interface-wrap/~wasm-pack-proxy' -import { Bytes, Free, FreeGuard, FreeScope, GetInnerTrackObject, freeScope } from '@iroha2/crypto-util' -import { datamodel } from '@iroha2/data-model' - -export type Algorithm = wasmPkg.Algorithm -export type PrivateKeyJson = wasmPkg.PrivateKeyJson -export type KeyPairJson = wasmPkg.KeyPairJson -export type SignatureJson = wasmPkg.SignatureJson -export type VerifyResult = wasmPkg.VerifyResult - -export const Algorithm = { - default: (): Algorithm => wasmPkg.algorithm_default(), - toDataModel: (algorithm: Algorithm): datamodel.Algorithm => { - switch (algorithm) { - case 'ed25519': - return datamodel.Algorithm('Ed25519') - case 'secp256k1': - return datamodel.Algorithm('Secp256k1') - case 'bls_small': - return datamodel.Algorithm('BlsSmall') - case 'bls_normal': - return datamodel.Algorithm('BlsNormal') - } - }, - fromDataModel: (algorithm: datamodel.Algorithm): Algorithm => { - switch (algorithm.enum.tag) { - case 'Ed25519': - return 'ed25519' - case 'Secp256k1': - return 'secp256k1' - case 'BlsSmall': - return 'bls_small' - case 'BlsNormal': - return 'bls_normal' - } - }, -} - -class SingleFreeWrap implements Free, GetInnerTrackObject { - /** - * We don't use `#guard` or `private guard`, because it breaks assignability checks with - * non-direct implementations - * @private - */ - public __guard: FreeGuard - - protected constructor(object: T) { - this.__guard = new FreeGuard(object) - } - - /** - * Get access to the underlying free-able object. For internal use. - * @internal - */ - public get inner(): T { - return this.__guard.object - } - - public free() { - this.__guard.free() - } - - public [FreeScope.getInnerTrackObject]() { - return this.__guard - } -} - -export interface HasAlgorithm { - readonly algorithm: Algorithm -} - -export interface HasPayload { - readonly payload: { - (): Uint8Array - (kind: 'hex'): string - } -} - -export interface ToDataModel { - toDataModel: () => T -} - -export interface ToJSON { - toJSON: () => T -} - -export class Hash extends SingleFreeWrap { - public static zeroed(): Hash { - return new Hash(wasmPkg.Hash.zeroed()) - } - - public static hash(payload: Bytes): Hash { - return new Hash(new wasmPkg.Hash(payload.wasm)) - } - - public bytes(): Uint8Array - public bytes(mode: 'hex'): string - public bytes(mode?: 'hex'): Uint8Array | string { - return mode === 'hex' ? this.inner.bytes_hex() : this.inner.bytes() - } -} - -export class PrivateKey - extends SingleFreeWrap - implements HasAlgorithm, HasPayload, ToJSON -{ - public static fromJSON(value: wasmPkg.PrivateKeyJson): PrivateKey { - const key = wasmPkg.PrivateKey.from_json(value) - return new PrivateKey(key) - } - - public static fromKeyPair(pair: KeyPair): PrivateKey { - return new PrivateKey(pair.inner.private_key()) - } - - public static fromBytes(algorithm: Algorithm, payload: Bytes): PrivateKey { - return new PrivateKey(wasmPkg.PrivateKey.from_bytes(algorithm, payload.wasm)) - } - - public get algorithm(): Algorithm { - return this.inner.algorithm - } - - public payload(): Uint8Array - public payload(kind: 'hex'): string - public payload(kind?: 'hex'): string | Uint8Array { - return kind === 'hex' ? this.inner.payload_hex() : this.inner.payload() - } - - public toJSON(): wasmPkg.PrivateKeyJson { - return this.inner.to_json() - } -} - -export class PublicKey - extends SingleFreeWrap - implements HasAlgorithm, HasPayload, ToDataModel, ToJSON -{ - public static fromMultihash(hex: string): PublicKey { - const key = wasmPkg.PublicKey.from_multihash_hex(hex) - return new PublicKey(key) - } - - /** - * Same as {@fromMultihash} - */ - public static fromJSON(hex: string): PublicKey { - return PublicKey.fromMultihash(hex) - } - - public static fromPrivateKey(privateKey: PrivateKey): PublicKey { - const key = wasmPkg.PublicKey.from_private_key(privateKey.inner) - return new PublicKey(key) - } - - public static fromKeyPair(pair: KeyPair): PublicKey { - return new PublicKey(pair.inner.public_key()) - } - - public static fromRaw(algorithm: Algorithm, payload: Bytes): PublicKey { - return new PublicKey(wasmPkg.PublicKey.from_bytes(algorithm, payload.wasm)) - } - - public static fromDataModel(publicKey: datamodel.PublicKey): PublicKey { - return PublicKey.fromRaw(Algorithm.fromDataModel(publicKey.digest_function), Bytes.array(publicKey.payload)) - } - - public toMultihash(): string { - return this.inner.to_multihash_hex() - } - - public get algorithm(): Algorithm { - return this.inner.algorithm - } - - public payload(): Uint8Array - public payload(kind: 'hex'): string - public payload(kind?: 'hex'): string | Uint8Array { - return kind === 'hex' ? this.inner.payload_hex() : this.inner.payload() - } - - /** - * Equal to {@link toMultihash} in `'hex'` mode - */ - public toJSON(): string { - return this.toMultihash() - } - - public toDataModel(): datamodel.PublicKey { - return datamodel.PublicKey({ - digest_function: Algorithm.toDataModel(this.algorithm), - payload: this.payload(), - }) - } -} - -export interface WithAlgorithm { - /** - * @default 'ed25519' - */ - algorithm?: Algorithm -} - -export class KeyPair extends SingleFreeWrap implements HasAlgorithm, ToJSON { - public static fromJSON(value: wasmPkg.KeyPairJson): KeyPair { - const pair = wasmPkg.KeyPair.from_json(value) - return new KeyPair(pair) - } - - public static random(options?: WithAlgorithm): KeyPair { - const pair = wasmPkg.KeyPair.random(options?.algorithm) - return new KeyPair(pair) - } - - public static deriveFromSeed(seed: Bytes, options?: WithAlgorithm): KeyPair { - const pair = wasmPkg.KeyPair.derive_from_seed(seed.wasm, options?.algorithm) - return new KeyPair(pair) - } - - public static deriveFromPrivateKey(private_key: PrivateKey): KeyPair { - const pair = wasmPkg.KeyPair.derive_from_private_key(private_key.inner) - return new KeyPair(pair) - } - - public static fromParts(publicKey: PublicKey, privateKey: PrivateKey): KeyPair { - return new KeyPair(wasmPkg.KeyPair.from_parts(publicKey.inner, privateKey.inner)) - } - - public get algorithm(): Algorithm { - return this.inner.algorithm - } - - public privateKey(): PrivateKey { - return PrivateKey.fromKeyPair(this) - } - - public publicKey(): PublicKey { - return PublicKey.fromKeyPair(this) - } - - public sign(payload: Bytes): Signature { - return Signature.create(this, payload) - } - - public toJSON(): wasmPkg.KeyPairJson { - return this.inner.to_json() - } -} - -export class Signature - extends SingleFreeWrap - implements HasPayload, ToDataModel -{ - /** - * Create a signature from its payload and public key. This function **does not sign the payload**. - */ - public static fromBytes(publicKey: PublicKey, payload: Bytes): Signature { - return new Signature(wasmPkg.Signature.from_bytes(publicKey.inner, payload.wasm)) - } - - public static fromJSON(json: wasmPkg.SignatureJson): Signature { - return new Signature(wasmPkg.Signature.from_json(json)) - } - - public static fromDataModel(signature: datamodel.Signature): Signature { - return freeScope((scope) => { - const publicKey = PublicKey.fromDataModel(signature.public_key) - const result = Signature.fromBytes(publicKey, Bytes.array(signature.payload)) - scope.forget(result) - return result - }) - } - - /** - * Creates an actual signature, signing the payload - */ - public static create(keyPair: KeyPair, payload: Bytes) { - let value = new wasmPkg.Signature(keyPair.inner, payload.wasm) - return new Signature(value) - } - - public verify(message: Bytes): wasmPkg.VerifyResult { - return this.inner.verify(message.wasm) - } - - public publicKey(): PublicKey { - return new PublicKey(this.inner.public_key()) - } - - public payload(): Uint8Array - public payload(mode: 'hex'): string - public payload(mode?: 'hex'): string | Uint8Array { - return mode === 'hex' ? this.inner.payload_hex() : this.inner.payload() - } - - public toDataModel(): datamodel.Signature { - return freeScope(() => - datamodel.Signature({ - public_key: this.publicKey().toDataModel(), - payload: this.payload(), - }), - ) - } - - public toJSON(): wasmPkg.SignatureJson { - return this.inner.to_json() - } -} diff --git a/packages/crypto/packages/interface-wrap/src/wasm-pack-proxy-shim.d.ts b/packages/crypto/packages/interface-wrap/src/wasm-pack-proxy-shim.d.ts deleted file mode 100644 index 9a1894a7..00000000 --- a/packages/crypto/packages/interface-wrap/src/wasm-pack-proxy-shim.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '@iroha2/crypto-interface-wrap/~wasm-pack-proxy' { - import * as wasmPkg from '@iroha2/crypto/~wasm-pkg/nodejs' - export { wasmPkg } -} diff --git a/packages/crypto/packages/target-bundler/CHANGELOG.md b/packages/crypto/packages/target-bundler/CHANGELOG.md deleted file mode 100644 index fdaa3ad0..00000000 --- a/packages/crypto/packages/target-bundler/CHANGELOG.md +++ /dev/null @@ -1,185 +0,0 @@ -# @iroha2/crypto-target-bundler - -## 2.0.0 - -### Major Changes - -- 787a198: **Breaking:** Complete rewrite of crypto WASM, and major update of the surrounding API. - - - Now WASM is made from the original `iroha_crypto` from Iroha 2 repo. As one of the outcomes, binary blob size is reduced from 2mb to 600kb. - - Remove `KeyGenConfiguration`. Use `KeyPair.deriveFromSeed`, `KeyPair.deriveFromPrivateKey`, and `KeyPair.random` instead. - - Normalise API across `PublicKey`, `PrivateKey`, `KeyPair`, and `Signature` classes (JSON methods, raw conversion methods etc.) - - Introduce `Bytes` utility to accept binary input either as `Bytes.array([1, 2, 3])` or `Bytes.hex('001122')` - - Export more types¡ - - See the [issue](https://github.com/hyperledger/iroha-javascript/issues/186) for related context. - -### Patch Changes - -- Updated dependencies [787a198] - - @iroha2/crypto-core@2.0.0 - - @iroha2/data-model@7.1.0 - -## 1.1.1 - -### Patch Changes - -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] - - @iroha2/data-model@7.0.0 - - @iroha2/crypto-core@1.1.1 - -## 1.1.0 - -### Minor Changes - -- 40516f1: **refactor**: combine new `Algorithm` type and codec from `data-model` with the crypto's `Algorithm` type, which is simply a string. Add `Algorithm.toDataModel` and `Algorithm.fromDataModel` methods. - -### Patch Changes - -- Updated dependencies [40516f1] -- Updated dependencies [40516f1] - - @iroha2/data-model@6.0.0 - - @iroha2/crypto-core@1.1.0 - -## 1.0.1 - -### Patch Changes - -- Updated dependencies [d1e5f68] -- Updated dependencies [3ff768d] -- Updated dependencies [d1e5f68] - - @iroha2/data-model@5.0.0 - - @iroha2/crypto-core@1.0.1 - -## 1.0.0 - -### Major Changes - -- ddfeeac: **feature**: re-write WASM and provide high-level wrappers around it. - - #### What the braking change is - - Each target now provides high-level wrappers around raw `wasm-pack` artifacts. These wrappers provide a better-designed interface with features like global `.free()`-objects tracking and integration with `@iroha2/data-model`. - - Moreover, the WASM itself is re-written and now provides more flexibility, such as working with JSON and HEX representations out of the box. - - Here you can see how `@iroha2/crypto-core` and `@iroha2/crypto-target-*` are connected: - - ```ts - import { IrohaCryptoInterface, cryptoTypes } from '@iroha2/crypto-core' - import { crypto } from '@iroha2/crypto-target-node' - - // each target exports `crypto`, which is the `IrohaCryptoInterface` type from - // the core library - const cryptoAsserted: IrohaCryptoInterface = crypto - - // the core library exports `cryptoTypes` namespace which contains all the types - // used in crypto you might need - const hash: cryptoTypes.Hash = crypto.Hash.hash('hex', '00ff') - ``` - - `@iroha2/crypto-core` re-exports `@iroha2/crypto-util`, a new library which contains (for now) only utilities to work with `.free()` tracking: - - ```ts - import { freeScope, FREE_HEAP } from '@iroha2/crypto-util' - import { crypto } from '@iroha2/crypto-target-web' - - const keyPair = freeScope((scope) => { - const pair = crypto.KeyGenConfiguration - // Create a configuration object that you can later `.free()` manually. - // It is automatically attached to the scope it is created within, - // so when the scope is over, everything attached to it will be freed. - .default() - .useSeed('hex', 'ff') - // Create a new `.free()` object: a key pair - .generate() - - // to use the key pair (and nothing else) out of scope, - // you need to "untrack" it - scope.forget(pair) - - return pair - }) - - // inspect the heap in order to determine if there are memory leaks - if (FREE_HEAP.size > 1) { - console.log('Something went wrong, I guess?') - } - ``` - - #### Why the change was made - - Codegen of `wasm_bindgen` is very limited. This change is made to provide a better quality and safer API over crypto WASM. - - #### How a consumer should update their code - - Unfortunately, the code should be updated completely. Here are some major points you should note. - - `IrohaCryptoInterface` type from the core package is still the same as `crypto` export from target packages, but the content of the type is completely different. - - Previously, types such as `Hash`, `Signature`, `PublicKey` were separate exports from the core library. Now they are contained within the `cryptoTypes` namespace: - - ```ts - // doesn't work anymore - // import { Hash } from '@iroha2/crypto-core' - - import { cryptoTypes } from '@iroha2/crypto-core' - - type Hash = cryptoTypes.Hash - ``` - -### Patch Changes - -- Updated dependencies [ddfeeac] - - @iroha2/crypto-core@1.0.0 - - @iroha2/data-model@4.1.0 - -## 0.4.0 - -## 0.3.0 - -### Minor Changes - -- a99d219: **fix!**: define `exports` field; use `*.cjs` extension for `require()` imports and `*.mjs` for `import` - -## 0.2.0 - -### Minor Changes - -- 6f6163f: **BREAKING:** - - - Package contents are moved to `dist` directory; - - Compiled WASM is moved to `dist/wasm` directory. - - Compiled WASM is renamed to `crypto` (from `wasm_pack_output`) - - **How to migrate:** - - - If you have imported WASMs like this: - - ```ts - import rawWasm from '@iroha2/crypto-target-*/wasm_pack_output_bg.wasm' - ``` - - then now you should change import path: - - ```ts - import rawWasm from '@iroha2/crypto-target-*/dist/wasm/crypto_bg.wasm' - ``` - -### Patch Changes - -- 49c8451: fix: make `@iroha2/crypto-core` a prod dependency, not a dev -- 6f6163f: rebuild WASM -- 49c8451: chore: include only necessary files into `files` field in the `package.json` -- Updated dependencies [49c8451] - - @iroha2/crypto-core@0.1.1 - -## 0.1.1 - -### Patch Changes - -- 98d3638: recompile wasms diff --git a/packages/crypto/packages/target-bundler/README.md b/packages/crypto/packages/target-bundler/README.md deleted file mode 100644 index 7c077898..00000000 --- a/packages/crypto/packages/target-bundler/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# `@iroha2/crypto-target-bundler` - -The `@iroha2/crypto-target-bundler` package contains a crypto WASM compiled with the `bundler` target. -This package provides crypto interface for bundlers such as Webpack. - -## Usage - -```ts -import { crypto } from '@iroha2/crypto-target-bundler'; -``` - -See [`@iroha2/crypto-core`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/core) package for details. diff --git a/packages/crypto/packages/target-bundler/package.json b/packages/crypto/packages/target-bundler/package.json deleted file mode 100644 index f361bc9f..00000000 --- a/packages/crypto/packages/target-bundler/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@iroha2/crypto-target-bundler", - "version": "2.0.0", - "module": "dist/lib.mjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "types": "./dist/lib.d.ts" - }, - "./*": "./dist/*" - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "dependencies": { - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/data-model": "workspace:^7.1.0" - }, - "devDependencies": { - "@iroha2/crypto-interface-wrap": "workspace:^0.0.0" - } -} diff --git a/packages/crypto/packages/target-bundler/src/lib.ts b/packages/crypto/packages/target-bundler/src/lib.ts deleted file mode 100644 index 47b86c26..00000000 --- a/packages/crypto/packages/target-bundler/src/lib.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as crypto from '@iroha2/crypto-interface-wrap' -export * as wasmPkg from '@iroha2/crypto/~wasm-pkg/bundler' diff --git a/packages/crypto/packages/target-node/package.json b/packages/crypto/packages/target-node/package.json deleted file mode 100644 index c89f2035..00000000 --- a/packages/crypto/packages/target-node/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@iroha2/crypto-target-node", - "version": "2.0.0", - "module": "dist/lib.mjs", - "main": "dist/lib.cjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "require": "./dist/lib.cjs", - "types": "./dist/lib.d.ts" - }, - "./*": "./dist/*" - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "dependencies": { - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/data-model": "workspace:^7.1.0" - }, - "devDependencies": { - "@iroha2/crypto-interface-wrap": "workspace:^0.0.0" - } -} diff --git a/packages/crypto/packages/target-node/src/lib.ts b/packages/crypto/packages/target-node/src/lib.ts deleted file mode 100644 index b3d38ab1..00000000 --- a/packages/crypto/packages/target-node/src/lib.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as crypto from '@iroha2/crypto-interface-wrap' -export * as wasmPkg from '@iroha2/crypto/~wasm-pkg/nodejs' diff --git a/packages/crypto/packages/target-web/CHANGELOG.md b/packages/crypto/packages/target-web/CHANGELOG.md deleted file mode 100644 index f11ec44a..00000000 --- a/packages/crypto/packages/target-web/CHANGELOG.md +++ /dev/null @@ -1,187 +0,0 @@ -# @iroha2/crypto-target-web - -## 2.0.0 - -### Major Changes - -- 787a198: **Breaking:** Complete rewrite of crypto WASM, and major update of the surrounding API. - - - Now WASM is made from the original `iroha_crypto` from Iroha 2 repo. As one of the outcomes, binary blob size is reduced from 2mb to 600kb. - - Remove `KeyGenConfiguration`. Use `KeyPair.deriveFromSeed`, `KeyPair.deriveFromPrivateKey`, and `KeyPair.random` instead. - - Normalise API across `PublicKey`, `PrivateKey`, `KeyPair`, and `Signature` classes (JSON methods, raw conversion methods etc.) - - Introduce `Bytes` utility to accept binary input either as `Bytes.array([1, 2, 3])` or `Bytes.hex('001122')` - - Export more types¡ - - See the [issue](https://github.com/hyperledger/iroha-javascript/issues/186) for related context. - -### Patch Changes - -- Updated dependencies [787a198] - - @iroha2/crypto-core@2.0.0 - - @iroha2/data-model@7.1.0 - -## 1.1.1 - -### Patch Changes - -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] -- Updated dependencies [e0459fa] - - @iroha2/data-model@7.0.0 - - @iroha2/crypto-core@1.1.1 - -## 1.1.0 - -### Minor Changes - -- 40516f1: **refactor**: combine new `Algorithm` type and codec from `data-model` with the crypto's `Algorithm` type, which is simply a string. Add `Algorithm.toDataModel` and `Algorithm.fromDataModel` methods. - -### Patch Changes - -- Updated dependencies [40516f1] -- Updated dependencies [40516f1] - - @iroha2/data-model@6.0.0 - - @iroha2/crypto-core@1.1.0 - -## 1.0.1 - -### Patch Changes - -- Updated dependencies [d1e5f68] -- Updated dependencies [3ff768d] -- Updated dependencies [d1e5f68] - - @iroha2/data-model@5.0.0 - - @iroha2/crypto-core@1.0.1 - -## 1.0.0 - -### Major Changes - -- ddfeeac: **feature**: re-write WASM and provide high-level wrappers around it. - - #### What the braking change is - - Each target now provides high-level wrappers around raw `wasm-pack` artifacts. These wrappers provide a better-designed interface with features like global `.free()`-objects tracking and integration with `@iroha2/data-model`. - - Moreover, the WASM itself is re-written and now provides more flexibility, such as working with JSON and HEX representations out of the box. - - Here you can see how `@iroha2/crypto-core` and `@iroha2/crypto-target-*` are connected: - - ```ts - import { IrohaCryptoInterface, cryptoTypes } from '@iroha2/crypto-core' - import { crypto } from '@iroha2/crypto-target-node' - - // each target exports `crypto`, which is the `IrohaCryptoInterface` type from - // the core library - const cryptoAsserted: IrohaCryptoInterface = crypto - - // the core library exports `cryptoTypes` namespace which contains all the types - // used in crypto you might need - const hash: cryptoTypes.Hash = crypto.Hash.hash('hex', '00ff') - ``` - - `@iroha2/crypto-core` re-exports `@iroha2/crypto-util`, a new library which contains (for now) only utilities to work with `.free()` tracking: - - ```ts - import { freeScope, FREE_HEAP } from '@iroha2/crypto-util' - import { crypto } from '@iroha2/crypto-target-web' - - const keyPair = freeScope((scope) => { - const pair = crypto.KeyGenConfiguration - // Create a configuration object that you can later `.free()` manually. - // It is automatically attached to the scope it is created within, - // so when the scope is over, everything attached to it will be freed. - .default() - .useSeed('hex', 'ff') - // Create a new `.free()` object: a key pair - .generate() - - // to use the key pair (and nothing else) out of scope, - // you need to "untrack" it - scope.forget(pair) - - return pair - }) - - // inspect the heap in order to determine if there are memory leaks - if (FREE_HEAP.size > 1) { - console.log('Something went wrong, I guess?') - } - ``` - - #### Why the change was made - - Codegen of `wasm_bindgen` is very limited. This change is made to provide a better quality and safer API over crypto WASM. - - #### How a consumer should update their code - - Unfortunately, the code should be updated completely. Here are some major points you should note. - - `IrohaCryptoInterface` type from the core package is still the same as `crypto` export from target packages, but the content of the type is completely different. - - Previously, types such as `Hash`, `Signature`, `PublicKey` were separate exports from the core library. Now they are contained within the `cryptoTypes` namespace: - - ```ts - // doesn't work anymore - // import { Hash } from '@iroha2/crypto-core' - - import { cryptoTypes } from '@iroha2/crypto-core' - - type Hash = cryptoTypes.Hash - ``` - -### Patch Changes - -- Updated dependencies [ddfeeac] - - @iroha2/crypto-core@1.0.0 - - @iroha2/data-model@4.1.0 - -## 0.4.0 - -## 0.3.0 - -### Minor Changes - -- a99d219: **fix!**: define `exports` field; use `*.cjs` extension for `require()` imports and `*.mjs` for `import` - -### Patch Changes - -- 09f04df: **fix**: move `@iroha2/crypto-core` to direct dependencies - -## 0.2.0 - -### Minor Changes - -- 6f6163f: **BREAKING:** - - - Package contents are moved to `dist` directory; - - Compiled WASM is moved to `dist/wasm` directory. - - Compiled WASM is renamed to `crypto` (from `wasm_pack_output`) - - **How to migrate:** - - - If you have imported WASMs like this: - - ```ts - import rawWasm from '@iroha2/crypto-target-*/wasm_pack_output_bg.wasm' - ``` - - then now you should change import path: - - ```ts - import rawWasm from '@iroha2/crypto-target-*/dist/wasm/crypto_bg.wasm' - ``` - -### Patch Changes - -- 49c8451: fix: make `@iroha2/crypto-core` a prod dependency, not a dev -- 6f6163f: rebuild WASM -- 49c8451: chore: include only necessary files into `files` field in the `package.json` - -## 0.1.1 - -### Patch Changes - -- 98d3638: recompile wasms diff --git a/packages/crypto/packages/target-web/README.md b/packages/crypto/packages/target-web/README.md deleted file mode 100644 index 69925e49..00000000 --- a/packages/crypto/packages/target-web/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# `@iroha2/crypto-target-web` - -The `@iroha2/crypto-target-web` contains a crypto WASM compiled for the `web` target. -This package provides crypto interface for native Web (ESM). - -## Usage - -```ts -import { crypto, init } from '@iroha2/crypto-target-web' - -init().then(() => { - // use crypto -}) -``` - -> Due to a known [issue](https://github.com/hyperledger/iroha-javascript/issues/104) with [Vite](https://vitejs.dev/), you need to initialise WASM this way: -> -> ```ts -> import { crypto, init } from '@iroha2/crypto-target-web' -> import wasmUrl from '@iroha2/crypto-target-web/wasm-pkg/iroha_crypto_bg.wasm?url' -> -> await init(wasmUrl) -> ``` - -See [`@iroha2/crypto-core`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/core) package for details. diff --git a/packages/crypto/packages/target-web/package.json b/packages/crypto/packages/target-web/package.json deleted file mode 100644 index 6d028c8a..00000000 --- a/packages/crypto/packages/target-web/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@iroha2/crypto-target-web", - "version": "2.0.0", - "module": "dist/lib.mjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "types": "./dist/lib.d.ts" - }, - "./*": "./dist/*" - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "dependencies": { - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/data-model": "workspace:^7.1.0" - }, - "devDependencies": { - "@iroha2/crypto-interface-wrap": "workspace:^0.0.0" - } -} diff --git a/packages/crypto/packages/target-web/src/lib.ts b/packages/crypto/packages/target-web/src/lib.ts deleted file mode 100644 index 677f87b2..00000000 --- a/packages/crypto/packages/target-web/src/lib.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as crypto from '@iroha2/crypto-interface-wrap' -export * as wasmPkg from '@iroha2/crypto/~wasm-pkg/web' -export { default as init } from '@iroha2/crypto/~wasm-pkg/web' diff --git a/packages/crypto/packages/util/CHANGELOG.md b/packages/crypto/packages/util/CHANGELOG.md deleted file mode 100644 index bd48cd54..00000000 --- a/packages/crypto/packages/util/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# @iroha2/crypto-util - -## 0.2.0 - -### Minor Changes - -- 787a198: **feat:** add `Bytes` util class. Use `Bytes.hex` or `Bytes.array` to pass byte input in a convenient way. diff --git a/packages/crypto/packages/util/README.md b/packages/crypto/packages/util/README.md deleted file mode 100644 index 2f23d3c6..00000000 --- a/packages/crypto/packages/util/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# `@iroha2/crypto-util` - -Utilities shared across crypto packages. - -## Usage - -```ts -import { freeScope } from '@iroha2/crypto-util' -``` - -See [`@iroha2/crypto-core`](https://github.com/hyperledger/iroha-javascript/tree/iroha2/packages/crypto/packages/core) package for details. - -### Work with `Free`s - -All WASM objects have `.free()` method to trigger manual deallocation: - -```ts -interface Free { - free: () => void -} -``` - -#### Wrap everything with `FreeGuard` - -`FreeGuard` is a wrapper around any `Free` object which: - -- gives access to the inner object -- throws a friendly error when the object is freed (more friendly than a Rust panic in WASM) -- tracks itself in the global [`FREE_HEAP`](#inspect-active-guards-in-freeheap) -- attaches itself to the current [scope](#scope-guards) if there is any - -```ts -import { FreeGuard, freeScope, FREE_HEAP, Free } from '@iroha2/crypto-util' - -declare const wasmObject: Free & { do_stuff: () => void } - -// add this guard to the current scope -const guard = new FreeGuard(wasmObject) - -// access the object -guard.object.do_stuff() - -// call `.free()` on the guard to: -// - call `.free()` on the guarded object itself, i.e. `guard.object.free()` -// - clear tracks, i.e. remove the guard from `FREE_HEAP` and from the scope (if there is any) -// - empty the guard, i.e. remove the guarded object and make it unusable -// so that it could no longer be accessed with `guard.object` -guard.free() - -// same as `guard.free()` but without calling `.free()` on the guarded object itself -guard.forget() -``` - -**Note**: You should not call `.free()` on the inner object. You should call it on the guard instead: - -```ts -// ✓ CORRECT -guard.free() - -// ❌ WRONG -guard.object.free() -``` - -**Note**: `.forget()` method could be used if you want to "untrack" the guard everywhere without freeing the object itself. - -#### Scope guards - -You don't need to manually call `.free()` on each guard you create. You can create them within a scope: - -```ts -import { freeScope, FreeGuard } from '@iroha2/crypto-util' - -const { barGuard } = freeScope((scope) => { - const fooGuard = new FreeGuard(foo) - const barGuard = new FreeGuard(bar) - - // explicitly specify the object that you do not want to - // be freed when the scope is over - scope.forget(barGuard) - - return { barGuard } -}) - -// voila! -// `fooGuard` is freed automatically, while `barGuard` could still be used here -``` - -You can also use `FreeScope` API without `freeScope()`: - -```ts -import { FreeScope } from '@iroha2/crypto-util' - -const scope = new FreeScope() - -scope.track(foo) -scope.track(bar) - -// free every tracked object -scope.free() -``` - -#### Inspect active guards in `FREE_HEAP` - -All `FreeGuard`s are automatically added into the global const `FREE_HEAP` set. You can inspect it in order to detect what you forgot to free: - -```ts -import { FREE_HEAP } from '@iroha2/crypto-util' - -for (const guard of FREE_HEAP) { - console.log('Ooops:', { guard }) - guard.free() -} -``` diff --git a/packages/crypto/packages/util/package.json b/packages/crypto/packages/util/package.json deleted file mode 100644 index d8fa8e75..00000000 --- a/packages/crypto/packages/util/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@iroha2/crypto-util", - "version": "0.2.0", - "module": "dist/lib.mjs", - "main": "dist/lib.cjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "require": "./dist/lib.cjs", - "types": "./dist/lib.d.ts" - } - }, - "files": [ - "dist", - "CHANGELOG.md" - ] -} diff --git a/packages/crypto/packages/util/src/free.spec.ts b/packages/crypto/packages/util/src/free.spec.ts deleted file mode 100644 index 36e88c6e..00000000 --- a/packages/crypto/packages/util/src/free.spec.ts +++ /dev/null @@ -1,206 +0,0 @@ -/* eslint-disable max-nested-callbacks,no-new */ -import { beforeEach, describe, expect, test, vi } from 'vitest' -import { FREE_HEAP, FreeGuard, FreeScope, freeScope } from './free' - -function dummyFree() { - return { - free: vi.fn(), - } -} - -function dummyAccessor() { - return { - guard: new FreeGuard(dummyFree()), - [FreeScope.getInnerTrackObject]() { - return this.guard - }, - } -} - -describe('Test `.free()` utilities', () => { - beforeEach(() => { - FREE_HEAP.forEach((a) => a.free()) - FREE_HEAP.clear() - }) - - describe('when FreeGuard is created', () => { - test('then it is added to the heap', () => { - const guard = new FreeGuard(dummyFree()) - - expect(FREE_HEAP.has(guard)).toBe(true) - }) - - test('within a scope, then it is freed with the scope', () => { - const dummy = dummyFree() - - freeScope(() => { - new FreeGuard(dummy) - }) - - expect(dummy.free).toBeCalled() - }) - }) - - describe('when FreeGuard is freed', () => { - test('then the underlying object is freed too', () => { - const dummy = dummyFree() - const guard = new FreeGuard(dummy) - - guard.free() - - expect(dummy.free).toBeCalled() - }) - - test('then it is deleted from the heap', () => { - const guard = new FreeGuard(dummyFree()) - - guard.free() - - expect(FREE_HEAP.has(guard)).toBe(false) - }) - }) - - describe('when FreeGuard is forgotten by itself', () => { - test('then it is deleted from the heap', () => { - const guard = new FreeGuard(dummyFree()) - - guard.forget() - - expect(FREE_HEAP.has(guard)).toBe(false) - }) - - test('then the underlying object is not freed', () => { - const dummy = dummyFree() - const guard = new FreeGuard(dummy) - - guard.forget() - - expect(dummy.free).not.toBeCalled() - }) - - test('then the object is not freed even in the scope', () => { - const dummy = dummyFree() - - freeScope(() => { - new FreeGuard(dummy).forget() - }) - - expect(dummy.free).not.toBeCalled() - }) - }) - - test('when scope is disposed, all guards are freed', () => { - const dummies = Array.from({ length: 5 }, () => dummyFree()) - - freeScope(() => { - dummies.map((a) => new FreeGuard(a)) - }) - - for (const dummy of dummies) expect(dummy.free).toBeCalled() - }) - - test('when scope is disposed and some guard was "forgotten" by the scope, then it is not freed', () => { - const dummy = dummyFree() - - freeScope((scope) => { - const guard = new FreeGuard(dummy) - scope.forget(guard) - }) - - expect(dummy.free).not.toBeCalled() - }) - - test('when scope is disposed within another scope, only inner objects are freed', () => { - const dummy1 = dummyFree() - const dummy2 = dummyFree() - - freeScope(() => { - new FreeGuard(dummy1) - - freeScope(() => { - new FreeGuard(dummy2) - }) - - expect(dummy2.free).toBeCalled() - expect(dummy1.free).not.toBeCalled() - }) - - expect(dummy1.free).toBeCalled() - }) - - test('case with nested scopes, forgetting and tracking back', () => { - const guard = freeScope((scope) => { - const inner = freeScope((scope) => { - new FreeGuard(dummyFree()) - const guard = new FreeGuard(dummyFree()) - scope.forget(guard) - return guard - }) - - expect(inner.object.free).not.toBeCalled() - - // not necessary - it is tracked by parent scope by default - // scope.track(inner) - - const outer = new FreeGuard(dummyFree()) - scope.forget(outer) - return outer - }) - - expect(guard.object.free).not.toBeCalled() - - guard.free() - - expect(FREE_HEAP.size).toBe(0) - }) - - describe('Accessing inner track object', () => { - test('It could be tracked by scope', () => { - const accessor = dummyAccessor() - const { free } = accessor.guard.object - const scope = new FreeScope() - - scope.track(accessor) - scope.free() - - expect(free).toBeCalled() - }) - - test('It could be forgotten by scope', () => { - const accessor = dummyAccessor() - const scope = new FreeScope() - - scope.track(accessor) - scope.forget(accessor) - scope.free() - - expect(accessor.guard.object.free).not.toBeCalled() - }) - }) - - test('When an object is forgotten in the nested scope, it is tracked by the parent ones', () => { - freeScope(() => { - freeScope((scope) => { - const guard = new FreeGuard(dummyFree()) - scope.forget(guard) - }) - - expect(FREE_HEAP.size).toBe(1) - }) - - expect(FREE_HEAP.size).toBe(0) - }) - - test('When an object is forgotten and not adopted in the nested scope, it is not tracked by the parent ones', () => { - freeScope(() => - freeScope(() => - freeScope((scope) => { - const guard = new FreeGuard(dummyFree()) - scope.forget(guard, { adopt: false }) - }), - ), - ) - - expect(FREE_HEAP.size).toBe(1) - }) -}) diff --git a/packages/crypto/packages/util/src/free.ts b/packages/crypto/packages/util/src/free.ts deleted file mode 100644 index 78e8eb79..00000000 --- a/packages/crypto/packages/util/src/free.ts +++ /dev/null @@ -1,179 +0,0 @@ -export interface Free { - free: () => void -} - -export class FreeScope implements Free { - public static readonly getInnerTrackObject = Symbol('GetInnerTrackObject') - - public static readonly trackObject = Symbol('TrackObject') - - #tracked = new Set() - #parent: null | FreeScope - - public constructor(parentScope: null | FreeScope = null) { - this.#parent = parentScope - } - - public track(object: TrackObjectOrInner): void { - this.#tracked.add(unwrapTrackObject(object)) - } - - /** - * Removes the object from being tracked by the scope, preventing the object from - * being freed when the scope is freed. - */ - public forget( - object: TrackObjectOrInner, - options?: { - /** - * if `true` and the object is not tracked, throws an error - * @default true - */ - strict?: boolean - /** - * "Adopting" means that if the object is forgotten by the current scope, it will be tracked by the parent one, - * if there is some. - * @default true - */ - adopt?: boolean - }, - ): void { - const unwrapped = unwrapTrackObject(object) - if (this.#tracked.has(unwrapped)) { - this.#tracked.delete(unwrapped) - if (options?.adopt ?? true) this.#parent?.track(unwrapped) - } else if (options?.strict ?? true) throw new Error(`The object ${String(unwrapped)} is not tracked`) - } - - public free(): void { - for (const object of this.#tracked) { - object.free() - } - } -} - -export interface GetInnerTrackObject { - [FreeScope.getInnerTrackObject]: () => TrackObjectOrInner -} - -export interface TrackObject extends Free { - [FreeScope.trackObject]: true -} - -export type TrackObjectOrInner = TrackObject | GetInnerTrackObject - -function unwrapTrackObject(object: TrackObjectOrInner): TrackObject { - let i = object - while (!(FreeScope.trackObject in i)) { - i = i[FreeScope.getInnerTrackObject]() - } - return i -} - -export const FREE_HEAP = new Set>() - -/** - * Wrapper around a free-able object to control its access, - * to track in a global heap (see {@link FREE_HEAP}), and to track - * within scopes (see {@link FreeScope}). - */ -export class FreeGuard implements TrackObject { - public readonly [FreeScope.trackObject] = true - - #maybeInner: null | { - object: T - scope: null | FreeScope - } - - public constructor(object: T) { - const scope = getCurrentFreeScope() - this.#maybeInner = { object, scope } - scope?.track(this) - FREE_HEAP.add(this) - } - - /** - * Getter to access the underlying object - * - * # Errors - * - * Throws if the guard was freed or forgotten - */ - public get object(): T { - if (!this.#maybeInner) { - throw new Error('The underlying object is missing') - } - return this.#maybeInner.object - } - - /** - * Frees the underlying object and calls {@link forget} - */ - public free(): void { - const obj = this.object - obj.free() - this.forget() - } - - /** - * Removes the guard from {@link FREE_HEAP} and the attached scope (if there is) - * and removes the ability to access the underlying object. - * - * Same as {@link free}, but doesn't call {@link Free.free} on the underlying object. - */ - public forget(): void { - if (!this.#maybeInner) throw new Error('Already forgotten') - const { scope } = this.#maybeInner - FREE_HEAP.delete(this) - scope?.forget(this, { strict: false, adopt: false }) - this.#maybeInner = null - } -} - -const SCOPES_STACK: FreeScope[] = [] - -export function getCurrentFreeScope(): FreeScope | null { - return SCOPES_STACK.at(-1) ?? null -} - -/** - * Runs the provided function, tracking all trackable (see {@link TrackObject}) objets that - * *synchronously* bind to the scope during the function execution. When the execution is over - * (even if it is failed), all tracked objects are freed. - * - * Scopes might be nested into each other. - * - * In order to exclude some object from being freed with the scope, - * or to include it explicitly into the scope, the scope itself is passed - * as first parameter: - * - * ```ts - * let excluded, automaticallyFreed - * - * const included = new FreeGuard() - * - * freeScope((scope) => { - * automaticallyFreed = new FreeGuard({ ... }) - * excluded = new FreeGuard({ ... }) - * - * scope.forget(excluded) - * scope.track(included) - * }) - * - * // at this point, `automaticallyFreed` and `included` are freed, but `excluded` is not - * ``` - * - * Note that `forget` callback does not execute {@link FreeGuard.forget}, but {@link FreeGuard.forget} - * removes the guard from the scope. - */ -export function freeScope(fn: (scope: FreeScope) => T): T { - const scope = new FreeScope(getCurrentFreeScope()) - SCOPES_STACK.push(scope) - - try { - return fn(scope) - } finally { - scope.free() - SCOPES_STACK.pop() - } -} diff --git a/packages/crypto/packages/util/src/lib.ts b/packages/crypto/packages/util/src/lib.ts deleted file mode 100644 index f4a2e60d..00000000 --- a/packages/crypto/packages/util/src/lib.ts +++ /dev/null @@ -1,26 +0,0 @@ -export * from './free' - -export type WasmBytes = { t: 'array'; c: Uint8Array } | { t: 'hex'; c: string } - -/** - * Helper to work with binary data passed into the WASM - */ -export class Bytes { - public static array(data: Uint8Array): Bytes { - return new Bytes({ t: 'array', c: data }) - } - - public static hex(hex: string): Bytes { - return new Bytes({ t: 'hex', c: hex }) - } - - #data: WasmBytes - - private constructor(data: WasmBytes) { - this.#data = data - } - - public get wasm(): WasmBytes { - return this.#data - } -} diff --git a/packages/crypto/test/integration/interfaces/CHANGELOG.md b/packages/crypto/test/integration/interfaces/CHANGELOG.md deleted file mode 100644 index 91742ea1..00000000 --- a/packages/crypto/test/integration/interfaces/CHANGELOG.md +++ /dev/null @@ -1,6 +0,0 @@ -# @iroha2/crypto-test-interfaces - -## 0.0.1 -### Patch Changes - -- 1833de7: Make internal packages private, clean their `package.json`s diff --git a/packages/crypto/test/integration/interfaces/package.json b/packages/crypto/test/integration/interfaces/package.json deleted file mode 100644 index d1a63a51..00000000 --- a/packages/crypto/test/integration/interfaces/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@iroha2/crypto-test-interfaces", - "private": true, - "scripts": { - "test": "tsc --noEmit" - }, - "devDependencies": { - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/crypto-target-bundler": "workspace:^2.0.0", - "@iroha2/crypto-target-node": "workspace:^2.0.0", - "@iroha2/crypto-target-web": "workspace:^2.0.0" - } -} diff --git a/packages/crypto/test/integration/interfaces/test/main.ts b/packages/crypto/test/integration/interfaces/test/main.ts deleted file mode 100644 index 0c5c0fae..00000000 --- a/packages/crypto/test/integration/interfaces/test/main.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable no-lone-blocks */ -import { IrohaCryptoInterface } from '@iroha2/crypto-core' -import { crypto as cryptoWeb, init as initWeb } from '@iroha2/crypto-target-web' -import { crypto as cryptoNode } from '@iroha2/crypto-target-node' -import { crypto as cryptoBundler } from '@iroha2/crypto-target-bundler' - -{ - /** - * We can't check for a strict equality for a some reason (maybe because - * namespaces with classes could not be identical in any way?). So, just - * to *extend* the core interface is enough. - */ - type ExpectToExtendCoreInterface = T - - type _test1 = ExpectToExtendCoreInterface - type _test2 = ExpectToExtendCoreInterface - type _test3 = ExpectToExtendCoreInterface -} - -{ - type ExpectToReturnPromise Promise> = T - - type _test1 = ExpectToReturnPromise -} diff --git a/packages/crypto/test/integration/interfaces/tsconfig.json b/packages/crypto/test/integration/interfaces/tsconfig.json deleted file mode 100644 index 53c0dc9f..00000000 --- a/packages/crypto/test/integration/interfaces/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "skipLibCheck": true, // there is too much fragility out of our control - "skipDefaultLibCheck": true - }, - "include": ["test"] -} diff --git a/packages/crypto/test/integration/test-node/CHANGELOG.md b/packages/crypto/test/integration/test-node/CHANGELOG.md deleted file mode 100644 index 2abc4dca..00000000 --- a/packages/crypto/test/integration/test-node/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# @iroha2/crypto-test-node - -## 0.0.1 - -### Patch Changes - -- 1833de7: Make internal packages private, clean their `package.json`s diff --git a/packages/crypto/test/integration/test-node/package.json b/packages/crypto/test/integration/test-node/package.json deleted file mode 100644 index aa9ac8a0..00000000 --- a/packages/crypto/test/integration/test-node/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@iroha2/crypto-test-node", - "private": true, - "devDependencies": { - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/crypto-target-node": "workspace:^2.0.0" - }, - "scripts": { - "test": "run-s test:types run:cjs run:mjs test:unit", - "run:cjs": "node test/run.cjs", - "run:mjs": "node test/run.mjs", - "test:unit": "vitest run main.spec", - "test:types": "tsc --noEmit" - } -} diff --git a/packages/crypto/test/integration/test-node/test/main.spec.ts b/packages/crypto/test/integration/test-node/test/main.spec.ts deleted file mode 100644 index 18dd47f0..00000000 --- a/packages/crypto/test/integration/test-node/test/main.spec.ts +++ /dev/null @@ -1,291 +0,0 @@ -/* eslint-disable max-nested-callbacks */ -import { afterAll, describe, expect, test } from 'vitest' -import { crypto } from '@iroha2/crypto-target-node' -import { Bytes, FREE_HEAP, freeScope } from '@iroha2/crypto-core' - -const { hex: bytesHex } = Bytes - -afterAll(() => { - expect(FREE_HEAP.size).toEqual(0) -}) - -describe('KeyPair generation', () => { - test('Derives from a seed as expected', () => { - const SEED_BYTES = [49, 50, 51, 52] - - const json = freeScope(() => crypto.KeyPair.deriveFromSeed(Bytes.array(Uint8Array.from(SEED_BYTES))).toJSON()) - - expect(json).toMatchInlineSnapshot(` - { - "private_key": { - "algorithm": "ed25519", - "payload": "01F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7", - }, - "public_key": "ed0120F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7", - } - `) - }) - - test('Derives from a private key as expected', () => { - const SAMPLE = { - algorithm: 'ed25519', - payload: - '01f2db2416255e79db67d5ac807e55459ed8754f07586864948aea00f6f81763f149bb4b59feb0ace3074f10c65e179880ea2c4fe4e0d6022b1e82c33c3278c7', - } satisfies crypto.PrivateKeyJson - - expect(freeScope(() => crypto.KeyPair.deriveFromPrivateKey(crypto.PrivateKey.fromJSON(SAMPLE)).toJSON())) - .toMatchInlineSnapshot(` - { - "private_key": { - "algorithm": "ed25519", - "payload": "01F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7", - }, - "public_key": "ed0120F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7", - } - `) - }) - - test('Generates randomly, in an expected, but also unexpected way', () => { - const pair = freeScope(() => crypto.KeyPair.random().toJSON()) - - expect(pair).toHaveProperty('public_key') - expect(pair).toHaveProperty('private_key.algorithm', 'ed25519') - expect(pair).toHaveProperty('private_key.payload') - }) -}) - -describe('Given a multihash', () => { - const MULTIHASH = 'ed0120797507786F9C6A4DE91B5462B8A6F7BF9AB21C22B853E9C992C2EF68DA5307F9' - - test('a public key could be constructed', () => { - freeScope(() => { - const key = crypto.PublicKey.fromMultihash(MULTIHASH) - - expect(key.algorithm).toMatchInlineSnapshot('"ed25519"') - expect(key.payload('hex')).toMatchInlineSnapshot( - '"797507786f9c6a4de91b5462b8a6f7bf9ab21c22b853e9c992c2ef68da5307f9"', - ) - expect(key.toMultihash()).toBe(MULTIHASH) - }) - }) - - test('a public key could be parsed and transformed back through JSON methods', () => { - expect(freeScope(() => crypto.PublicKey.fromJSON(MULTIHASH).toJSON())).toEqual(MULTIHASH) - }) -}) - -describe('Signature verification', () => { - function pairFactory() { - return freeScope((scope) => { - const pair = crypto.KeyPair.deriveFromSeed(Bytes.hex('aa1108')) - scope.forget(pair) - return pair - }) - } - - test('result is ok', () => { - const MESSAGE = 'deadbeef' - - const result = freeScope(() => pairFactory().sign(bytesHex(MESSAGE)).verify(bytesHex(MESSAGE))) - - expect(result).toMatchInlineSnapshot(` - { - "t": "ok", - } - `) - }) - - test('result is err', () => { - const result = freeScope(() => pairFactory().sign(bytesHex('deadbeef')).verify(bytesHex('feedbabe'))) - - expect(result).toMatchInlineSnapshot(` - { - "error": "Signature verification failed", - "t": "err", - } - `) - }) - - test('exception is thrown if input is invalid', () => { - freeScope(() => { - const signature = pairFactory().sign(bytesHex('deadbeef')) - - expect(() => signature.verify(bytesHex('not really a hex'))).toThrowErrorMatchingInlineSnapshot( - '"Invalid character \'n\' at position 0"', - ) - }) - }) -}) - -describe('JSON representation', () => { - test('for PublicKey is as expected', () => { - const SAMPLE = 'ed0120F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7' - - freeScope(() => { - expect(crypto.PublicKey.fromJSON(SAMPLE).toJSON()).toBe(SAMPLE) - }) - }) - - test('for PrivateKey is as expected', () => { - const SAMPLE = { - algorithm: 'ed25519', - payload: - '01F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7', - } - - freeScope(() => { - expect(crypto.PrivateKey.fromJSON(SAMPLE).toJSON()).toEqual(SAMPLE) - }) - }) - - test('for KeyPair is as expected', () => { - const SAMPLE = { - private_key: { - algorithm: 'ed25519', - payload: - '01F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7', - }, - public_key: 'ed0120F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7', - } - - freeScope(() => { - const kp = crypto.KeyPair.fromJSON(SAMPLE) - - expect(kp.publicKey().toMultihash()).toBe( - 'ed0120F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7', - ) - expect(kp.privateKey().algorithm).toBe('ed25519') - expect(kp.privateKey().payload('hex')).toBe( - '01f2db2416255e79db67d5ac807e55459ed8754f07586864948aea00f6f81763f149bb4b59feb0ace3074f10c65e179880ea2c4fe4e0d6022b1e82c33c3278c7', - ) - - expect(kp.toJSON()).toEqual(SAMPLE) - }) - }) - - test('for Signature is as expected', () => { - const SAMPLE = { - public_key: 'ed0120797507786F9C6A4DE91B5462B8A6F7BF9AB21C22B853E9C992C2EF68DA5307F9', - payload: - 'D0FBAC97DCC1C859C110DCF3C55ECFF6C28DD49B6E5560E2175A7F308A2214D3D4666C37F0EBFBEB24341A15E606D71780F992F151652ADBA39FE87E831A2000', - } - - freeScope(() => { - expect(crypto.Signature.fromJSON(SAMPLE).toJSON()).toEqual(SAMPLE) - }) - }) -}) - -describe('Data Model representation', () => { - test('Signature serializes as expected', () => { - freeScope(() => { - const cryptoSignature = crypto.KeyPair.deriveFromSeed(bytesHex('001122')).sign(bytesHex('112233')) - const dataModelSignature = cryptoSignature.toDataModel() - - expect(cryptoSignature.payload()).toEqual(dataModelSignature.payload) - expect(cryptoSignature.publicKey().algorithm).toBe('ed25519') - expect(dataModelSignature.public_key.digest_function.enum.tag).toBe('Ed25519') - expect(cryptoSignature.publicKey().payload()).toEqual(dataModelSignature.public_key.payload) - }) - }) -}) - -describe('Raw conversion', () => { - test('Construct PublicKey', () => { - const multihash = freeScope(() => - crypto.PublicKey.fromRaw( - 'ed25519', - bytesHex('A88D1B0D23BC1ADC564DE57CEDBF8FD7D045D0D698EF27E5D9C1807C1041E016'), - ).toMultihash(), - ) - - expect(multihash).toMatchInlineSnapshot('"ed0120A88D1B0D23BC1ADC564DE57CEDBF8FD7D045D0D698EF27E5D9C1807C1041E016"') - }) - - test('Fail to construct PublicKey', () => { - expect(() => - crypto.PublicKey.fromRaw( - 'bls_normal', - bytesHex('A88D1B0D23BC1ADC564DE57CEDBF8FD7D045D0D698EF27E5D9C1807C1041E016'), - ), - ).toThrowErrorMatchingInlineSnapshot('"the input buffer contained invalid data"') - }) - - test('Construct PrivateKey', () => { - const json = freeScope(() => - crypto.PrivateKey.fromBytes( - 'ed25519', - bytesHex( - '01f2db2416255e79db67d5ac807e55459ed8754f07586864948aea00f6f81763f149bb4b59feb0ace3074f10c65e179880ea2c4fe4e0d6022b1e82c33c3278c7', - ), - ).toJSON(), - ) - - expect(json).toMatchInlineSnapshot(` - { - "algorithm": "ed25519", - "payload": "01F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7", - } - `) - }) - - test('Fail to construct PrivateKey', () => { - expect(() => - crypto.PrivateKey.fromBytes( - 'secp256k1', - bytesHex( - '01f2db2416255e79db67d5ac807e55459ed8754f07586864948aea00f6f81763f149bb4b59feb0ace3074f10c65e179880ea2c4fe4e0d6022b1e82c33c3278c7', - ), - ), - ).toThrowErrorMatchingInlineSnapshot('"crypto error"') - }) - - test('Construct KeyPair', () => { - const json = freeScope(() => { - const kp = crypto.KeyPair.deriveFromSeed(bytesHex('deadbeef')) - return crypto.KeyPair.fromParts(kp.publicKey(), kp.privateKey()).toJSON() - }) - - expect(json).toMatchInlineSnapshot(` - { - "private_key": { - "algorithm": "ed25519", - "payload": "5DC9D5612F1F29AE846B12FC3CF59E831195AC4320DDA2DF7F2FA452A30FC5E1D05CDB30231BD9A257253E485432F44B139595981E04996DD795F38A1B4A011A", - }, - "public_key": "ed0120D05CDB30231BD9A257253E485432F44B139595981E04996DD795F38A1B4A011A", - } - `) - }) - - test('Fail to construct KeyPair', () => { - expect(() => - freeScope(() => { - const kp1 = crypto.KeyPair.deriveFromSeed(bytesHex('deadbeef'), { algorithm: 'bls_normal' }) - const kp2 = crypto.KeyPair.deriveFromSeed(bytesHex('beefdead')) - - // should fail here: - crypto.KeyPair.fromParts(kp1.publicKey(), kp2.privateKey()) - }), - ).toThrowErrorMatchingInlineSnapshot('"Key generation failed. Mismatch of key algorithms"') - }) - - test('Construct Signature', () => { - const SAMPLE_JSON = { - public_key: 'ed0120797507786F9C6A4DE91B5462B8A6F7BF9AB21C22B853E9C992C2EF68DA5307F9', - payload: - 'D0FBAC97DCC1C859C110DCF3C55ECFF6C28DD49B6E5560E2175A7F308A2214D3D4666C37F0EBFBEB24341A15E606D71780F992F151652ADBA39FE87E831A2000', - } - - const actual_json = freeScope(() => - crypto.Signature.fromBytes( - crypto.PublicKey.fromMultihash(SAMPLE_JSON.public_key), - bytesHex(SAMPLE_JSON.payload), - ).toJSON(), - ) - - expect(actual_json).toEqual(SAMPLE_JSON) - }) - - // TODO - test.todo('Failed to construct Signature... is it possible?') -}) diff --git a/packages/crypto/test/integration/test-node/test/run.cjs b/packages/crypto/test/integration/test-node/test/run.cjs deleted file mode 100644 index e6146a41..00000000 --- a/packages/crypto/test/integration/test-node/test/run.cjs +++ /dev/null @@ -1,7 +0,0 @@ -// we want to ensure that the Node target package works in CJS mode - -// eslint-disable-next-line @typescript-eslint/no-require-imports -const { crypto } = require('@iroha2/crypto-target-node') - -const hash = crypto.Hash.hash('hex', '0011224433').bytes('hex') -console.log('Sample hash:', hash) diff --git a/packages/crypto/test/integration/test-node/test/run.mjs b/packages/crypto/test/integration/test-node/test/run.mjs deleted file mode 100644 index 45d68858..00000000 --- a/packages/crypto/test/integration/test-node/test/run.mjs +++ /dev/null @@ -1,6 +0,0 @@ -// we want to ensure that the Node target package works in ESM mode - -import { crypto } from '@iroha2/crypto-target-node' - -const hash = crypto.Hash.hash('hex', '0011224433').bytes('hex') -console.log('Sample hash:', hash) diff --git a/packages/crypto/test/integration/test-node/tsconfig.json b/packages/crypto/test/integration/test-node/tsconfig.json deleted file mode 100644 index 6846a7ce..00000000 --- a/packages/crypto/test/integration/test-node/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "include": ["test"] -} diff --git a/packages/crypto/test/integration/test-web/.gitignore b/packages/crypto/test/integration/test-web/.gitignore deleted file mode 100644 index d451ff16..00000000 --- a/packages/crypto/test/integration/test-web/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -.DS_Store -dist -dist-ssr -*.local diff --git a/packages/crypto/test/integration/test-web/CHANGELOG.md b/packages/crypto/test/integration/test-web/CHANGELOG.md deleted file mode 100644 index 549c30f2..00000000 --- a/packages/crypto/test/integration/test-web/CHANGELOG.md +++ /dev/null @@ -1,6 +0,0 @@ -# @iroha2/crypto-test-web - -## 0.0.1 -### Patch Changes - -- 1833de7: Make internal packages private, clean their `package.json`s diff --git a/packages/crypto/test/integration/test-web/cypress.config.ts b/packages/crypto/test/integration/test-web/cypress.config.ts deleted file mode 100644 index 26be20fd..00000000 --- a/packages/crypto/test/integration/test-web/cypress.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'cypress' - -export default defineConfig({ - e2e: { - baseUrl: 'http://localhost:3030', - supportFile: false, - }, - video: false, - screenshotOnRunFailure: false, -}) diff --git a/packages/crypto/test/integration/test-web/cypress/e2e/main.cy.js b/packages/crypto/test/integration/test-web/cypress/e2e/main.cy.js deleted file mode 100644 index 32f6a58b..00000000 --- a/packages/crypto/test/integration/test-web/cypress/e2e/main.cy.js +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable spaced-comment */ -/// - -it("It doesn't fail and outputs the correct hex", () => { - cy.intercept('/api/config', { fixture: 'config' }).as('get-config') - - cy.visit('/').wait('@get-config') - - cy.fixture('public_key_hex').then((hex) => { - cy.contains(`Public key payload hex is: ${hex}`) - }) -}) diff --git a/packages/crypto/test/integration/test-web/cypress/fixtures/config.json b/packages/crypto/test/integration/test-web/cypress/fixtures/config.json deleted file mode 100644 index 504c1e37..00000000 --- a/packages/crypto/test/integration/test-web/cypress/fixtures/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "private_key": { - "digest_function": "ed25519", - "payload": "9ac47abf59b356e0bd7dcbbbb4dec080e302156a48ca907e47cb6aea1d32719e7233bfc89dcbd68c19fde6ce6158225298ec1131b6a130d1aeb454c1ab5183c0" - } -} diff --git a/packages/crypto/test/integration/test-web/cypress/fixtures/public_key_hex.txt b/packages/crypto/test/integration/test-web/cypress/fixtures/public_key_hex.txt deleted file mode 100644 index f42e290a..00000000 --- a/packages/crypto/test/integration/test-web/cypress/fixtures/public_key_hex.txt +++ /dev/null @@ -1 +0,0 @@ -7233bfc89dcbd68c19fde6ce6158225298ec1131b6a130d1aeb454c1ab5183c0 \ No newline at end of file diff --git a/packages/crypto/test/integration/test-web/index.html b/packages/crypto/test/integration/test-web/index.html deleted file mode 100644 index d1e964e6..00000000 --- a/packages/crypto/test/integration/test-web/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Vite App - - -
- - - diff --git a/packages/crypto/test/integration/test-web/package.json b/packages/crypto/test/integration/test-web/package.json deleted file mode 100644 index 4774234a..00000000 --- a/packages/crypto/test/integration/test-web/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@iroha2/crypto-test-web", - "private": true, - "scripts": { - "vite:dev": "vite --port 3030", - "vite:build": "vite build", - "vite:preview": "vite preview --port 3030", - "cy:run": "cypress run", - "test": "run-s vite:build test:start", - "test:start": "start-server-and-test vite:preview http://localhost:3030 cy:run" - }, - "devDependencies": { - "@iroha2/crypto-target-web": "workspace:^2.0.0", - "cypress": "^12.5.1", - "start-server-and-test": "^1.14.0", - "vite": "^5.1.5" - } -} diff --git a/packages/crypto/test/integration/test-web/src/main.ts b/packages/crypto/test/integration/test-web/src/main.ts deleted file mode 100644 index 5665b388..00000000 --- a/packages/crypto/test/integration/test-web/src/main.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { crypto, init } from '@iroha2/crypto-target-web' - -interface Config { - private_key: { - digest_function: string - payload: string - } -} - -await init() -const { private_key } = - // intercepted by Cypress - await fetch('/api/config').then((x) => x.json()) - -const payloadHex = crypto.PublicKey.fromPrivateKey(crypto.PrivateKey.fromJSON(private_key)).payload('hex') - -const app = document.querySelector('#app')! -app.innerHTML = `Public key payload hex is: ${payloadHex}` diff --git a/packages/crypto/test/integration/test-web/src/vite-env.d.ts b/packages/crypto/test/integration/test-web/src/vite-env.d.ts deleted file mode 100644 index 14fa7492..00000000 --- a/packages/crypto/test/integration/test-web/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -// / diff --git a/packages/crypto/test/integration/test-web/vite.config.ts b/packages/crypto/test/integration/test-web/vite.config.ts deleted file mode 100644 index d7225b9e..00000000 --- a/packages/crypto/test/integration/test-web/vite.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'vite' - -export default defineConfig({ - esbuild: { target: 'esnext' }, - build: { - target: 'esnext', - }, -}) diff --git a/packages/crypto/test/integration/tsconfig.base.json b/packages/crypto/test/integration/tsconfig.base.json deleted file mode 100644 index 52a27312..00000000 --- a/packages/crypto/test/integration/tsconfig.base.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../../../tsconfig.base.json" -} diff --git a/packages/data-model-rust-samples/.gitignore b/packages/data-model-rust-samples/.gitignore deleted file mode 100644 index ad22320a..00000000 --- a/packages/data-model-rust-samples/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -/samples.json diff --git a/packages/data-model-rust-samples/Cargo.lock b/packages/data-model-rust-samples/Cargo.lock deleted file mode 100644 index 01eb3bd9..00000000 --- a/packages/data-model-rust-samples/Cargo.lock +++ /dev/null @@ -1,1961 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher", -] - -[[package]] -name = "aes-gcm" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "amcl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee5cca1ddc8b9dceb55b7f1272a9d1e643d73006f350a20ab4926d24e33f0f0d" - -[[package]] -name = "amcl_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c7c7627444413f6a488bf9e6d352aea6fcfa281123cd92ecac0b3c9ef5ef2" -dependencies = [ - "byteorder", - "lazy_static", - "miracl_core", - "rand 0.7.3", - "rayon", - "serde", - "serde_bytes", - "serde_json", - "sha3 0.8.2", - "subtle-encoding", - "zeroize", -] - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding 0.2.1", - "generic-array 0.14.6", -] - -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding 0.2.1", - "cipher", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "bumpalo" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "c2-chacha" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "217192c943108d8b13bac38a1d51df9ce8a407a3f5a71ab633980665e68fbd9a" -dependencies = [ - "ppv-lite86", -] - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chacha20" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed8738f14471a99f0e316c327e68fc82a3611cc2895fcb604b89eedaf8f39d95" -dependencies = [ - "cipher", - "zeroize", -] - -[[package]] -name = "chacha20poly1305" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1fc18e6d90c40164bf6c317476f2a98f04661e310e79830366b7e914c58a8e" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "const-oid" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b" - -[[package]] -name = "cpufeatures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" -dependencies = [ - "libc", -] - -[[package]] -name = "cpuid-bool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" - -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" -dependencies = [ - "autocfg 1.1.0", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-bigint" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03" -dependencies = [ - "generic-array 0.14.6", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - -[[package]] -name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.38", -] - -[[package]] -name = "darling_macro" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "data-model-rust-samples" -version = "0.1.0" -dependencies = [ - "iroha_data_model", - "parity-scale-codec", - "serde", - "serde_json", -] - -[[package]] -name = "der" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4" -dependencies = [ - "const-oid", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "drop_bomb" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1" - -[[package]] -name = "ecdsa" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ee23aa5b4f68c7a092b5c3beb25f50c406adc75e2363634f242f28ab255372" -dependencies = [ - "der", - "elliptic-curve", - "hmac", - "signature", -] - -[[package]] -name = "ed25519" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" -dependencies = [ - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand 0.7.3", - "serde", - "sha2", - "zeroize", -] - -[[package]] -name = "either" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" - -[[package]] -name = "elliptic-curve" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" -dependencies = [ - "crypto-bigint", - "ff", - "generic-array 0.14.6", - "group", - "pkcs8", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "ff" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fixnum" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a312dd8b1a9875c6a2ddf253caa740804857615a478aa576d6982a41782516f" -dependencies = [ - "derive_more", - "itoa", - "parity-scale-codec", - "serde", - "static_assertions", - "typenum", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getset" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ghash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" -dependencies = [ - "opaque-debug 0.3.0", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" - -[[package]] -name = "group" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hkdf" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" -dependencies = [ - "digest 0.9.0", - "hmac", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "int_traits" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b33c9a5c599d67d051c4dc25eb1b6b4ef715d1763c20c85c688717a1734f204e" - -[[package]] -name = "iroha_crypto" -version = "2.0.0-pre-rc.20" -dependencies = [ - "derive_more", - "getset", - "hex", - "iroha_macro", - "iroha_primitives", - "iroha_schema", - "parity-scale-codec", - "serde", - "serde_with", - "ursa", -] - -[[package]] -name = "iroha_data_model" -version = "2.0.0-pre-rc.20" -dependencies = [ - "base64", - "derive_more", - "displaydoc", - "getset", - "iroha_crypto", - "iroha_data_model_derive", - "iroha_macro", - "iroha_primitives", - "iroha_schema", - "iroha_version", - "parity-scale-codec", - "serde", - "serde_json", - "serde_with", - "strum", - "thiserror", -] - -[[package]] -name = "iroha_data_model_derive" -version = "2.0.0-pre-rc.20" -dependencies = [ - "darling", - "iroha_macro_utils", - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "iroha_derive" -version = "2.0.0-pre-rc.20" -dependencies = [ - "darling", - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "iroha_macro" -version = "2.0.0-pre-rc.20" -dependencies = [ - "iroha_derive", -] - -[[package]] -name = "iroha_macro_utils" -version = "2.0.0-pre-rc.20" -dependencies = [ - "darling", - "drop_bomb", - "manyhow", - "proc-macro2", - "quote", - "syn 1.0.109", - "syn 2.0.38", -] - -[[package]] -name = "iroha_primitives" -version = "2.0.0-pre-rc.20" -dependencies = [ - "derive_more", - "displaydoc", - "fixnum", - "iroha_macro", - "iroha_primitives_derive", - "iroha_schema", - "parity-scale-codec", - "serde", - "serde_with", - "smallstr", - "smallvec", - "thiserror", -] - -[[package]] -name = "iroha_primitives_derive" -version = "2.0.0-pre-rc.20" -dependencies = [ - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "iroha_schema" -version = "2.0.0-pre-rc.20" -dependencies = [ - "fixnum", - "iroha_schema_derive", - "serde", -] - -[[package]] -name = "iroha_schema_derive" -version = "2.0.0-pre-rc.20" -dependencies = [ - "darling", - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "iroha_version" -version = "2.0.0-pre-rc.20" -dependencies = [ - "iroha_macro", - "iroha_version_derive", - "parity-scale-codec", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "iroha_version_derive" -version = "2.0.0-pre-rc.20" -dependencies = [ - "darling", - "manyhow", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "itoa" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" - -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.135" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "manyhow" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b76546495d933baa165075b95c0a15e8f7ef75e53f56b19b7144d80fd52bd" -dependencies = [ - "darling_core", - "manyhow-macros", - "proc-macro2", - "quote", - "syn 1.0.109", - "syn 2.0.38", -] - -[[package]] -name = "manyhow-macros" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba072c0eadade3160232e70893311f1f8903974488096e2eb8e48caba2f0cf1" -dependencies = [ - "proc-macro-utils", - "proc-macro2", - "quote", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "miniz_oxide" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" -dependencies = [ - "adler", -] - -[[package]] -name = "miracl_core" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4330eca86d39f2b52d0481aa1e90fe21bfa61f11b0bf9b48ab95595013cefe48" - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl" -version = "0.10.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl-sys" -version = "0.9.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230151e44c0f05157effb743e8d517472843121cf9243e8b81393edb5acd9ce" -dependencies = [ - "autocfg 1.1.0", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "pkcs8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" - -[[package]] -name = "poly1305" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7456bc1ad2d4cf82b3a016be4c2ac48daf11bf990c1603ebd447fe6f30fca8" -dependencies = [ - "cpuid-bool", - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug 0.3.0", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] -name = "proc-macro-crate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" -dependencies = [ - "once_cell", - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", -] - -[[package]] -name = "proc-macro2" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_pcg", - "rand_xorshift", - "winapi", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.1", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -dependencies = [ - "c2-chacha", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.7", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rayon" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" -dependencies = [ - "autocfg 1.1.0", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustversion" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" - -[[package]] -name = "ryu" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "secp256k1" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6179428c22c73ac0fbb7b5579a56353ce78ba29759b3b8575183336ea74cdfb" -dependencies = [ - "rand 0.6.5", - "secp256k1-sys", - "serde", -] - -[[package]] -name = "secp256k1-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11553d210db090930f4432bea123b31f70bbf693ace14504ea2a35e796c28dd2" -dependencies = [ - "cc", -] - -[[package]] -name = "serde" -version = "1.0.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_bytes" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "serde_json" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha3" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" -dependencies = [ - "block-buffer 0.7.3", - "byte-tools", - "digest 0.8.1", - "keccak", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug 0.3.0", -] - -[[package]] -name = "signature" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2807892cfa58e081aa1f1111391c7a0649d4fa127a4ffbe34bcbfb35a1171a4" -dependencies = [ - "digest 0.9.0", - "rand_core 0.6.4", -] - -[[package]] -name = "smallstr" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b1aefdf380735ff8ded0b15f31aab05daf1f70216c01c02a12926badd1df9d" -dependencies = [ - "serde", - "smallvec", -] - -[[package]] -name = "smallvec" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" -dependencies = [ - "serde", -] - -[[package]] -name = "spki" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" -dependencies = [ - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.38", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "thiserror" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "toml" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" -dependencies = [ - "serde", -] - -[[package]] -name = "typenum" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" - -[[package]] -name = "unicode-ident" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - -[[package]] -name = "ursa" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8760a62e18e4d3e3f599e15c09a9f9567fd9d4a90594d45166162be8d232e63b" -dependencies = [ - "aead", - "aes", - "aes-gcm", - "amcl", - "amcl_wrapper", - "arrayref", - "blake2", - "block-modes", - "block-padding 0.2.1", - "chacha20poly1305", - "curve25519-dalek", - "ed25519-dalek", - "failure", - "hex", - "hkdf", - "hmac", - "int_traits", - "k256", - "lazy_static", - "log", - "openssl", - "rand 0.7.3", - "rand_chacha 0.2.1", - "secp256k1", - "serde", - "sha2", - "sha3 0.9.1", - "subtle", - "time", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 1.0.109", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "wyz" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2392b6b94a576b4e2bf3c5b2757d63f10ada8020a2e4d08ac849ebcf6ea8e077" -dependencies = [ - "curve25519-dalek", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "zeroize" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] diff --git a/packages/data-model-rust-samples/Cargo.toml b/packages/data-model-rust-samples/Cargo.toml deleted file mode 100644 index b25d312c..00000000 --- a/packages/data-model-rust-samples/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "data-model-rust-samples" -version = "0.1.0" -edition = "2021" - -[dependencies] -iroha_data_model = { path = "../iroha-source/.iroha/data_model" } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -parity-scale-codec = "3.2.1" diff --git a/packages/data-model-rust-samples/package.json b/packages/data-model-rust-samples/package.json deleted file mode 100644 index 8dd34722..00000000 --- a/packages/data-model-rust-samples/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "@iroha2/data-model-rust-samples", - "version": "0.0.0", - "private": true, - "scripts": { - "produce-samples": "cargo run --release > samples.json" - } -} diff --git a/packages/data-model-rust-samples/src/main.rs b/packages/data-model-rust-samples/src/main.rs deleted file mode 100644 index 770fe11b..00000000 --- a/packages/data-model-rust-samples/src/main.rs +++ /dev/null @@ -1,168 +0,0 @@ -use iroha_data_model::prelude::*; -use parity_scale_codec::Encode; -use serde::Serialize; -use std::collections::BTreeMap; -use std::fmt::Debug; -use std::str::FromStr; -use std::time::Duration; - -fn main() { - println!( - "{}", - SamplesMap::new() - .add("DomainId", &DomainId::from_str("Hey").unwrap()) - .add( - "AssetDefinitionId", - &AssetDefinitionId::from_str("rose#wonderland").unwrap(), - ) - .add( - "AccountId", - &AccountId::from_str("alice@wonderland").unwrap(), - ) - .add( - "Time-based Trigger ISI", - &create_some_time_based_trigger_isi(), - ) - .add( - "Event-based Trigger ISI", - &create_some_event_based_trigger_isi(), - ) - .add("Metadata", &create_metadata()) - .to_json() - ); -} - -#[derive(Debug, Serialize)] -struct Sample { - /// TODO replace with json-encoded form? - debug: String, - encoded: String, -} - -impl Sample { - fn new(something: &T) -> Self { - let encoded = Encode::encode(something); - let encoded = to_hex(&encoded); - - Self { - debug: format!("{:?}", something), - encoded, - } - } -} - -struct SamplesMap(BTreeMap); - -impl SamplesMap { - fn new() -> Self { - Self(BTreeMap::new()) - } - - fn add(&mut self, label: &str, something: &T) -> &mut Self { - self.0.insert(label.to_owned(), Sample::new(something)); - self - } - - fn to_json(&self) -> String { - serde_json::to_string_pretty(&self.0).expect("Failed to serialize samples map") - } -} - -fn to_hex(val: &Vec) -> String { - let mut parts: Vec = Vec::with_capacity(val.len()); - - for byte in val { - parts.push(format!("{:0>2x}", byte)); - } - - parts.join(" ") -} - -fn create_some_time_based_trigger_isi() -> RegisterExpr { - let asset_id = AssetId::new( - AssetDefinitionId::from_str("rose#wonderland").unwrap(), - AccountId::from_str("alice@wonderland").unwrap(), - ); - - let mint: InstructionExpr = MintExpr::new(1_u32, asset_id.clone()).into(); - - RegisterExpr::new(Trigger::new( - "mint_rose".parse().expect("valid"), - Action::new( - vec![mint], - Repeats::Indefinitely, - asset_id.account_id().clone(), - TriggeringFilterBox::Time(TimeEventFilter::new(ExecutionTime::Schedule( - TimeSchedule::starting_at(Duration::from_secs(4141203402341234)) - .with_period(Duration::from_millis(3_000)), - ))), - ), - )) -} - -fn create_some_event_based_trigger_isi() -> RegisterExpr { - let asset_definition_id = "rose#wonderland".parse().unwrap(); - let account_id = ::Id::from_str("alice@wonderland").unwrap(); - let asset_id = AssetId::new(asset_definition_id, account_id.clone()); - let mint: InstructionExpr = MintExpr::new(1_u32, asset_id.clone()).into(); - - RegisterExpr::new(Trigger::new( - "mint_rose".parse().expect("valid"), - Action::new( - vec![mint], - Repeats::Indefinitely, - account_id, - TriggeringFilterBox::Data(BySome(DataEntityFilter::ByAssetDefinition(BySome( - AssetDefinitionFilter::new( - AcceptAll, - BySome(AssetDefinitionEventFilter::ByCreated), - ), - )))), - ), - )) -} - -fn create_metadata() -> Metadata { - trait LocalSet { - fn set(self, name: &str, value: Value) -> Self; - } - - impl LocalSet for Metadata { - fn set(mut self, name: &str, value: Value) -> Self { - match self - .insert_with_limits( - Name::from_str(name).unwrap(), - value, - iroha_data_model::metadata::Limits::new(30, 1024), - ) - .unwrap() - { - None => {} - Some(_) => panic!("unreachable"), - }; - self - } - } - - Metadata::new() - .set( - "authentication", - Value::String( - "80252ad79c68c01ec8946983411ce3b7cbea21d25f68c8546c687b2a7e2505cc".to_owned(), - ), - ) - .set("email", Value::String("user123@mail.com".to_owned())) - .set("salt", Value::String("ABCDEFG".to_owned())) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn dbg_trigger_isi() { - let value = create_some_time_based_trigger_isi(); - - dbg!(&value); - } -} diff --git a/packages/data-model-schema/.gitignore b/packages/data-model-schema/.gitignore deleted file mode 100644 index cd297282..00000000 --- a/packages/data-model-schema/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/src/__schema__.json diff --git a/packages/data-model-schema/CHANGELOG.md b/packages/data-model-schema/CHANGELOG.md deleted file mode 100644 index dd002165..00000000 --- a/packages/data-model-schema/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -# @iroha2/data-model-schema - -## 7.1.0 - -## 7.0.0 - -### Major Changes - -- e0459fa: **Target [Iroha `2.0.0-pre-rc.20`](https://github.com/hyperledger/iroha/tree/51d687607fad067fc855e266edc684d4fb33e7de)** -- e0459fa: **refactor!**: move schema-transform code back to `@iroha2/data-model` internal utilities -- e0459fa: **feat!**: update schema and its types; update type names - -## 6.0.0 - -### Major Changes - -- 40516f1: Updated according to Iroha `2.0.0-pre-rc.14` (internal release, reference hash: `726f5eabf65a79ea618b4fce62a09cee7a5b13d1`) - - Notable changes: - - - Renamed structure: ~~`QueryError`~~ `QueryExecutionFailure` - - Introduced new enum struct, `Algorithm`. Changed `digest_function: string` field in `PublicKey` and `PrivateKey` to `digest_function: Algorithm`: - ```ts - PublicKey({ - digest_function: Algorithm('Ed25519'), - // ... - }) - ``` - -## 5.0.0 - -### Major Changes - -- d1e5f68: **refactor!**: don't include fixed points into the transformed schema anymore; instead, return them as a separate collection -- d1e5f68: **feature**: transform `GenericPredicateBox<...::Predicate>` into just `PredicateBox` - -### Patch Changes - -- 7880c14: **feature**: cache transformed refs; print them to `debug` - -## 4.1.0 - -## 4.0.0 - -### Major Changes - -- e27467e: Update data model to align it with the updated model in the upcoming Iroha 2 LTS. - - Notable changes: - - - `Transaction` → `SignedTransaction` - - `VersionedTransaction` → `VersionedSignedTransaction` - -## 3.0.0 - -### Patch Changes - -- 3b0db98: **chore**: bump `@scale-codec/*` version - -## 2.0.2 - -## 2.0.1 - -### Patch Changes - -- ff266d3: Update `@scale-codec/*` version that uses correct `.mjs` ext for ESM bundles - -## 2.0.0 - -## 1.4.0 - -### Minor Changes - -- 5439042: **feat**: update data model according to Iroha `2.0.0-pre-rc.6-lts` (`75da907f66d5270f407a50e06bc76cec41d3d409`) diff --git a/packages/data-model-schema/README.md b/packages/data-model-schema/README.md deleted file mode 100644 index 3da1b2a4..00000000 --- a/packages/data-model-schema/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# `@iroha2/data-model-schema` - -The `@iroha2/data-model-schema` contains the source data model schema of Iroha 2 and its type definitions. - -**Note:** this package is a pure TypeScript package, i.e. it is not pre-bundled, but it exports source TypeScript files. It works fine out-of-the-box with tools like Vite or `tsx`. - -## Target version - -This version of package targets [Iroha `2.0.0-pre-rc.20`](https://github.com/hyperledger/iroha/tree/51d687607fad067fc855e266edc684d4fb33e7de). - -## Usage - -```ts -import { SCHEMA, type Schema } from '@iroha2/data-model-schema' -``` - -where: - -- `SCHEMA` is the original JSON of the data model schema -- `type Schema` is a generalised type definition which applies to `SCHEMA` - -## Installation - -The packages are published under the `@iroha2` scope into Iroha Nexus Registry. -To install `data-model-schema` with `npm`/`pnpm`: - -1. Configure your package manager to fetch scoped packages from Nexus Registry. - - ```ini - # FILE: .npmrc - @iroha2:registry=https://nexus.iroha.tech/repository/npm-group/ - ``` - -2. Install the `data-model-schema` package: - - ```shell - npm i @iroha2/data-model-schema - ``` diff --git a/packages/data-model-schema/etc/compile-with-kagami.ts b/packages/data-model-schema/etc/compile-with-kagami.ts deleted file mode 100644 index 37c06349..00000000 --- a/packages/data-model-schema/etc/compile-with-kagami.ts +++ /dev/null @@ -1,29 +0,0 @@ -import path from 'path' -import { execa } from 'execa' -import consola from 'consola' -import chalk from 'chalk' -import fs from 'fs' -import { resolveBinary } from '@iroha2/iroha-source' -import { COMPILED_SCHEMA_FILE } from './meta' - -async function main() { - consola.info('Resolving Kagami binary') - const kagami = (await resolveBinary('kagami')).path - - consola.info('Compiling schema') - const stream = fs.createWriteStream(COMPILED_SCHEMA_FILE, { encoding: 'utf-8' }) - try { - const sub = execa(kagami, ['schema']) - sub.stdout!.pipe(stream) - await sub - } finally { - stream.close() - } - - consola.success(chalk`Output is written into {blue.bold ${path.relative(process.cwd(), COMPILED_SCHEMA_FILE)}}`) -} - -main().catch((err) => { - consola.fatal(err) - process.exit(1) -}) diff --git a/packages/data-model-schema/etc/meta.ts b/packages/data-model-schema/etc/meta.ts deleted file mode 100644 index 0ebd7234..00000000 --- a/packages/data-model-schema/etc/meta.ts +++ /dev/null @@ -1,6 +0,0 @@ -import path from 'path' -import url from 'url' - -const dirname = url.fileURLToPath(new URL('.', import.meta.url)) - -export const COMPILED_SCHEMA_FILE = path.resolve(dirname, './../src/__schema__.json') diff --git a/packages/data-model-schema/package.json b/packages/data-model-schema/package.json deleted file mode 100644 index e5d668eb..00000000 --- a/packages/data-model-schema/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "@iroha2/data-model-schema", - "version": "7.1.0", - "description": "The schema of the data model", - "main": "src/lib.ts", - "files": [ - "src" - ], - "license": "Apache 2.0", - "scripts": { - "compile-with-kagami": "tsx etc/compile-with-kagami" - }, - "devDependencies": { - "@iroha2/iroha-source": "workspace:^0.0.0" - } -} diff --git a/packages/data-model-schema/src/lib.ts b/packages/data-model-schema/src/lib.ts deleted file mode 100644 index 7b35098b..00000000 --- a/packages/data-model-schema/src/lib.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as SCHEMA } from './__schema__.json' -export * from './types' diff --git a/packages/data-model-schema/src/types.spec.ts b/packages/data-model-schema/src/types.spec.ts deleted file mode 100644 index 8372947b..00000000 --- a/packages/data-model-schema/src/types.spec.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SCHEMA, type Schema } from './lib' -import { expectTypeOf, test } from 'vitest' - -test('Ensure that JSON schema matches with types', () => { - expectTypeOf(SCHEMA).toMatchTypeOf() -}) diff --git a/packages/data-model/.gitignore b/packages/data-model/.gitignore deleted file mode 100644 index 2a1e5eb4..00000000 --- a/packages/data-model/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/src/__generated__.ts diff --git a/packages/data-model/CHANGELOG.md b/packages/data-model/CHANGELOG.md deleted file mode 100644 index 9feafba7..00000000 --- a/packages/data-model/CHANGELOG.md +++ /dev/null @@ -1,260 +0,0 @@ -# @iroha2/data-model - -## 7.1.0 - -## 7.0.0 - -### Major Changes - -- e0459fa: **Target [Iroha `2.0.0-pre-rc.20`](https://github.com/hyperledger/iroha/tree/51d687607fad067fc855e266edc684d4fb33e7de)** -- e0459fa: **feat!**: enhance schema transformation. - - - Support new schema format - - Remove null aliases. Mostly, it simplifies `QueryBox` enum, e.g. instead of `QueryBox('FindAllAccounts', null)` it is now enough to write `QueryBox('FindAllAccounts')` - - Filter several single-field structures in order to avoid extra nesting. This includes: - - `EvaluatesTo<..>` - - `SignaturesOf<..>` - - Simplify `HashOf<..>` to `Hash` - - Handle `NonZero<..>` integers properly - -- e0459fa: **refactor!**: join all data-model types as `datamodel` namespace export - - ##### What is the change - - Previously, all data-model types were imported directly from the package: - - ```ts - import { AccountId, DomainId } from '@iroha2/data-model' - - const acc = AccountId({ - name: 'alice', - domain_id: DomainId({ - name: 'wonderland', - }), - }) - ``` - - Now all data-model types are joined into a single `datamodel` namespace: - - ```ts - import { datamodel } from '@iroha2/data-model' - - const acc = datamodel.AccountId({ - name: 'alice', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }) - ``` - - ##### Why the change was made - - - To make it easier to distinguish data-model related exports from other utilities as there used to be too many root-level package exports, not always related to each other. - - To make data model more compatible with how it is presented in Java SDK - - ##### How the consumer should update their code - - The consumer should replace all data-model imports with `datamodel.*`. - -### Minor Changes - -- e0459fa: **build**: preserve modules for ESM and types target; update `exports` mapping in `package.json` -- e0459fa: **feat**: introduce `sugar` namespace to do common data-model operations more conveniently (wip) - -## 6.0.0 - -### Major Changes - -- 40516f1: Updated according to Iroha `2.0.0-pre-rc.14` (internal release, reference hash: `726f5eabf65a79ea618b4fce62a09cee7a5b13d1`) - - Notable changes: - - - Renamed structure: ~~`QueryError`~~ `QueryExecutionFailure` - - Introduced new enum struct, `Algorithm`. Changed `digest_function: string` field in `PublicKey` and `PrivateKey` to `digest_function: Algorithm`: - ```ts - PublicKey({ - digest_function: Algorithm('Ed25519'), - // ... - }) - ``` - -## 5.0.0 - -### Major Changes - -- d1e5f68: **refactor!**: introduce new `NonZeroU8` codec; make it and `FixedPointI64P9` opaque factories -- d1e5f68: **refactor!**: update major version of `@scale-codec/*` - new wrapped enums and stronger types - - The change in short is the following: - - ```ts - import { Value } from '@iroha2/data-model' - - const value = Value('U32', 42) - - // - Accessing the enum itself with `.enum` - // - `.tag === 'U32'` instead of `.is('U32')` - if (value.enum.tag === 'U32') { - // Accessing enum content directly, with type narrowing - const num1: number = value.enum.content - - // Also works - const num2: number = value.enum.as('U32') - const _: never = value.enum.as('U128') - } - ``` - - Please consider the following changelogs for in-detail explanations: - - - [`@scale-codec/enum@2.0.0`](https://github.com/soramitsu/scale-codec-js-library/blob/master/packages/enum/CHANGELOG.md#200) - - [`@scale-codec/definition-compiler@4.0.0`](https://github.com/soramitsu/scale-codec-js-library/blob/master/packages/definition-compiler/CHANGELOG.md#400) - -### Patch Changes - -- 3ff768d: **docs**: update target Iroha version (`c4af68c4f7959b154eb5380aa93c894e2e63fe4e`) - -## 4.1.0 - -## 4.0.0 - -### Major Changes - -- e27467e: Update data model to align it with the updated model in the upcoming Iroha 2 LTS. - - Notable changes: - - - `Transaction` → `SignedTransaction` - - `VersionedTransaction` → `VersionedSignedTransaction` - -## 3.0.0 - -### Patch Changes - -- 3b0db98: **chore**: bump `@scale-codec/*` version -- Updated dependencies [3b0db98] - - @iroha2/i64-fixnum@0.4.2 - -## 2.0.2 - -### Patch Changes - -- fbe19e9: **docs**: update versions table in README, chores - -## 2.0.1 - -### Patch Changes - -- ff266d3: Update `@scale-codec/*` version that uses correct `.mjs` ext for ESM bundles -- Updated dependencies [ff266d3] - - @iroha2/i64-fixnum@0.4.1 - -## 2.0.0 - -### Minor Changes - -- a99d219: **fix!**: define `exports` field; use `*.cjs` extension for `require()` imports and `*.mjs` for `import` - -### Patch Changes - -- Updated dependencies [a99d219] - - @iroha2/i64-fixnum@0.4.0 - -## 1.4.0 - -### Minor Changes - -- 5439042: **feat**: update data model according to Iroha `2.0.0-pre-rc.6-lts` (`75da907f66d5270f407a50e06bc76cec41d3d409`) - -## 1.3.0 - -### Minor Changes - -- bdddf78: **breaking**: update and data-model accordingly to Iroha 2 RC 5 (`43be45fc7fb7b0bd73f87b4fef167d61680c8e1e`) - -## 1.2.1 - -### Patch Changes - -- 49c8451: chore: include only necessary files into `files` field in the `package.json` -- Updated dependencies [49c8451] - - @iroha2/i64-fixnum@0.3.1 - -## 1.2.0 - -### Minor Changes - -- update data model according to Iroha 2 RC 4 (`d00e0a9172d2a887a97f504796db5f2e05939c10`) - -## 1.1.0 - -### Minor Changes - -- a453fcd: update data model according to Iroha 2 RC 3 (`8d83a3eff33f29b49004a0a5efe643b10f0f256e`) -- a453fcd: **BREAKING** - change schema names normalization and align it more to `iroha_data_model::prelude` namespace normalization. - - List of changes: - - | Before | After | - | ------------------------- | -------------------------- | - | `DefinitionId` | `AssetDefinitionId` | - | `Id` | `DomainId` | - | `EntityType` | `PipelineEntityType` | - | ...and `OptionEntityType` | `OptionPipelineEntityType` | - | `Status` | `PipelineStatus` | - | `ExpressionIf` | `IfExpression` | - | `IsiIf` | `IfInstruction` | - - ...and some others. - -- e34f8a5: **BREAKING**: `BTreeSet` now is not an `Array`, but a `Set` - -## 1.0.0 - -### Major Changes - -- b86aa76: **feat**: compile Iroha Data Model accordingly to `iroha v2.0.0-pre-rc.2` (`920e4d12754b0f3bf08cbaa5221d91c27863fcdc`) - -## 0.5.0 - -### Minor Changes - -- 98d3638: update data model & bump scale runtime version - -### Patch Changes - -- 92c5a9a: Add library top-level short documentation -- Updated dependencies [33a58c5] -- Updated dependencies [92c5a9a] -- Updated dependencies [92c5a9a] - - @iroha2/i64-fixnum@0.3.0 - -## 0.4.0 - -### Minor Changes - -- c59c85b: **Breaking:** update data model generation approach & usage with updated SCALE codec kit - -### Patch Changes - -- Updated dependencies [c59c85b] - - @iroha2/i64-fixnum@0.2.0 - -## 0.3.0 - -### Minor Changes - -- 0a583c2: breaking: re-generate data model with some optimizations and updated compiler -- 0a583c2: deps: update `@scale-codec/*` deps - -### Patch Changes - -- Updated dependencies [0a583c2] - - @iroha2/i64-fixnum@0.1.3 - -## 0.2.1 - -### Patch Changes - -- 1833de7: Fix package.json, bump version of definition runtime with correct export of `jsbi` stuff -- Updated dependencies [1833de7] - - @iroha2/i64-fixnum@0.1.2 diff --git a/packages/data-model/README.md b/packages/data-model/README.md deleted file mode 100644 index c6421f65..00000000 --- a/packages/data-model/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# `@iroha2/data-model` - -The `@iroha2/data-model` packages contains generated SCALE-definitions for Iroha 2 Data Model. - -## Target version - -This version of package targets [Iroha `2.0.0-pre-rc.20`](https://github.com/hyperledger/iroha/tree/51d687607fad067fc855e266edc684d4fb33e7de). - -## Installation - -The packages are published under the `@iroha2` scope into Iroha Nexus Registry. -To install `data-model` with `npm`/`pnpm`: - -1. Configure your package manager to fetch scoped packages from Nexus Registry. - - ```ini - # FILE: .npmrc - @iroha2:registry=https://nexus.iroha.tech/repository/npm-group/ - ``` - -2. Install the `data-model` package: - - ```bash - npm i @iroha2/data-model - ``` - -## Usage - -TODO: write extended usage documentation - -## Known issues - -### Entries ordering in `BTreeMap` and `BTreeSet` - -In Rust, these structs assume that items are `PartialOrd`-ordered while encoding to ensure consistency for signatures creation. The JS library doesn't provide this feature and you should put entries in the correct order by yourself. diff --git a/packages/data-model/etc/codegen.ts b/packages/data-model/etc/codegen.ts deleted file mode 100644 index fb928a99..00000000 --- a/packages/data-model/etc/codegen.ts +++ /dev/null @@ -1,45 +0,0 @@ -import path from 'path' -import consola from 'consola' -import chalk from 'chalk' -import fs from 'fs/promises' -import { renderNamespaceDefinition } from '@scale-codec/definition-compiler' -import { SCHEMA } from '@iroha2/data-model-schema' -import { transformSchema } from './schema-transform' -import { CODEGEN_OUTPUT_FILE } from './meta' - -const AVAILABLE_FIXED_POINTS = new Set(['I64P9']) -const EXTENSION_MODULE = './extension' - -async function main() { - consola.log( - chalk`Converting {blue.bold SCHEMA} from {yellow.bold \`@iroha2/data-model-schema\`} to compiler-compatible format...`, - ) - const { definition, fixedPoints, nonZero } = transformSchema(SCHEMA) - - for (const { ty } of nonZero) { - definition[ty] = { t: 'import', module: EXTENSION_MODULE } - } - - for (const { decimalPlaces, base, ref } of fixedPoints) { - const code = `${base.toUpperCase()}P${decimalPlaces}` - if (!AVAILABLE_FIXED_POINTS.has(code)) throw new Error(`FixedPoint ${code} is not supported`) - definition[ref] = { - t: 'import', - module: EXTENSION_MODULE, - nameInModule: `FixedPoint${code}`, - } - } - - const generated = renderNamespaceDefinition(definition, { - rollupSingleTuplesIntoAliases: true, - }) - - await fs.writeFile(CODEGEN_OUTPUT_FILE, generated, { encoding: 'utf8' }) - - consola.success(chalk`Code is written into {bold.blue ${path.relative(process.cwd(), CODEGEN_OUTPUT_FILE)}}!`) -} - -main().catch((err) => { - consola.fatal(err) - process.exit(1) -}) diff --git a/packages/data-model/etc/meta.ts b/packages/data-model/etc/meta.ts deleted file mode 100644 index 440565be..00000000 --- a/packages/data-model/etc/meta.ts +++ /dev/null @@ -1,6 +0,0 @@ -import path from 'path' -import url from 'url' - -const dirname = url.fileURLToPath(new URL('.', import.meta.url)) - -export const CODEGEN_OUTPUT_FILE = path.resolve(dirname, '../src/__generated__.ts') diff --git a/packages/data-model/etc/schema-transform/debug.ts b/packages/data-model/etc/schema-transform/debug.ts deleted file mode 100644 index f6809ac6..00000000 --- a/packages/data-model/etc/schema-transform/debug.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Debug from 'debug' - -export default Debug('@iroha2/data-model').extend('schema-transform') diff --git a/packages/data-model/etc/schema-transform/index.spec.ts b/packages/data-model/etc/schema-transform/index.spec.ts deleted file mode 100644 index 599e3305..00000000 --- a/packages/data-model/etc/schema-transform/index.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { expect, test } from 'vitest' -import { transformSchema } from './index' -import type { Schema } from '@iroha2/data-model-schema' - -test('NonZero is handled properly', () => { - const SCHEMA: Schema = { - 'NonZero': 'u32', - 'Option>': { - Option: 'NonZero', - }, - } - - const { nonZero, definition } = transformSchema(SCHEMA) - - expect(definition).toEqual({ - OptionNonZeroU32: { - t: 'option', - some: 'NonZeroU32', - }, - }) - expect(nonZero).toEqual([{ ty: 'NonZeroU32' }]) -}) diff --git a/packages/data-model/etc/schema-transform/index.ts b/packages/data-model/etc/schema-transform/index.ts deleted file mode 100644 index bf9f1ea6..00000000 --- a/packages/data-model/etc/schema-transform/index.ts +++ /dev/null @@ -1,151 +0,0 @@ -/* eslint-disable max-nested-callbacks */ -import type { NamespaceDefinition, TypeDef } from '@scale-codec/definition-compiler' -import Debug from './debug' -import { Map } from 'immutable' -import { P, match } from 'ts-pattern' -import { filter as filterRef, transform as transformRef, tryParseNonZero } from './ref' -import { simplifyUnits } from './simplify-units' -import type { FixedPointDefinition, IntDefinition, Schema, SchemaTypeDefinition } from '@iroha2/data-model-schema' - -const debugRoot = Debug.extend('transform') -const debugFilter = debugRoot.extend('filter') -const debugEntry = debugRoot.extend('entry') - -function filterRawEntry( - value: SchemaTypeDefinition, - key: string, -): value is Exclude { - if (!filterRef(key)) { - debugFilter('ignore %o: ref filter', key) - return false - } - - return match(value) - .with({ Int: P.string }, () => { - debugFilter('ignore %o: it is an int %o', key, value) - return false - }) - .otherwise(() => true) -} - -function transformRustDef(def: Exclude): TypeDef { - return match(def) - .with({ Array: { type: 'u8', len: P.select() } }, (len) => { - return { - t: 'bytes-array', - len, - } - }) - .with({ Array: P.select() }, ({ len, type }) => { - return { - t: 'array', - len, - item: transformRef(type), - } - }) - .with({ Map: P.select() }, ({ key, value }) => { - return { - t: 'map', - key: transformRef(key), - value: transformRef(value), - } - }) - .with({ Struct: P.select() }, (fields) => { - return { - t: 'struct', - fields: fields.map(({ name, type }) => ({ - name, - ref: transformRef(type), - })), - } - }) - .with({ Enum: P.select() }, (variants) => { - return { - t: 'enum', - variants: variants.map(({ tag, type, discriminant }) => ({ - name: tag, - discriminant, - ref: type && transformRef(type), - })), - } - }) - .with({ Option: P.select() }, (some) => { - return { - t: 'option', - some: transformRef(some), - } - }) - .with({ Vec: P.select() }, (item) => { - return { t: 'vec', item: transformRef(item) } - }) - .with({ Tuple: P.select() }, (items) => { - return { - t: 'tuple', - items: items.map(transformRef), - } - }) - .with(null, () => { - return { t: 'alias', ref: 'Unit' } - }) - .with(P.string, (alias) => { - return { t: 'alias', ref: transformRef(alias) } - }) - .exhaustive() -} - -export interface FixedPointParams { - base: string - decimalPlaces: number - ref: string -} - -export interface TransformReturn { - definition: NamespaceDefinition - fixedPoints: FixedPointParams[] - nonZero: NonZeroParams[] -} - -export interface NonZeroParams { - /** - * Like `NonZeroU32` - */ - ty: string -} - -export function transformSchema(schema: Schema): TransformReturn { - const { - definition: almostReady, - fixedPoints, - nonZero, - } = Map(schema) - .filter(filterRawEntry) - .reduce( - (acc, value, key) => { - const maybeNonZero = tryParseNonZero(key) - if (maybeNonZero) { - acc.nonZero.push(maybeNonZero) - } else { - const ref = transformRef(key) - - match(value) - .with({ FixedPoint: P.select() }, ({ base, decimal_places: decimalPlaces }) => { - acc.fixedPoints.push({ base, ref, decimalPlaces }) - }) - .otherwise((value) => { - const def = transformRustDef(value) - debugEntry('transform %o to %o', value, def) - acc.definition[ref] = def - }) - } - - return acc - }, - { definition: {}, fixedPoints: [], nonZero: [] }, - ) - - return { - definition: simplifyUnits(almostReady, { unitType: 'Unit' }), - fixedPoints, - nonZero, - } -} diff --git a/packages/data-model/etc/schema-transform/ref.spec.ts b/packages/data-model/etc/schema-transform/ref.spec.ts deleted file mode 100644 index 7157d959..00000000 --- a/packages/data-model/etc/schema-transform/ref.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { transform } from './ref' -import { describe, expect, test } from 'vitest' - -describe('Refs transformation', () => { - test.each([ - ['EvaluatesTo', 'Expression'], - ['EvaluatesTo>', 'Expression'], - ['Event, C>', 'EventMapABC'], - ['Vec', 'VecU8'], - ['Array', 'ArrayU32L5'], - ['Array, 8>', 'ArrayIntervalU16L8'], - ['String', 'Str'], - ['Vec', 'VecU32'], - ['Map', 'MapAccountIdAssetId'], - ['Map', 'MapStrExpression'], - ['SignatureOf', 'Signature'], - ['SignaturesOf', 'SortedVecSignature'], - ['SortedVec>', 'SortedVecSignature'], - ['Fixed', 'FixedI64'], - ['Vec>', 'VecPredicateBox'], - ['GenericPredicateBox', 'PredicateBox'], - ['NonTrivial>', 'NonTrivialPredicateBox'], - ['HashOf', 'Hash'], - ['Compact', 'Compact'], - ['Trigger', 'Trigger'], - ['Action', 'Action'], - ])('%s transformed into %s', (input, output) => { - expect(transform(input)).toEqual(output) - }) -}) diff --git a/packages/data-model/etc/schema-transform/ref.ts b/packages/data-model/etc/schema-transform/ref.ts deleted file mode 100644 index aac22a25..00000000 --- a/packages/data-model/etc/schema-transform/ref.ts +++ /dev/null @@ -1,124 +0,0 @@ -import camelcase from 'camelcase' -import { pipe } from 'fp-ts/function' -import { Set } from 'immutable' -import invariant from 'tiny-invariant' -import { P, match } from 'ts-pattern' -import Debug from './debug' - -const debug = Debug.extend('transform-ref') - -const CACHE = new Map() - -function transform(ref: string): string { - return pipe(ref, parseId, transformTree, treeToFinalIdentifier) -} - -function transformWithCache(ref: string): string { - if (CACHE.has(ref)) return CACHE.get(ref)! - const transformed = transform(ref) - CACHE.set(ref, transformed) - debug('transform %o to %o', ref, transformed) - return transformed -} - -export { transformWithCache as transform } - -const IGNORE_TYPES = Set([ - // any ints - ...[3, 4, 5, 6, 7] - .map((power) => 2 ** power) - .map((bits) => [`i${bits}`, `u${bits}`]) - .flat(), - 'String', - 'Bool', - 'Vec', -]) - -export function filter(ref: string): boolean { - if (IGNORE_TYPES.has(ref)) return false - - return match(parseId(ref)) - .with({ id: 'HashOf', items: [P.any] }, () => false) - .with({ id: 'EvaluatesTo', items: [P.any] }, () => false) - .with({ id: 'bool' }, () => false) - .with({ id: 'SignaturesOf' }, () => false) - .otherwise(() => true) -} - -export function tryParseNonZero(ref: string): null | { ty: string } { - return match(parseId(ref)) - .with({ id: 'NonZero', items: [P.any] }, (x) => ({ ty: treeToFinalIdentifier(x) })) - .otherwise(() => null) -} - -interface Tree { - id: string - items: Tree[] -} - -function parseId(src: string): Tree { - const ROOT = '__root__' - const stack: Tree[] = [{ id: ROOT, items: [] }] - - for (const [token] of src.matchAll(/(<|>|[\w_]+)/gi)) { - if (token === '<') { - const lastItem = stack.at(-1)?.items.at(-1) - invariant(lastItem, 'should be') - stack.push(lastItem) - } else if (token === '>') { - invariant(stack.pop(), 'should be') - } else { - const head = stack.at(-1) - invariant(head, 'should be') - head.items.push({ id: token, items: [] }) - } - } - - return match(stack) - .with([{ id: ROOT, items: [P.select()] }], (trueRoot) => trueRoot) - .otherwise((x) => { - console.error('bad state:', x) - throw new Error('Bad state') - }) -} - -function transformTree(tree: Tree): Tree { - return ( - match(tree) - .with({ id: 'EvaluatesTo' }, () => ({ id: 'Expression', items: [] })) - .with({ id: 'Array', items: [P.select('inner'), { id: P.select('len'), items: [] }] }, ({ inner, len }) => { - if (Number.isNaN(Number(len))) throw new Error(`Invalid array len: ${len}`) - return { id: 'Array', items: [transformTree(inner), { id: `L_${len}`, items: [] }] } - }) - // .with({ id: 'Fixed', items: [{ id: 'i64', items: [] }] }, () => ({ id: 'FixedI64', items: [] })) - .with({ id: 'String', items: [] }, () => ({ id: 'Str', items: [] })) - .with({ id: 'GenericPredicateBox', items: [{ id: 'ValuePredicate', items: [] }] }, () => ({ - id: 'PredicateBox', - items: [], - })) - .with({ id: 'SignatureOf', items: [P.any] }, () => ({ id: 'Signature', items: [] })) - .with({ id: 'SignaturesOf', items: [P.any] }, () => ({ id: 'SortedVecSignature', items: [] })) - .with({ id: 'HashOf', items: [P.any] }, () => ({ id: 'Hash', items: [] })) - .with({ id: 'Compact', items: [{ id: 'u128' }] }, () => ({ id: 'Compact', items: [] })) - .with({ id: P.union('Action', 'Trigger'), items: [{ id: 'TriggeringFilterBox', items: [] }] }, ({ id }) => ({ - id, - items: [], - })) - .otherwise((x) => ({ id: x.id, items: x.items.map(transformTree) })) - ) -} - -function treeToFinalIdentifier(root: Tree): string { - const parts: string[] = [] - - const recursion = (tree: Tree): void => { - parts.push(tree.id) - for (const node of tree.items ?? []) { - recursion(node) - } - } - - recursion(root) - - return camelcase(parts.join('_'), { pascalCase: true }) -} diff --git a/packages/data-model/etc/schema-transform/simplify-units.spec.ts b/packages/data-model/etc/schema-transform/simplify-units.spec.ts deleted file mode 100644 index ad6d5a92..00000000 --- a/packages/data-model/etc/schema-transform/simplify-units.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import type { NamespaceDefinition } from '@scale-codec/definition-compiler' -import { expect, test } from 'vitest' -import { simplifyUnits } from './simplify-units' - -test('simplifies units in enums', () => { - const input = { - A: { t: 'alias', ref: 'Unit' }, - B: { t: 'alias', ref: 'Str' }, - C: { - t: 'enum', - variants: [ - { name: 'A', ref: 'A', discriminant: 0 }, - { name: 'B', ref: 'B', discriminant: 1 }, - { name: 'C', ref: 'Unit', discriminant: 2 }, - { name: 'D', ref: 'D', discriminant: 3 }, - ], - }, - } satisfies NamespaceDefinition - - expect(simplifyUnits(input, { unitType: 'Unit' })).toEqual({ - B: { t: 'alias', ref: 'Str' }, - C: { - t: 'enum', - variants: [ - { name: 'A', discriminant: 0 }, - { name: 'B', ref: 'B', discriminant: 1 }, - { name: 'C', discriminant: 2 }, - { name: 'D', ref: 'D', discriminant: 3 }, - ], - }, - } satisfies NamespaceDefinition) -}) - -test('replaces unit aliases with unit type itself in different types', () => { - const input = { - UnitAlias: { t: 'alias', ref: 'Unit' }, - Struct: { - t: 'struct', - fields: [{ name: 'A', ref: 'UnitAlias' }], - }, - // todo: add other types - } satisfies NamespaceDefinition - - expect(simplifyUnits(input, { unitType: 'Unit' })).toMatchInlineSnapshot(` - { - "Struct": { - "fields": [ - { - "name": "A", - "ref": "Unit", - }, - ], - "t": "struct", - }, - } - `) -}) - -test('resolves unit aliases chain', () => { - expect( - simplifyUnits( - { - a: { t: 'alias', ref: 'unit' }, - b: { t: 'alias', ref: 'a' }, - c: { t: 'alias', ref: 'b' }, - d: { t: 'struct', fields: [{ name: 'null', ref: 'c' }] }, - }, - { unitType: 'unit' }, - ), - ).toEqual({ - d: { t: 'struct', fields: [{ name: 'null', ref: 'unit' }] }, - } satisfies NamespaceDefinition) -}) diff --git a/packages/data-model/etc/schema-transform/simplify-units.ts b/packages/data-model/etc/schema-transform/simplify-units.ts deleted file mode 100644 index 200dbb18..00000000 --- a/packages/data-model/etc/schema-transform/simplify-units.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { DefAlias, NamespaceDefinition, TypeDef } from '@scale-codec/definition-compiler' -import { Map } from 'immutable' -import { P, match } from 'ts-pattern' - -function transformRefs(def: Exclude, fn: (ref: string) => string): TypeDef { - return match(def) - .with({ t: P.union('array', 'vec') }, (arr) => ({ ...arr, item: fn(arr.item) })) - .with({ t: 'map' }, (map) => ({ ...map, key: fn(map.key), value: fn(map.value) })) - .with({ t: 'set' }, (set) => ({ ...set, entry: fn(set.entry) })) - .with({ t: 'struct' }, (struct) => ({ ...struct, fields: struct.fields.map((x) => ({ ...x, ref: fn(x.ref) })) })) - .with({ t: 'alias' }, (alias) => ({ ...alias, ref: fn(alias.ref) })) - .with({ t: 'tuple' }, (tuple) => ({ ...tuple, ref: tuple.items.map(fn) })) - .with({ t: P.union('bytes-array') }, (x) => x) - .with({ t: 'result' }, (result) => ({ ...result, ok: fn(result.ok), err: fn(result.err) })) - .with({ t: 'option' }, (option) => ({ ...option, some: fn(option.some) })) - .exhaustive() -} - -export function simplifyUnits(schema: NamespaceDefinition, params: { unitType: string }): NamespaceDefinition { - const map = Map(schema) - - const unitAliases = map - .filter((v): v is DefAlias & { t: 'alias' } => v.t === 'alias') - .filter((alias, _k, map) => { - const met = new Set() - let i = alias - while (i.ref !== params.unitType) { - if (met.has(i.ref)) { - console.log('Met types so far:', met) - throw new Error('dont expect recursive types') - } - met.add(i.ref) - - const other = map.get(i.ref) - - if (other) - // also alias, proceed - i = other - // not an alias, and unit type hasn't occurred - else return false - } - - return true - }) - .keySeq() - .toSet() - - const isUnitRef = (ref: string): boolean => ref === params.unitType || unitAliases.has(ref) - - return map - .filter((v, k) => !unitAliases.has(k)) - .map((def) => { - return match(def) - .with({ t: 'enum', variants: P.select() }, (vars) => { - return { - t: 'enum', - variants: vars.map((item) => { - if (item.ref) { - if (isUnitRef(item.ref)) { - const copy = { ...item } - delete copy.ref - return copy - } - } - return item - }), - } - }) - .otherwise((x) => { - if (x.t === 'import') return x - return transformRefs(x, (ref) => { - if (unitAliases.has(ref)) return params.unitType - return ref - }) - }) - }) - .toObject() -} diff --git a/packages/data-model/package.json b/packages/data-model/package.json deleted file mode 100644 index 121460e0..00000000 --- a/packages/data-model/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@iroha2/data-model", - "version": "7.1.0", - "module": "dist/esm/lib.mjs", - "main": "dist/cjs/lib.cjs", - "types": "dist/types/lib.d.ts", - "exports": { - ".": { - "import": "./dist/esm/lib.mjs", - "require": "./dist/cjs/lib.cjs", - "types": "./dist/types/lib.d.ts" - } - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "license": "Apache 2.0", - "scripts": { - "codegen": "tsx etc/codegen" - }, - "dependencies": { - "@iroha2/i64-fixnum": "workspace:^0.4.2", - "@scale-codec/definition-runtime": "^4.0.1" - }, - "devDependencies": { - "@iroha2/data-model-schema": "workspace:*", - "@scale-codec/definition-compiler": "^4.0.1", - "@scale-codec/util": "^1.1.2", - "@types/debug": "^4.1.7", - "camelcase": "^7.0.1", - "debug": "^4.3.4", - "fp-ts": "^2.16.0", - "tiny-invariant": "^1.3.1" - } -} diff --git a/packages/data-model/src/__tests__/non-zero-ints.spec.ts b/packages/data-model/src/__tests__/non-zero-ints.spec.ts deleted file mode 100644 index bc1046e7..00000000 --- a/packages/data-model/src/__tests__/non-zero-ints.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { describe, expect, test } from 'vitest' -import { datamodel } from '../lib' - -describe('Non zero integers in the data model', () => { - for (const INVALID_VALUE of [-5, 0]) { - test(`When NonZeroU32 is defined with ${INVALID_VALUE}, it throws`, () => { - expect(() => datamodel.NonZeroU32(INVALID_VALUE)).toThrowError() - }) - - test(`When NonZeroU64 is defined with ${INVALID_VALUE}, it throws`, () => { - expect(() => datamodel.NonZeroU64(BigInt(INVALID_VALUE))).toThrowError() - }) - } -}) diff --git a/packages/data-model/src/__tests__/rust-samples.spec.ts b/packages/data-model/src/__tests__/rust-samples.spec.ts deleted file mode 100644 index 0bc22e1b..00000000 --- a/packages/data-model/src/__tests__/rust-samples.spec.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { describe, expect, test } from 'vitest' -import SAMPLES from '../../../data-model-rust-samples/samples.json' -import { type Codec, datamodel } from '../lib' -import { fromHex, toHex } from '@scale-codec/util' - -// eslint-disable-next-line max-params -function defineCase(label: keyof typeof SAMPLES, codec: Codec, value: T) { - const sample = SAMPLES[label] - - describe(label, () => { - test('encode', () => { - expect(toHex(codec.toBuffer(value))).toEqual(sample.encoded) - }) - - test('decode', () => { - expect(codec.fromBuffer(fromHex(sample.encoded))).toEqual(value) - }) - }) -} - -defineCase( - 'AccountId', - datamodel.AccountId, - datamodel.AccountId({ - name: 'alice', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }), -) - -defineCase( - 'DomainId', - datamodel.DomainId, - datamodel.DomainId({ - name: 'Hey', - }), -) - -defineCase( - 'AssetDefinitionId', - datamodel.AssetDefinitionId, - datamodel.AssetDefinitionId({ - name: 'rose', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }), -) - -{ - const assetId = datamodel.AssetId({ - account_id: datamodel.AccountId({ - name: 'alice', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }), - definition_id: datamodel.AssetDefinitionId({ - name: 'rose', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }), - }) - - defineCase( - 'Time-based Trigger ISI', - datamodel.RegisterExpr, - datamodel.RegisterExpr({ - object: datamodel.Expression( - 'Raw', - datamodel.Value( - 'Identifiable', - datamodel.IdentifiableBox( - 'Trigger', - datamodel.Trigger({ - id: datamodel.TriggerId({ name: 'mint_rose', domain_id: datamodel.OptionDomainId('None') }), - action: datamodel.Action({ - executable: datamodel.Executable( - 'Instructions', - datamodel.VecInstructionExpr([ - datamodel.InstructionExpr( - 'Mint', - datamodel.MintExpr({ - object: datamodel.Expression( - 'Raw', - datamodel.Value('Numeric', datamodel.NumericValue('U32', 1)), - ), - destination_id: datamodel.Expression( - 'Raw', - datamodel.Value('Id', datamodel.IdBox('AssetId', assetId)), - ), - }), - ), - ]), - ), - repeats: datamodel.Repeats('Indefinitely'), - filter: datamodel.TriggeringFilterBox( - 'Time', - datamodel.ExecutionTime( - 'Schedule', - datamodel.Schedule({ - start: datamodel.Duration([4141203402341234n, 0]), - period: datamodel.OptionDuration('Some', datamodel.Duration([3n, 0])), - }), - ), - ), - authority: assetId.account_id, - metadata: datamodel.Metadata({ map: datamodel.SortedMapNameValue(new Map()) }), - }), - }), - ), - ), - ), - }), - ) -} - -{ - const assetId = datamodel.AssetId({ - account_id: datamodel.AccountId({ - name: 'alice', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }), - definition_id: datamodel.AssetDefinitionId({ - name: 'rose', - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), - }), - }) - - defineCase( - 'Event-based Trigger ISI', - datamodel.RegisterExpr, - datamodel.RegisterExpr({ - object: datamodel.Expression( - 'Raw', - datamodel.Value( - 'Identifiable', - datamodel.IdentifiableBox( - 'Trigger', - datamodel.Trigger({ - id: datamodel.TriggerId({ name: 'mint_rose', domain_id: datamodel.OptionDomainId('None') }), - action: datamodel.Action({ - executable: datamodel.Executable( - 'Instructions', - datamodel.VecInstructionExpr([ - datamodel.InstructionExpr( - 'Mint', - datamodel.MintExpr({ - object: datamodel.Expression( - 'Raw', - datamodel.Value('Numeric', datamodel.NumericValue('U32', 1)), - ), - destination_id: datamodel.Expression( - 'Raw', - datamodel.Value('Id', datamodel.IdBox('AssetId', assetId)), - ), - }), - ), - ]), - ), - repeats: datamodel.Repeats('Indefinitely'), - filter: datamodel.TriggeringFilterBox( - 'Data', - datamodel.FilterOptDataEntityFilter( - 'BySome', - datamodel.DataEntityFilter( - 'ByAssetDefinition', - datamodel.FilterOptAssetDefinitionFilter( - 'BySome', - datamodel.AssetDefinitionFilter({ - origin_filter: datamodel.FilterOptOriginFilterAssetDefinitionEvent('AcceptAll'), - event_filter: datamodel.FilterOptAssetDefinitionEventFilter( - 'BySome', - datamodel.AssetDefinitionEventFilter('ByCreated'), - ), - }), - ), - ), - ), - ), - authority: assetId.account_id, - metadata: datamodel.Metadata({ map: datamodel.SortedMapNameValue(new Map()) }), - }), - }), - ), - ), - ), - }), - ) -} - -defineCase( - 'Metadata', - datamodel.Metadata, - datamodel.Metadata({ - map: datamodel.SortedMapNameValue( - new Map([ - // Test will fail if order is violated - [ - 'authentication', - datamodel.Value('String', '80252ad79c68c01ec8946983411ce3b7cbea21d25f68c8546c687b2a7e2505cc'), - ], - ['email', datamodel.Value('String', 'user123@mail.com')], - ['salt', datamodel.Value('String', 'ABCDEFG')], - ]), - ), - }), -) diff --git a/packages/data-model/src/datamodel.ts b/packages/data-model/src/datamodel.ts deleted file mode 100644 index 02f0e0e1..00000000 --- a/packages/data-model/src/datamodel.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './__generated__' diff --git a/packages/data-model/src/extension.ts b/packages/data-model/src/extension.ts deleted file mode 100644 index c3a9c0c5..00000000 --- a/packages/data-model/src/extension.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as runtime from '@scale-codec/definition-runtime' -import { bigintToF64Str, f64StrToBigint } from '@iroha2/i64-fixnum' - -declare const __opaqueTag: unique symbol - -type LocalOpaque = { [__opaqueTag]: Tag } & T - -type ParseFn = (raw: T) => U - -function fixedPointCodec( - name: string, - precision: number, - parse: ParseFn, -): runtime.Codec & ParseFn { - const codec = runtime.trackableCodec( - name, - runtime.encodeFactory( - (value, walker) => { - runtime.encodeI64(f64StrToBigint(value, precision), walker) - }, - // i64 is always fixed 8-bytes len - () => 8, - ), - (walker) => { - const bi = runtime.decodeI64(walker) - return bigintToF64Str(bi, precision) as T - }, - ) - - return Object.assign(parse, codec) -} - -// eslint-disable-next-line max-params -function nonZeroNumCodec( - name: string, - encode: runtime.Encode, - decode: runtime.Decode, -): runtime.Codec & ParseFn { - const codec = runtime.trackableCodec(name, encode, decode) as runtime.Codec - - const parse: ParseFn = (raw) => { - if (raw <= 0) throw new TypeError(`Invalid ${name}: expected a non-zero value, got: ${raw}`) - return raw as U - } - - return Object.assign(parse, codec) -} - -type FixedPointI64P9 = LocalOpaque<'FixedPointI64P9', string> -const FixedPointI64P9 = fixedPointCodec('FixedPointI64P9', 9, (x) => x as FixedPointI64P9) - -type NonZeroU32 = LocalOpaque<'NonZeroU32', number> -const NonZeroU32 = nonZeroNumCodec('NonZeroU32', runtime.encodeU32, runtime.decodeU32) - -type NonZeroU64 = LocalOpaque<'NonZeroU64', bigint> -const NonZeroU64 = nonZeroNumCodec('NonZeroU64', runtime.encodeU64, runtime.decodeU64) - -export { FixedPointI64P9, NonZeroU32, NonZeroU64 } diff --git a/packages/data-model/src/lib.ts b/packages/data-model/src/lib.ts deleted file mode 100644 index 479df9d1..00000000 --- a/packages/data-model/src/lib.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @packageDocumentation - * - * Iroha v2 data model codecs. Primarily contains the code generated by the `@scale-codec/definition-compiler` - */ - -export * as datamodel from './datamodel' -export * as sugar from './sugar/index' -export * from '@scale-codec/definition-runtime' diff --git a/packages/data-model/src/sugar/executable.ts b/packages/data-model/src/sugar/executable.ts deleted file mode 100644 index 73c7b3dd..00000000 --- a/packages/data-model/src/sugar/executable.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { datamodel } from './model' - -export const instructions = (isis: datamodel.InstructionExpr | datamodel.InstructionExpr[]): datamodel.Executable => - datamodel.Executable('Instructions', datamodel.VecInstructionExpr(Array.isArray(isis) ? isis : [isis])) diff --git a/packages/data-model/src/sugar/expression.ts b/packages/data-model/src/sugar/expression.ts deleted file mode 100644 index 7ccc79ec..00000000 --- a/packages/data-model/src/sugar/expression.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { datamodel } from './model' - -export const raw = (value: datamodel.Value): datamodel.Expression => datamodel.Expression('Raw', value) diff --git a/packages/data-model/src/sugar/filter.ts b/packages/data-model/src/sugar/filter.ts deleted file mode 100644 index 38bb17e2..00000000 --- a/packages/data-model/src/sugar/filter.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { datamodel } from './model' - -export const pipeline = (opts?: { - entityKind?: 'Transaction' | 'Block' - statusKind?: 'Validating' | 'Rejected' | 'Committed' - hash?: datamodel.Hash -}): datamodel.FilterBox => - datamodel.FilterBox( - 'Pipeline', - datamodel.PipelineEventFilter({ - entity_kind: opts?.entityKind - ? datamodel.OptionPipelineEntityKind('Some', datamodel.PipelineEntityKind(opts.entityKind)) - : datamodel.OptionPipelineEntityKind('None'), - status_kind: opts?.statusKind - ? datamodel.OptionPipelineStatusKind('Some', datamodel.PipelineStatusKind(opts.statusKind)) - : datamodel.OptionPipelineStatusKind('None'), - hash: opts?.hash ? datamodel.OptionHash('Some', opts.hash) : datamodel.OptionHash('None'), - }), - ) diff --git a/packages/data-model/src/sugar/find.ts b/packages/data-model/src/sugar/find.ts deleted file mode 100644 index e0f76189..00000000 --- a/packages/data-model/src/sugar/find.ts +++ /dev/null @@ -1,24 +0,0 @@ -// TODO all queries, categorised as in `iroha_client` crate - -import { datamodel } from './model' - -export const assetsByAccountId = (accountId: datamodel.AccountId): datamodel.QueryBox => - datamodel.QueryBox( - 'FindAssetsByAccountId', - datamodel.FindAssetsByAccountId({ - account_id: datamodel.Expression('Raw', datamodel.Value('Id', datamodel.IdBox('AccountId', accountId))), - }), - ) - -export const allDomains = () => datamodel.QueryBox('FindAllDomains') -export const allAccounts = () => datamodel.QueryBox('FindAllAccounts') -export const allAssets = () => datamodel.QueryBox('FindAllAssets') -export const allAssetsDefinitions = () => datamodel.QueryBox('FindAllAssetsDefinitions') - -export const assetById = (id: datamodel.AssetId): datamodel.QueryBox => - datamodel.QueryBox( - 'FindAssetById', - datamodel.FindAssetById({ - id: datamodel.Expression('Raw', datamodel.Value('Id', datamodel.IdBox('AssetId', id))), - }), - ) diff --git a/packages/data-model/src/sugar/identifiable.ts b/packages/data-model/src/sugar/identifiable.ts deleted file mode 100644 index 9045c244..00000000 --- a/packages/data-model/src/sugar/identifiable.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { datamodel } from './model' - -export const newAccount = ( - accountId: datamodel.AccountId, - signatories: datamodel.PublicKey[], - opts?: { - metadata?: datamodel.Metadata - }, -): datamodel.IdentifiableBox => - datamodel.IdentifiableBox( - 'NewAccount', - datamodel.NewAccount({ - id: accountId, - signatories: datamodel.SortedVecPublicKey(signatories), - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - metadata: opts?.metadata ?? ({ map: new Map() } as datamodel.Metadata), - }), - ) - -export const newAssetDefinition = ( - assetDefinitionId: datamodel.AssetDefinitionId, - type: datamodel.AssetValueType, - opts?: { - metadata?: datamodel.Metadata - mintable?: datamodel.Mintable - /** - * IPFS path - */ - logo?: string - }, -): datamodel.IdentifiableBox => - datamodel.IdentifiableBox( - 'NewAssetDefinition', - datamodel.NewAssetDefinition({ - id: assetDefinitionId, - value_type: type, - mintable: opts?.mintable ?? datamodel.Mintable('Not'), - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - metadata: opts?.metadata ?? ({ map: new Map() } as datamodel.Metadata), - logo: opts?.logo ? datamodel.OptionIpfsPath('Some', opts.logo) : datamodel.OptionIpfsPath('None'), - }), - ) - -export const newDomain = ( - domainName: string, - opts?: { - metadata?: datamodel.Metadata - logo?: string - }, -): datamodel.IdentifiableBox => - datamodel.IdentifiableBox( - 'NewDomain', - datamodel.NewDomain({ - id: datamodel.DomainId({ - name: domainName, - }), - metadata: opts?.metadata ?? datamodel.Metadata({ map: datamodel.SortedMapNameValue(new Map()) }), - logo: opts?.logo ? datamodel.OptionIpfsPath('Some', opts.logo) : datamodel.OptionIpfsPath('None'), - }), - ) - -export const asset = (assetId: datamodel.AssetId, value: datamodel.AssetValue): datamodel.IdentifiableBox => - datamodel.IdentifiableBox( - 'Asset', - datamodel.Asset({ - id: assetId, - value, - }), - ) diff --git a/packages/data-model/src/sugar/index.ts b/packages/data-model/src/sugar/index.ts deleted file mode 100644 index e0a833db..00000000 --- a/packages/data-model/src/sugar/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { datamodel } from './model' - -export * as executable from './executable' -export * as instruction from './instruction' -export * as identifiable from './identifiable' -export * as find from './find' -export * as filter from './filter' -export * as value from './value' - -export const domainId = (domainName: string) => datamodel.DomainId({ name: domainName }) - -export const accountId = (accountName: string, domain: string | datamodel.DomainId): datamodel.AccountId => - datamodel.AccountId({ - name: accountName, - domain_id: typeof domain === 'string' ? domainId(domain) : domain, - }) - -export const assetDefinitionId = (assetName: string, domain: string | datamodel.DomainId) => - datamodel.AssetDefinitionId({ name: assetName, domain_id: typeof domain === 'string' ? domainId(domain) : domain }) - -export const assetId = (account: datamodel.AccountId, definition: datamodel.AssetDefinitionId): datamodel.AssetId => - datamodel.AssetId({ - account_id: account, - definition_id: definition, - }) diff --git a/packages/data-model/src/sugar/instruction.ts b/packages/data-model/src/sugar/instruction.ts deleted file mode 100644 index d571a14d..00000000 --- a/packages/data-model/src/sugar/instruction.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { datamodel } from './model' - -export const register = (identifiable: datamodel.IdentifiableBox): datamodel.InstructionExpr => - datamodel.InstructionExpr( - 'Register', - datamodel.RegisterExpr({ - object: datamodel.Expression('Raw', datamodel.Value('Identifiable', identifiable)), - }), - ) - -export const mint = (object: datamodel.Value, destination: datamodel.IdBox): datamodel.InstructionExpr => - datamodel.InstructionExpr( - 'Mint', - datamodel.MintExpr({ - object: datamodel.Expression('Raw', object), - destination_id: datamodel.Expression('Raw', datamodel.Value('Id', destination)), - }), - ) - -export const transfer = ( - source: datamodel.IdBox, - object: datamodel.Value, - destination: datamodel.IdBox, -): datamodel.InstructionExpr => - datamodel.InstructionExpr( - 'Transfer', - datamodel.TransferExpr({ - source_id: datamodel.Expression('Raw', datamodel.Value('Id', source)), - destination_id: datamodel.Expression('Raw', datamodel.Value('Id', destination)), - object: datamodel.Expression('Raw', object), - }), - ) diff --git a/packages/data-model/src/sugar/model.ts b/packages/data-model/src/sugar/model.ts deleted file mode 100644 index a3ea874b..00000000 --- a/packages/data-model/src/sugar/model.ts +++ /dev/null @@ -1 +0,0 @@ -export * as datamodel from '../datamodel' diff --git a/packages/data-model/src/sugar/value.ts b/packages/data-model/src/sugar/value.ts deleted file mode 100644 index 34a822d9..00000000 --- a/packages/data-model/src/sugar/value.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { datamodel } from './model' - -export const numericU32 = (value: number): datamodel.Value => - datamodel.Value('Numeric', datamodel.NumericValue('U32', value)) - -export const numericU128 = (value: number | bigint): datamodel.Value => - datamodel.Value('Numeric', datamodel.NumericValue('U128', BigInt(value))) - -export const numericFixed = (value: datamodel.FixedPointI64): datamodel.Value => - datamodel.Value('Numeric', datamodel.NumericValue('Fixed', value)) - -export const newDomain = (value: datamodel.NewDomain): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('NewDomain', value)) -export const newAccount = (value: datamodel.NewAccount): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('NewAccount', value)) -export const newAssetDefinition = (value: datamodel.NewAssetDefinition): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('NewAssetDefinition', value)) -export const domain = (value: datamodel.Domain): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('Domain', value)) -export const account = (value: datamodel.Account): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('Account', value)) -export const assetDefinition = (value: datamodel.AssetDefinition): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('AssetDefinition', value)) -export const asset = (value: datamodel.Asset): datamodel.Value => - datamodel.Value('Identifiable', datamodel.IdentifiableBox('Asset', value)) -export const domainId = (value: datamodel.DomainId): datamodel.Value => - datamodel.Value('Id', datamodel.IdBox('DomainId', value)) -export const accountId = (value: datamodel.AccountId): datamodel.Value => - datamodel.Value('Id', datamodel.IdBox('AccountId', value)) -export const assetDefinitionId = (value: datamodel.AssetDefinitionId): datamodel.Value => - datamodel.Value('Id', datamodel.IdBox('AssetDefinitionId', value)) -export const assetId = (value: datamodel.AssetId): datamodel.Value => - datamodel.Value('Id', datamodel.IdBox('AssetId', value)) diff --git a/packages/docs-recipes/CHANGELOG.md b/packages/docs-recipes/CHANGELOG.md deleted file mode 100644 index 25fe82d0..00000000 --- a/packages/docs-recipes/CHANGELOG.md +++ /dev/null @@ -1,42 +0,0 @@ -# @iroha2/docs-recipes - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [6f6163f] -- Updated dependencies [49c8451] -- Updated dependencies [6f6163f] -- Updated dependencies [49c8451] - - @iroha2/crypto-target-bundler@0.2.0 - - @iroha2/crypto-target-node@0.2.0 - - @iroha2/crypto-target-web@0.2.0 - - @iroha2/client@1.2.1 - - @iroha2/crypto-core@0.1.1 - - @iroha2/data-model@1.2.1 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [b86aa76] -- Updated dependencies [b86aa76] - - @iroha2/data-model@1.0.0 - - @iroha2/client@1.0.0 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [98d3638] -- Updated dependencies [92c5a9a] -- Updated dependencies [98d3638] -- Updated dependencies [98d3638] -- Updated dependencies [98d3638] -- Updated dependencies [98d3638] -- Updated dependencies [92c5a9a] - - @iroha2/client@0.4.0 - - @iroha2/data-model@0.5.0 - - @iroha2/crypto-target-bundler@0.1.1 - - @iroha2/crypto-target-node@0.1.1 - - @iroha2/crypto-target-web@0.1.1 diff --git a/packages/docs-recipes/README.md b/packages/docs-recipes/README.md deleted file mode 100644 index f060c446..00000000 --- a/packages/docs-recipes/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Documentation recipes - -The `@iroha2/docs-recipes` package contains a collection of code samples that are used for [Iroha 2 JS Tutorial](https://hyperledger.github.io/iroha-2-docs/guide/javascript.html). - -## Why have a separated package? - -The code samples are combined in a separate package for the following reasons: - -- To collect all recipes in a single place -- To use actual imports (like `@iroha2/client`) in code -- To test the documentation since the written code is affected by global repo type-check - -## Contents - -- [Install the client](./src/1-client-install.ts) -- [Configure the client](./src/2.1-client-config.ts) -- [Generate a key-pair](./src/2.2-gen-keypair.ts) -- [Register a domain](./src/3-register-domain.ts) -- [Register an account](./src/4-register-account.ts) -- [Register an asset](./src/5.1-reg-asset.ts) -- [Mint an asset](./src/5.2-mint.ts) diff --git a/packages/docs-recipes/package.json b/packages/docs-recipes/package.json deleted file mode 100644 index d42b74ca..00000000 --- a/packages/docs-recipes/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "@iroha2/docs-recipes", - "private": true, - "version": "0.0.3", - "devDependencies": { - "@iroha2/client": "workspace:^7.1.0", - "@iroha2/crypto-core": "workspace:^2.0.0", - "@iroha2/crypto-target-bundler": "workspace:^2.0.0", - "@iroha2/crypto-target-node": "workspace:^2.0.0", - "@iroha2/crypto-target-web": "workspace:^2.0.0", - "@iroha2/data-model": "workspace:^7.1.0", - "fp-ts": "^2.13.1", - "node-fetch": "^3.3.0", - "undici": "^5.20.0" - } -} diff --git a/packages/docs-recipes/src/1.client-install.ts b/packages/docs-recipes/src/1.client-install.ts deleted file mode 100644 index 40a762b7..00000000 --- a/packages/docs-recipes/src/1.client-install.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { crypto } from '@iroha2/crypto-target-node' -import { setCrypto } from '@iroha2/client' - -setCrypto(crypto) diff --git a/packages/docs-recipes/src/2.1.1.key-pair.ts b/packages/docs-recipes/src/2.1.1.key-pair.ts deleted file mode 100644 index bc4e1a62..00000000 --- a/packages/docs-recipes/src/2.1.1.key-pair.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { crypto } from '@iroha2/crypto-target-node' -import { Bytes } from '@iroha2/crypto-core' - -const keyPair1 = crypto.KeyPair.fromJSON({ - public_key: 'ed0120e555d194e8822da35ac541ce9eec8b45058f4d294d9426ef97ba92698766f7d3', - private_key: { - algorithm: 'ed25519', - payload: - 'de757bcb79f4c63e8fa0795edc26f86dfdba189b846e903d0b732bb644607720e555d194e8822da35ac541ce9eec8b45058f4d294d9426ef97ba92698766f7d3', - }, -}) - -const keyPair2 = crypto.KeyPair.deriveFromSeed(Bytes.hex('001122')) - -const keyPair3 = crypto.KeyPair.deriveFromPrivateKey(keyPair2.privateKey()) diff --git a/packages/docs-recipes/src/2.1.2.signer.ts b/packages/docs-recipes/src/2.1.2.signer.ts deleted file mode 100644 index be8702cb..00000000 --- a/packages/docs-recipes/src/2.1.2.signer.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { cryptoTypes } from '@iroha2/crypto-core' -import { Signer } from '@iroha2/client' -import { datamodel, sugar } from '@iroha2/data-model' - -// Key pair from previous step -declare const keyPair: cryptoTypes.KeyPair - -const accountId = datamodel.AccountId({ - // Account name - name: 'alice', - // The domain where this account is registered - domain_id: datamodel.DomainId({ - name: 'wonderland', - }), -}) - -// same, but shorter -const sameAccountId = sugar.accountId('alice', 'wonderland') - -const signer = new Signer(accountId, keyPair) diff --git a/packages/docs-recipes/src/2.1.3.free.ts b/packages/docs-recipes/src/2.1.3.free.ts deleted file mode 100644 index 12e74012..00000000 --- a/packages/docs-recipes/src/2.1.3.free.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Bytes, FREE_HEAP, freeScope } from '@iroha2/crypto-core' -import { crypto } from '@iroha2/crypto-target-node' - -const keyPair = freeScope((scope) => { - const kp = crypto.KeyPair.deriveFromSeed(Bytes.hex('0102')) - - console.log(FREE_HEAP.size) // => 2 (key gen configuration and key pair) - - scope.forget(kp) - - return kp -}) - -console.log(FREE_HEAP.size) // => 1 (only key pair) diff --git a/packages/docs-recipes/src/2.2.1.torii-usage-example.ts b/packages/docs-recipes/src/2.2.1.torii-usage-example.ts deleted file mode 100644 index a3ad2a41..00000000 --- a/packages/docs-recipes/src/2.2.1.torii-usage-example.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Torii } from '@iroha2/client' -import { datamodel } from '@iroha2/data-model' - -// --snip-- -declare const query: datamodel.SignedQuery - -const result = await Torii.request( - { - fetch, - apiURL: 'http://127.0.0.1:8080', - }, - query, -) diff --git a/packages/docs-recipes/src/2.2.2.torii-pre-node.ts b/packages/docs-recipes/src/2.2.2.torii-pre-node.ts deleted file mode 100644 index c9b89cb0..00000000 --- a/packages/docs-recipes/src/2.2.2.torii-pre-node.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { - ToriiRequirementsForApiHttp, - ToriiRequirementsForApiWebSocket, -} from '@iroha2/client' -import { adapter as WS } from '@iroha2/client/web-socket/node' - -import nodeFetch from 'node-fetch' -// another alternative -import { fetch as undiciFetch } from 'undici' - -const toriiRequirements: ToriiRequirementsForApiHttp & ToriiRequirementsForApiWebSocket = - { - apiURL: 'http://127.0.0.1:8080', - ws: WS, - // type assertion is acceptable here - // you can pass `undiciFetch` here as well - fetch: nodeFetch as unknown as typeof fetch, - } diff --git a/packages/docs-recipes/src/2.2.3.torii-pre-web.ts b/packages/docs-recipes/src/2.2.3.torii-pre-web.ts deleted file mode 100644 index 41a94544..00000000 --- a/packages/docs-recipes/src/2.2.3.torii-pre-web.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - ToriiRequirementsForApiHttp, - ToriiRequirementsForApiWebSocket, -} from '@iroha2/client' -import { adapter as WS } from '@iroha2/client/web-socket/native' - -const toriiRequirements: ToriiRequirementsForApiHttp & ToriiRequirementsForApiWebSocket = - { - apiURL: 'http://127.0.0.1:8080', - ws: WS, - fetch: - // passing globally available `fetch`, but binding it to `window` - // to avoid `TypeError: "'fetch' called on an - // object that does not implement interface Window."` - fetch.bind(window), - } diff --git a/packages/docs-recipes/src/2.3.client.ts b/packages/docs-recipes/src/2.3.client.ts deleted file mode 100644 index caabef5e..00000000 --- a/packages/docs-recipes/src/2.3.client.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Client, Signer, ToriiRequirementsForApiHttp } from '@iroha2/client' -import { datamodel } from '@iroha2/data-model' - -// --snip-- -declare const signer: Signer -declare const toriiRequirements: ToriiRequirementsForApiHttp - -const client = new Client({ signer }) - -// `Client` will sign & wrap `Executable` into `VersionedSignedTransaction` -declare const exec: datamodel.Executable -await client.submitExecutable(toriiRequirements, exec) diff --git a/packages/docs-recipes/src/3.register-domain.ts b/packages/docs-recipes/src/3.register-domain.ts deleted file mode 100644 index 988a6e4e..00000000 --- a/packages/docs-recipes/src/3.register-domain.ts +++ /dev/null @@ -1,47 +0,0 @@ -// #region pre -import { Client, ToriiRequirementsForApiHttp } from '@iroha2/client' -import { sugar } from '@iroha2/data-model' -import { pipe } from 'fp-ts/function' - -// --snip-- -declare const client: Client -declare const toriiRequirements: ToriiRequirementsForApiHttp -// #endregion pre - -// #region do-reg -await client.submitExecutable( - toriiRequirements, - pipe( - sugar.identifiable.newDomain('looking_glass'), - sugar.instruction.register, - sugar.executable.instructions, - ), -) -// #endregion do-reg - -// #region ensure-fn -async function ensureDomainExistence(domainName: string) { - // Query all domains - const result = await client.requestWithQueryBox( - toriiRequirements, - sugar.find.allDomains(), - ) - - // Display the request status - console.log('%o', result) - - // Obtain the domain - const domain = result - .as('Ok') - .batch.enum.as('Vec') - .map((x) => x.enum.as('Identifiable').enum.as('Domain')) - .find((x) => x.id.name === domainName) // [!code hl] - - // Throw an error if the domain is unavailable - if (!domain) throw new Error('Not found') -} -// #endregion ensure-fn - -// #region do-ensure -await ensureDomainExistence('looking_glass') -// #endregion do-ensure diff --git a/packages/docs-recipes/src/4.register-account.ts b/packages/docs-recipes/src/4.register-account.ts deleted file mode 100644 index 686fd0fb..00000000 --- a/packages/docs-recipes/src/4.register-account.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Client, ToriiRequirementsForApiHttp, getCryptoAnyway } from '@iroha2/client' -import { Bytes, freeScope } from '@iroha2/crypto-core' -import { sugar } from '@iroha2/data-model' -import { pipe } from 'fp-ts/function' - -// --snip-- -declare const client: Client -declare const toriiRequirements: ToriiRequirementsForApiHttp - -const crypto = getCryptoAnyway() - -// generating the key pair -const accountKeyPair = freeScope((scope) => { - const pair = crypto.KeyPair.deriveFromSeed(Bytes.hex('abcd1122')) - scope.forget(pair) - return pair -}) - -// extracting the public key -const publicKey = freeScope(() => accountKeyPair.publicKey().toDataModel()) - -await client.submitExecutable( - toriiRequirements, - pipe( - sugar.accountId('white_rabbit', 'looking_glass'), - (id) => sugar.identifiable.newAccount(id, [publicKey]), - sugar.instruction.register, - sugar.executable.instructions, - ), -) diff --git a/packages/docs-recipes/src/5.1.register-asset.ts b/packages/docs-recipes/src/5.1.register-asset.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/docs-recipes/src/5.2.mint-registered-asset.ts b/packages/docs-recipes/src/5.2.mint-registered-asset.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/docs-recipes/src/5.register-and-mint-asset.ts b/packages/docs-recipes/src/5.register-and-mint-asset.ts deleted file mode 100644 index 8f9546bd..00000000 --- a/packages/docs-recipes/src/5.register-and-mint-asset.ts +++ /dev/null @@ -1,51 +0,0 @@ -// #region pre -import { datamodel, sugar } from '@iroha2/data-model' -import { Client, ToriiRequirementsForApiHttp } from '@iroha2/client' -import { pipe } from 'fp-ts/function' - -// --snip-- -declare const client: Client -declare const toriiRequirements: ToriiRequirementsForApiHttp - -const timeDefinitionId = sugar.assetDefinitionId('time', 'looking_glass') -// #endregion pre - -// #region register -await client.submitExecutable( - toriiRequirements, - pipe( - sugar.identifiable.newAssetDefinition( - timeDefinitionId, // [!code hl] - datamodel.AssetValueType('Quantity'), - { - mintable: datamodel.Mintable('Infinitely'), // If only we could mint more time. - }, - ), - sugar.instruction.register, - sugar.executable.instructions, - ), -) -// #endregion register - -{ - // #region mint - const mintValue = sugar.value.numericU32(32) - - await client.submitExecutable( - toriiRequirements, - pipe( - sugar.instruction.mint( - mintValue, - datamodel.IdBox( - 'AssetId', - sugar.assetId( - sugar.accountId('alice', 'wonderland'), - timeDefinitionId, // [!code hl] - ), - ), - ), - sugar.executable.instructions, - ), - ) - // #endregion mint -} diff --git a/packages/docs-recipes/src/6.transfer-assets.ts b/packages/docs-recipes/src/6.transfer-assets.ts deleted file mode 100644 index 2d3384c7..00000000 --- a/packages/docs-recipes/src/6.transfer-assets.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { datamodel, sugar } from '@iroha2/data-model' -import { Client, ToriiRequirementsForApiHttp } from '@iroha2/client' -import { pipe } from 'fp-ts/function' - -// --snip-- -declare const client: Client -declare const toriiRequirements: ToriiRequirementsForApiHttp - -const domainId = sugar.domainId('wonderland') - -const assetDefinitionId = sugar.assetDefinitionId('time', domainId) - -const amountToTransfer = sugar.value.numericU32(100) - -const fromAccount = sugar.accountId('alice', domainId) - -const toAccount = sugar.accountId('mouse', domainId) - -const transferIsi = sugar.instruction.transfer( - datamodel.IdBox('AssetId', sugar.assetId(fromAccount, assetDefinitionId)), - amountToTransfer, - datamodel.IdBox('AssetId', sugar.assetId(toAccount, assetDefinitionId)), -) - -await client.submitExecutable( - toriiRequirements, - pipe(transferIsi, sugar.executable.instructions), -) diff --git a/packages/docs-recipes/src/7.query-domains-accounts-assets.ts b/packages/docs-recipes/src/7.query-domains-accounts-assets.ts deleted file mode 100644 index d47c1f25..00000000 --- a/packages/docs-recipes/src/7.query-domains-accounts-assets.ts +++ /dev/null @@ -1,74 +0,0 @@ -// #region intro -import { Client, ToriiRequirementsForApiHttp } from '@iroha2/client' -import { sugar } from '@iroha2/data-model' - -declare const client: Client -declare const toriiRequirements: ToriiRequirementsForApiHttp -// #endregion intro - -{ - // #region domains - const result = await client.requestWithQueryBox( - toriiRequirements, - sugar.find.allDomains(), - ) - - const domains = result - .as('Ok') - .batch.enum.as('Vec') - .map((x) => x.enum.as('Identifiable').enum.as('Domain')) - - for (const domain of domains) { - console.log( - `Domain "${domain.id.name}" has ${domain.accounts.size} accounts` + - ` and ${domain.asset_definitions.size} asset definitions`, - ) - // => Domain "wonderland" has 5 accounts and 3 asset definitions - } - // #endregion domains -} - -{ - // #region accounts - const result = await client.requestWithQueryBox( - toriiRequirements, - sugar.find.allAccounts(), - ) - - const accounts = result - .as('Ok') - .batch.enum.as('Vec') - .map((x) => x.enum.as('Identifiable').enum.as('Account')) - - for (const account of accounts) { - console.log( - `Account "${account.id.name}@${account.id.domain_id.name}" ` + - `has ${account.assets.size} assets`, - ) - // => Account "alice@wonderland" has 3 assets - } - // #endregion accounts -} - -{ - // #region assets - const result = await client.requestWithQueryBox( - toriiRequirements, - sugar.find.allAssets(), - ) - - const assets = result - .as('Ok') - .batch.enum.as('Vec') - .map((x) => x.enum.as('Identifiable').enum.as('Asset')) - - for (const asset of assets) { - console.log( - `Asset "${asset.id.definition_id.name}#${asset.id.definition_id.domain_id.name}" ` + - `at account "${asset.id.account_id.name}@${asset.id.account_id.domain_id.name}" ` + - `has type "${asset.value.enum.tag}"`, - ) - // => Asset "rose#wonderland" at account "alice@wonderland" has type "Quantity" - } - // #endregion assets -} diff --git a/packages/docs-recipes/src/9.blocks-stream.ts b/packages/docs-recipes/src/9.blocks-stream.ts deleted file mode 100644 index 609e4c6d..00000000 --- a/packages/docs-recipes/src/9.blocks-stream.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Torii, ToriiRequirementsForApiWebSocket } from '@iroha2/client' -import { datamodel } from '@iroha2/data-model' - -declare const requirements: ToriiRequirementsForApiWebSocket - -const stream = await Torii.listenForBlocksStream(requirements, { - height: datamodel.NonZeroU64(1n), -}) - -stream.ee.on('block', (block) => { - const height = block.payload.header.height - console.log('Got block with height', height) -}) diff --git a/packages/i64-fixnum/CHANGELOG.md b/packages/i64-fixnum/CHANGELOG.md deleted file mode 100644 index b4149b1e..00000000 --- a/packages/i64-fixnum/CHANGELOG.md +++ /dev/null @@ -1,54 +0,0 @@ -# @iroha2/i64-fixnum - -## 0.4.2 - -### Patch Changes - -- 3b0db98: **chore**: bump `@scale-codec/*` version - -## 0.4.1 - -### Patch Changes - -- ff266d3: Update `@scale-codec/*` version that uses correct `.mjs` ext for ESM bundles - -## 0.4.0 - -### Minor Changes - -- a99d219: **fix!**: define `exports` field; use `*.cjs` extension for `require()` imports and `*.mjs` for `import` - -## 0.3.1 - -### Patch Changes - -- 49c8451: chore: include only necessary files into `files` field in the `package.json` - -## 0.3.0 - -### Minor Changes - -- 92c5a9a: Rename functions to make their purpose clearer; update doccomments - -### Patch Changes - -- 33a58c5: Bump `@scale-codec/util` version -- 92c5a9a: Add library top-level short documentation - -## 0.2.0 - -### Minor Changes - -- c59c85b: **Breaking**: migrate from `JSBI` to (native) `BigInt` - -## 0.1.3 - -### Patch Changes - -- 0a583c2: deps: update `@scale-codec/*` deps - -## 0.1.2 - -### Patch Changes - -- 1833de7: Fix package.json diff --git a/packages/i64-fixnum/package.json b/packages/i64-fixnum/package.json deleted file mode 100644 index 9fdfdd23..00000000 --- a/packages/i64-fixnum/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@iroha2/i64-fixnum", - "version": "0.4.2", - "module": "dist/lib.mjs", - "main": "dist/lib.cjs", - "types": "dist/lib.d.ts", - "exports": { - ".": { - "import": "./dist/lib.mjs", - "require": "./dist/lib.cjs", - "types": "./dist/lib.d.ts" - } - }, - "files": [ - "dist", - "CHANGELOG.md" - ], - "license": "Apache 2.0", - "dependencies": { - "@scale-codec/util": "^1.1.2" - } -} diff --git a/packages/i64-fixnum/src/lib.ts b/packages/i64-fixnum/src/lib.ts deleted file mode 100644 index 29a272bf..00000000 --- a/packages/i64-fixnum/src/lib.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @packageDocumentation - * - * JS implementation of fixed-point numbers with explicit rounding. - * Based on [loyd/fixnum](https://github.com/loyd/fixnum). - */ - -import { assert } from '@scale-codec/util' - -function fixnumCoef(precision: number | bigint): bigint { - return 10n ** BigInt(precision) -} - -/** - * Converts fixed-point number from the bigint layout to its f64 string - * representation - * - * @example - * ```ts - * fixnumToF64(1234543210001n, 4) === '123454321.0001' - * ``` - * - * @see https://github.com/loyd/fixnum/blob/77860b04eb53a2e001b3b97fe3601833e18b01b9/src/lib.rs#L628 - */ -export function bigintToF64Str(fixnum: bigint, precision: number | bigint): string { - const coef = fixnumCoef(precision) - const isNegative = fixnum < 0 - const fixnumAbs = isNegative ? -fixnum : fixnum - - const integral = fixnumAbs / coef - let fractional = fixnumAbs % coef - - let fracWidth = fractional > 0 ? Number(precision) : 0 - - while (fractional > 0 && fractional % 10n === 0n) { - fractional /= 10n - fracWidth-- - } - - return `${isNegative ? '-' : ''}${integral}.${fractional.toString().padStart(fracWidth, '0')}` -} - -/** - * Converts fixed-point number from its f64 string representation to the bigint layout. - * - * @example - * ```ts - * f64ToFixnum('-102023041.098872', 9) === -102023041098872000n - * ``` - * - * @see https://github.com/loyd/fixnum/blob/77860b04eb53a2e001b3b97fe3601833e18b01b9/src/lib.rs#L688 - */ -export function f64StrToBigint(f64: string, precision: number | bigint): bigint { - assert(f64.match(/^\-?\d+\.\d+?$/), () => `Invalid number: "${f64}"`) - - const coef = fixnumCoef(precision) - const isNegative = f64.startsWith('-') - - // const f64Str = f64ToNormalizedString(f64, precision); - const parts = f64.split('.') - if (parts.length === 1) { - const [integralStr] = parts - const integral = BigInt(integralStr) * coef - return integral - } - - const [integralStr, fractionalStr] = parts - assert( - fractionalStr.length <= precision, - () => `Provided num (${f64}) precision is too high (${fractionalStr.length} > ${precision})`, - ) - - const integral = BigInt(integralStr) - const finalIntegral = integral * coef - - const exp = 10n ** BigInt(fractionalStr.length) - const fractionalNum = BigInt(fractionalStr) - - const finalFractional = (coef / exp) * (isNegative ? -fractionalNum : fractionalNum) - - return finalIntegral + finalFractional -} - -if (import.meta.vitest) { - const { test, expect } = import.meta.vitest - - const CASES = [ - { repr_str: '0.0', repr_i64: '0', precision: 4 }, - { repr_str: '0.1', repr_i64: '1000', precision: 4 }, - { repr_str: '123454321.0001', repr_i64: '1234543210001', precision: 4 }, - { repr_str: '-123454321.0001', repr_i64: '-1234543210001', precision: 4 }, - { repr_str: '-5123.0', repr_i64: '-51230000', precision: 4 }, - { repr_str: '0.0', repr_i64: '0', precision: 9 }, - { repr_str: '0.1', repr_i64: '100000000', precision: 9 }, - { repr_str: '0.000000001', repr_i64: '1', precision: 9 }, - { repr_str: '-1.0', repr_i64: '-1000000000', precision: 9 }, - { repr_str: '-102023041.098872', repr_i64: '-102023041098872000', precision: 9 }, - ] - - test.each(CASES)( - 'Two-way conversion between f64 $repr_str and i64 $repr_i64 with precision $precision', - ({ repr_i64, repr_str, precision }) => { - const i64 = BigInt(repr_i64) - const f64 = repr_str - - expect(bigintToF64Str(i64, precision)).toEqual(f64) - expect(f64StrToBigint(f64, precision)).toEqual(i64) - }, - ) -} diff --git a/packages/iroha-source/.eslintignore b/packages/iroha-source/.eslintignore deleted file mode 100644 index 658e49db..00000000 --- a/packages/iroha-source/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -/cloned diff --git a/packages/iroha-source/.gitignore b/packages/iroha-source/.gitignore deleted file mode 100644 index 60b18caa..00000000 --- a/packages/iroha-source/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/.iroha-clone -/.iroha \ No newline at end of file diff --git a/packages/iroha-source/.prettierignore b/packages/iroha-source/.prettierignore deleted file mode 100644 index 658e49db..00000000 --- a/packages/iroha-source/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -/cloned diff --git a/packages/iroha-source/README.md b/packages/iroha-source/README.md deleted file mode 100644 index 2723ab01..00000000 --- a/packages/iroha-source/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `@iroha2/reference-iroha` - -Package to encapsulate manipulations with the reference Iroha source code. diff --git a/packages/iroha-source/config.js b/packages/iroha-source/config.js deleted file mode 100644 index 3b650036..00000000 --- a/packages/iroha-source/config.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @type {import('./src/types').RawConfig} - */ -export default { - origin: 'https://github.com/hyperledger/iroha.git', - /** - * `v2.0.0-pre-rc.20.1` (2024/04/04) - */ - rev: '742503abc4b8a8bc27d4cfd4caa8fa600e229db5', -} diff --git a/packages/iroha-source/etc/cli.ts b/packages/iroha-source/etc/cli.ts deleted file mode 100644 index 6b78dd8f..00000000 --- a/packages/iroha-source/etc/cli.ts +++ /dev/null @@ -1,22 +0,0 @@ -import yargs from 'yargs' -import { hideBin } from 'yargs/helpers' -import { buildBinary, forceClone } from '../src/lib' - -yargs(hideBin(process.argv)) - .command('clone', 'clone/update Iroha', {}, async () => { - await forceClone() - }) - .command( - 'build ', - 'Build specified binary', - (yargs) => - yargs - .positional('binary', { choices: ['iroha', 'kagami'] as const, demandOption: true }) - .option('ignore-built', { type: 'boolean', default: false }), - async (args) => { - await buildBinary(args.binary, args.ignoreBuilt) - }, - ) - .help() - .alias('h', 'help') - .parse() diff --git a/packages/iroha-source/etc/meta.ts b/packages/iroha-source/etc/meta.ts deleted file mode 100644 index c6b73a20..00000000 --- a/packages/iroha-source/etc/meta.ts +++ /dev/null @@ -1,10 +0,0 @@ -import path from 'path' -import url from 'url' - -const dirname = url.fileURLToPath(new URL('.', import.meta.url)) - -export const IROHA_DIR = path.join(dirname, '../.iroha') - -export const CLONE_DIR = path.join(dirname, '../.iroha-clone') - -export const IROHA_DIR_CLONE_META_DIR_FILE = path.join(IROHA_DIR, '.js-sdk/meta.json') diff --git a/packages/iroha-source/package.json b/packages/iroha-source/package.json deleted file mode 100644 index 8bc3702f..00000000 --- a/packages/iroha-source/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@iroha2/iroha-source", - "version": "0.0.0", - "private": true, - "main": "./src/lib.ts", - "scripts": { - "cli": "tsx etc/cli", - "clone": "pnpm cli clone", - "build:iroha": "pnpm cli build iroha" - }, - "devDependencies": { - "@types/yargs": "^17.0.22", - "yargs": "^17.6.2" - } -} diff --git a/packages/iroha-source/src/config-resolved.ts b/packages/iroha-source/src/config-resolved.ts deleted file mode 100644 index 1905e7ac..00000000 --- a/packages/iroha-source/src/config-resolved.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { P, match } from 'ts-pattern' -import { ResolvedConfig } from './types' -import CFG from '../config' -import path from 'path' -import url from 'url' - -const dirname = url.fileURLToPath(new URL('.', import.meta.url)) - -const resolved: ResolvedConfig = match(CFG) - .with( - { path: P.string }, - (cfgPath): ResolvedConfig => ({ - t: 'path', - absolutePath: path.resolve(dirname, '../', cfgPath.path), - }), - ) - .with({ origin: P.string }, (cfgGitClone): ResolvedConfig => ({ t: 'git-clone', ...cfgGitClone })) - .exhaustive() - -export default resolved diff --git a/packages/iroha-source/src/lib.ts b/packages/iroha-source/src/lib.ts deleted file mode 100644 index 603c15ef..00000000 --- a/packages/iroha-source/src/lib.ts +++ /dev/null @@ -1,65 +0,0 @@ -import chalk from 'chalk' -import consola from 'consola' -import config from './config-resolved' -import { - assertConfigurationIsGitClone, - clone, - isAccessible, - isCloneUpToDate, - resolveBinaryPath, - runCargoBuild, - syncIrohaSymlink, - syncSourceRepo, -} from './util' - -export type Binary = 'iroha' | 'kagami' - -export async function forceClone() { - assertConfigurationIsGitClone(config) - await clone(config) -} - -/** - * Resolves path to the release build of the binary. - * - * If configuration is "git-clone" and the repo is not cloned or outdated, - * it is re-created. If the binary is not yet built, builds it. These updates could be disabled with the flag. - */ -export async function resolveBinary( - bin: Binary, - options?: { - /** - * If the repo is not up-to-date or the binary is not built, then an error will be thrown. - * @default false - */ - skipUpdate?: boolean - }, -): Promise<{ path: string }> { - const skipUpdate = options?.skipUpdate ?? false - - if (config.t === 'git-clone') { - if (!(await isCloneUpToDate(config))) { - if (skipUpdate) throw new Error('Repo is out of date, cannot resolve the binary') - await clone(config) - } - } - - await syncIrohaSymlink(config) - - const binaryPath = resolveBinaryPath(bin) - - if (!skipUpdate) { - await runCargoBuild(bin) - } else if (!(await isAccessible(binaryPath))) { - throw new Error('The binary is not built') - } - - return { path: binaryPath } -} - -export async function buildBinary(bin: Binary, ignoreBuilt = false): Promise { - await syncSourceRepo(config) - const path = resolveBinaryPath(bin) - if (ignoreBuilt || !(await isAccessible(path))) await runCargoBuild(bin) - consola.success(`${chalk.magenta.bold(bin)} is built`) -} diff --git a/packages/iroha-source/src/subentries/configs.ts b/packages/iroha-source/src/subentries/configs.ts deleted file mode 100644 index 2faad315..00000000 --- a/packages/iroha-source/src/subentries/configs.ts +++ /dev/null @@ -1,5 +0,0 @@ -import CLIENT_CLI_CONFIG from '../../.iroha/configs/client/config.json' - -export { CLIENT_CLI_CONFIG } - -export type ClientCliConfig = typeof CLIENT_CLI_CONFIG diff --git a/packages/iroha-source/src/subentries/executor.ts b/packages/iroha-source/src/subentries/executor.ts deleted file mode 100644 index 8d8c0a21..00000000 --- a/packages/iroha-source/src/subentries/executor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { fs, path } from 'zx' -import { IROHA_DIR } from '../../etc/meta' - -export default fs.readFileSync(path.join(IROHA_DIR, 'configs/peer/executor.wasm')) diff --git a/packages/iroha-source/src/types.ts b/packages/iroha-source/src/types.ts deleted file mode 100644 index e684e248..00000000 --- a/packages/iroha-source/src/types.ts +++ /dev/null @@ -1,34 +0,0 @@ -export interface RawGitCloneConfiguration { - /** - * Origin git repo, e.g. `https://github.com/hyperledger/iroha.git` - */ - origin: string - /** - * Revision to check-out on, e.g. `iroha2-lts` or `48e298dad4ccb7e526a9187c24554ca1804d1edc` - */ - rev: string -} - -/** - * If this configuration is used, Iroha will not be cloned, but used as-is - * without any changes - */ -export interface RawPathConfiguration { - /** - * Local path to the iroha source repo - */ - path: string -} - -export type RawConfig = RawGitCloneConfiguration | RawPathConfiguration - -export type ResolvedConfig = ResolvedConfigGitClone | ResolvedConfigPath - -export interface ResolvedConfigPath { - t: 'path' - absolutePath: string -} - -export interface ResolvedConfigGitClone extends RawGitCloneConfiguration { - t: 'git-clone' -} diff --git a/packages/iroha-source/src/util.ts b/packages/iroha-source/src/util.ts deleted file mode 100644 index 60c5ae51..00000000 --- a/packages/iroha-source/src/util.ts +++ /dev/null @@ -1,103 +0,0 @@ -import chalk from 'chalk' -import consola from 'consola' -import del from 'del' -import { type Options as ExecaOptions, execa } from 'execa' -import makeDir from 'make-dir' -import { fs, path } from 'zx' -import url from 'url' -import { CLONE_DIR, IROHA_DIR, IROHA_DIR_CLONE_META_DIR_FILE } from '../etc/meta' -import { RawGitCloneConfiguration, ResolvedConfig, ResolvedConfigGitClone } from './types' - -export async function clone(config: RawGitCloneConfiguration): Promise { - consola.info( - `Cloning Git repo with origin ${chalk.green.bold(config.origin)} ` + - `at revision ${chalk.magenta.bold(config.rev)} into ${chalk.blue.bold(CLONE_DIR)}`, - ) - - await del(CLONE_DIR, { force: true }) - await makeDir(CLONE_DIR) - const EXECA_OPTS: ExecaOptions = { cwd: CLONE_DIR, stdio: 'inherit' } - await execa('git', ['init', '--quiet'], EXECA_OPTS) - await execa('git', ['remote', 'add', 'origin', config.origin], EXECA_OPTS) - await execa('git', ['fetch', 'origin', config.rev], EXECA_OPTS) - await execa('git', ['reset', '--hard', 'FETCH_HEAD'], EXECA_OPTS) - - const META_FILE_DIR = path.dirname(IROHA_DIR_CLONE_META_DIR_FILE) - await makeDir(META_FILE_DIR) - await fs.writeFile(path.join(META_FILE_DIR, '.gitignore'), '*\n') - await fs.writeFile(IROHA_DIR_CLONE_META_DIR_FILE, JSON.stringify(config)) - - consola.success('Iroha Git repo is cloned') -} - -export async function isCloneUpToDate(config: RawGitCloneConfiguration): Promise { - try { - const meta: RawGitCloneConfiguration = await import(IROHA_DIR_CLONE_META_DIR_FILE) - if (meta.origin === config.origin && meta.rev === config.rev) return true - consola.debug('Iroha repo clone exists, but is not up-to-date') - return false - } catch (err) { - consola.debug( - `Error while reading the metadata of the cloned repo. Assuming the clone as not up-to-date.` + - `\nActual error: ${String(err)}`, - ) - return false - } -} - -export function resolveBinaryPath(bin: string): string { - return path.join(IROHA_DIR, `target/release`, bin) -} - -export async function runCargoBuild(crate: string): Promise { - const process = execa('cargo', ['build', '-Zlints', '--release', '--package', crate], { - stdio: 'inherit', - cwd: IROHA_DIR, - env: { - // Temporary workaround until https://github.com/hyperledger/iroha/pull/4015 - // is not backported into `iroha2-stable` - RUSTFLAGS: '-A missing-docs -A unused', - }, - }) - consola.debug(`Spawn %o`, process.spawnargs) - await process -} - -export async function isAccessible(path: string, mode?: number): Promise { - return fs - .access(path, mode) - .then(() => true) - .catch(() => false) -} - -async function readlink(path: string): Promise<{ t: 'ok'; target: string } | { t: 'err' }> { - return fs - .readlink(path, { encoding: 'utf-8' }) - .then((target) => { - if (typeof target !== 'string') throw new Error('expected a string') - return { t: 'ok', target } as const - }) - .catch(() => ({ t: 'err' })) -} - -export function assertConfigurationIsGitClone(cfg: ResolvedConfig): asserts cfg is ResolvedConfigGitClone { - if (cfg.t !== 'git-clone') - throw new Error(`Expected to work with git-clone configuration, but got cfg with type of "${cfg.t}"`) -} - -export async function syncIrohaSymlink(config: ResolvedConfig) { - const symlinkDir = IROHA_DIR - const symlinkDirRelative = path.relative(url.fileURLToPath(new URL('../', import.meta.url)), symlinkDir) - const target = config.t === 'git-clone' ? CLONE_DIR : config.absolutePath - const existingLink = await readlink(symlinkDir) - if (!(existingLink.t === 'ok' && existingLink.target === target)) { - await del(symlinkDir, { force: true }) - consola.debug(chalk`Removed existing {blue ${symlinkDirRelative}}`) - await fs.symlink(target, symlinkDir) - consola.debug(chalk`Created symlink {blue ${symlinkDirRelative}} -> {blue ${target}}`) - } -} - -export async function syncSourceRepo(config: ResolvedConfig) { - if (config.t === 'git-clone' && !(await isCloneUpToDate(config))) await clone(config) -} diff --git a/packages/test-configuration/package.json b/packages/test-configuration/package.json deleted file mode 100644 index 93ae9a7b..00000000 --- a/packages/test-configuration/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "@iroha2/test-configuration", - "private": true, - "version": "0.0.0", - "main": "src/lib.ts", - "devDependencies": { - "@iroha2/data-model": "workspace:^", - "@iroha2/iroha-source": "workspace:^", - "pino-pretty": "^10.0.0", - "type-fest": "^3.9.0" - } -} diff --git a/packages/test-configuration/src/lib.ts b/packages/test-configuration/src/lib.ts deleted file mode 100644 index 5f9b6601..00000000 --- a/packages/test-configuration/src/lib.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { CLIENT_CLI_CONFIG } from '@iroha2/iroha-source/src/subentries/configs' -import { datamodel } from '@iroha2/data-model' - -export const PEER_GENESIS = { - transactions: [ - [ - { - Register: { - NewDomain: { - id: 'wonderland', - logo: null, - metadata: { - key: { - String: 'value', - }, - }, - }, - }, - }, - { - Register: { - NewAccount: { - id: 'alice@wonderland', - signatories: ['ed01207233BFC89DCBD68C19FDE6CE6158225298EC1131B6A130D1AEB454C1AB5183C0'], - metadata: { - key: { - String: 'value', - }, - }, - }, - }, - }, - { - Register: { - NewAccount: { - id: 'bob@wonderland', - signatories: ['ed01207233BFC89DCBD68C19FDE6CE6158225298EC1131B6A130D1AEB454C1AB5183C0'], - metadata: { - key: { - String: 'value', - }, - }, - }, - }, - }, - { - Register: { - NewAssetDefinition: { - id: 'rose#wonderland', - value_type: 'Quantity', - mintable: 'Infinitely', - logo: null, - metadata: {}, - }, - }, - }, - { - Register: { - NewDomain: { - id: 'garden_of_live_flowers', - logo: null, - metadata: {}, - }, - }, - }, - { - Register: { - NewAccount: { - id: 'carpenter@garden_of_live_flowers', - signatories: ['ed01207233BFC89DCBD68C19FDE6CE6158225298EC1131B6A130D1AEB454C1AB5183C0'], - metadata: {}, - }, - }, - }, - { - Register: { - NewAssetDefinition: { - id: 'cabbage#garden_of_live_flowers', - value_type: 'Quantity', - mintable: 'Infinitely', - logo: null, - metadata: {}, - }, - }, - }, - { - Mint: { - object: '13_u32', - destination_id: { - AssetId: 'rose##alice@wonderland', - }, - }, - }, - { - Mint: { - object: '44_u32', - destination_id: { - AssetId: 'cabbage#garden_of_live_flowers#alice@wonderland', - }, - }, - }, - { - Grant: { - object: { - PermissionToken: { - definition_id: 'CanSetParameters', - payload: null, - }, - }, - destination_id: { - AccountId: 'alice@wonderland', - }, - }, - }, - { - Register: { - NewRole: { - id: 'ALICE_METADATA_ACCESS', - permissions: [ - { - definition_id: 'CanRemoveKeyValueInUserAccount', - payload: { - account_id: 'alice@wonderland', - }, - }, - { - definition_id: 'CanSetKeyValueInUserAccount', - payload: { - account_id: 'alice@wonderland', - }, - }, - ], - }, - }, - }, - ], - ], - executor: './executor.wasm', -} - -export const PEER_CONFIG = { - PUBLIC_KEY: 'ed01201C61FAF8FE94E253B93114240394F79A607B7FA55F9E5A41EBEC74B88055768B', - PRIVATE_KEY: { - digest_function: 'ed25519', - payload: - '282ED9F3CF92811C3818DBC4AE594ED59DC1A2F78E4241E31924E101D6B1FB831C61FAF8FE94E253B93114240394F79A607B7FA55F9E5A41EBEC74B88055768B', - }, - TORII: { - API_URL: '127.0.0.1:8080', - P2P_ADDR: '127.0.0.1:1337', - }, - GENESIS: { - ACCOUNT_PUBLIC_KEY: 'ed01203F4E3E98571B55514EDC5CCF7E53CA7509D89B2868E62921180A6F57C2F4E255', - ACCOUNT_PRIVATE_KEY: { - digest_function: 'ed25519', - payload: - '038AE16B219DA35AA036335ED0A43C28A2CC737150112C78A7B8034B9D99C9023F4E3E98571B55514EDC5CCF7E53CA7509D89B2868E62921180A6F57C2F4E255', - }, - }, - SUMERAGI: { - BLOCK_TIME_MS: 0, - COMMIT_TIME_LIMIT_MS: 0, - }, - KURA: { - BLOCK_STORE_PATH: './storage', - }, -} - -const parseAccountId = (acc: string): datamodel.AccountId => { - const [name, domain] = acc.split('@') - return datamodel.AccountId({ name: name, domain_id: datamodel.DomainId({ name: domain }) }) -} - -const { - TORII: { API_URL: TORII_API_ADDRESS }, - SUMERAGI: { BLOCK_TIME_MS, COMMIT_TIME_LIMIT_MS }, -} = PEER_CONFIG - -export const CLIENT_CONFIG = { - torii: { - apiURL: 'http://' + TORII_API_ADDRESS, - }, - accountId: parseAccountId(CLIENT_CLI_CONFIG.ACCOUNT_ID), - keyPair: { - public_key: CLIENT_CLI_CONFIG.PUBLIC_KEY, - private_key: - // This renaming is already happened in crypto, but not yet in the upstream Iroha version. - { - algorithm: CLIENT_CLI_CONFIG.PRIVATE_KEY.digest_function, - payload: CLIENT_CLI_CONFIG.PRIVATE_KEY.payload, - }, - }, -} - -// https://github.com/hyperledger/iroha/blob/b7e5bf0925951df066de31d486165c66a3d65cee/config/src/sumeragi.rs#L106-L112 -export const PIPELINE_MS = BLOCK_TIME_MS + COMMIT_TIME_LIMIT_MS diff --git a/packages/test-peer/.gitignore b/packages/test-peer/.gitignore deleted file mode 100644 index ceeb05b4..00000000 --- a/packages/test-peer/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/tmp diff --git a/packages/test-peer/CHANGELOG.md b/packages/test-peer/CHANGELOG.md deleted file mode 100644 index 6d574d6c..00000000 --- a/packages/test-peer/CHANGELOG.md +++ /dev/null @@ -1,6 +0,0 @@ -# @iroha2/test-peer - -## 0.0.1 -### Patch Changes - -- 1833de7: Make internal packages private, clean their `package.json`s diff --git a/packages/test-peer/README.md b/packages/test-peer/README.md deleted file mode 100644 index 04a30457..00000000 --- a/packages/test-peer/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# `@iroha2/test-peer` - -The `@iroha2/test-peer` package is a wrapper around the `iroha_cli` crate binary that provides an easy-to-use interface for working with the Iroha peer. The package is useful for tests and is used by `@iroha2/client` for its e2e-tests. - -## Installation - -**Note**: The `@iroha2/test-peer` package requires Rust toolchain and Cargo to be installed on the working machine. - -The package initializes on `postinstall` hook. If you have installed workspace packages, then it should be ready to use. If not, you could manually run `pnpm postinstall` script in this package. - -## Peer logs - -**Tip**: Explore underlying peer logs. Use [`DEBUG` convention](https://github.com/visionmedia/debug#usage). - -For example: - -```shell -DEBUG=* pnpm cli -- start -``` diff --git a/packages/test-peer/etc/cli.ts b/packages/test-peer/etc/cli.ts deleted file mode 100644 index 6a5b60e9..00000000 --- a/packages/test-peer/etc/cli.ts +++ /dev/null @@ -1,33 +0,0 @@ -import yargs from 'yargs' -import { hideBin } from 'yargs/helpers' -import consola from 'consola' -import { clearAll, clearPeerStorage, prepareConfiguration, startPeer } from '../src/lib' - -yargs(hideBin(process.argv)) - .command('clear-all', 'Clean configuration', {}, async () => { - await clearAll() - }) - .command( - 'clean:effects', - 'Clean peer side-effects', - (y) => y.positional('kura-block-store-path', { type: 'string', demandOption: true }), - async (args) => { - await clearPeerStorage() - }, - ) - .command( - 'start', - 'Start peer', - (y) => y, - async (args) => { - consola.info('Starting peer') - await startPeer() - consola.info('Started! Kill this process to kill the peer') - }, - ) - .command('config-from-client-tests', 'Set peer configuration from source Iroha repo', {}, async () => { - await prepareConfiguration() - consola.success('Config is set') - }) - .help() - .parse() diff --git a/packages/test-peer/etc/meta.ts b/packages/test-peer/etc/meta.ts deleted file mode 100644 index b953e8bb..00000000 --- a/packages/test-peer/etc/meta.ts +++ /dev/null @@ -1,12 +0,0 @@ -import path from 'path' -import url from 'url' - -const dirname = url.fileURLToPath(new URL('.', import.meta.url)) - -export const TMP_DIR = path.resolve(dirname, '../tmp') - -export const TMP_IROHA_BIN = path.resolve(TMP_DIR, 'iroha') - -export const BLOCK_STORE_PATH_RELATIVE = './storage' - -export const EXECUTOR_WASM_PATH_RELATIVE = './executor.wasm' diff --git a/packages/test-peer/package.json b/packages/test-peer/package.json deleted file mode 100644 index 0e1d2b42..00000000 --- a/packages/test-peer/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "@iroha2/test-peer", - "version": "0.0.1", - "private": true, - "main": "src/lib.ts", - "scripts": { - "cli": "DEBUG=* tsx etc/cli", - "cli:config": "pnpm cli config-from-client-tests" - }, - "devDependencies": { - "@iroha2/client": "workspace:^7.0.0", - "@iroha2/iroha-source": "workspace:^0.0.0", - "@iroha2/test-configuration": "workspace:^", - "@types/debug": "^4.1.7", - "@types/yargs": "^17.0.22", - "axios": "^0.24.0", - "debug": "^4.3.4", - "h3": "^1.6.5", - "listhen": "^1.0.4", - "pino": "^8.14.1", - "pino-http": "^8.3.3", - "pino-pretty": "^10.0.0", - "yargs": "^17.6.2" - } -} diff --git a/packages/test-peer/src/api/client.ts b/packages/test-peer/src/api/client.ts deleted file mode 100644 index 357d1984..00000000 --- a/packages/test-peer/src/api/client.ts +++ /dev/null @@ -1,27 +0,0 @@ -import Axios from 'axios' - -const axios = Axios.create() - -export function setBaseURL(url: string) { - axios.defaults.baseURL = url -} - -export async function prepareConfiguration() { - await axios.post('/prepare-configuration') -} - -export async function clearAll() { - await axios.post('/clear/all') -} - -export async function clearPeerStorage() { - await axios.post('/clear/peer-storage') -} - -export async function startPeer({ genesis }: { genesis?: boolean } = {}) { - await axios.post('/peer/start', null, { params: { genesis: genesis ?? true } }) -} - -export async function killPeer() { - await axios.post('/peer/kill') -} diff --git a/packages/test-peer/src/api/server.ts b/packages/test-peer/src/api/server.ts deleted file mode 100644 index 0320db1c..00000000 --- a/packages/test-peer/src/api/server.ts +++ /dev/null @@ -1,97 +0,0 @@ -import * as h3 from 'h3' -import { listen } from 'listhen' -import pinoHttp from 'pino-http' -import pino from 'pino' -import { P, match } from 'ts-pattern' - -import * as lib from '../lib' - -export async function run(port = 8765) { - let peer: lib.StartPeerReturn | undefined - - const app = h3.createApp() - - const router = h3 - .createRouter() - .post( - '/prepare-configuration', - h3.eventHandler(async (event) => { - await lib.prepareConfiguration() - - h3.setResponseStatus(event, 204) - await h3.send(event) - }), - ) - .post( - '/clear/all', - h3.eventHandler(async (event) => { - await lib.clearAll() - h3.setResponseStatus(event, 204) - await h3.send(event) - }), - ) - .post( - '/clear/peer-storage', - h3.eventHandler(async (event) => { - await lib.clearPeerStorage() - h3.setResponseStatus(event, 204) - await h3.send(event) - }), - ) - .post( - '/peer/start', - h3.eventHandler(async (event) => { - if (peer) { - h3.setResponseStatus(event, 400) - return 'Kill first' - } - - console.log(event.context) - - const parsed = match(h3.getQuery(event)) - .with( - { - genesis: P.select('genesisStr', P.union('false', 'true')), - }, - ({ genesisStr }) => { - return { withGenesis: genesisStr === 'true' } - }, - ) - .otherwise(() => { - throw new Error('Invalid params') - }) - - peer = await lib.startPeer(parsed) - - h3.setResponseStatus(event, 204) - await h3.send(event) - }), - ) - .post( - '/peer/kill', - h3.eventHandler(async (event) => { - if (!peer) { - h3.setResponseStatus(event, 204) - return 'Not alive' - } - - await peer.kill() - peer = undefined - - h3.setResponseStatus(event, 204) - await h3.send(event) - }), - ) - .get( - '/peer/is-alive', - h3.eventHandler(async () => { - return { isAlive: peer?.isAlive() ?? false } - }), - ) - - app - .use(h3.eventHandler(h3.fromNodeMiddleware(pinoHttp({ logger: pino({ transport: { target: 'pino-pretty' } }) })))) - .use(router) - - await listen(h3.toNodeListener(app), { port }) -} diff --git a/packages/test-peer/src/dbg.ts b/packages/test-peer/src/dbg.ts deleted file mode 100644 index 47692e2f..00000000 --- a/packages/test-peer/src/dbg.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Debug from 'debug' - -const debug = Debug('@iroha2/test-peer') - -export default debug diff --git a/packages/test-peer/src/lib.ts b/packages/test-peer/src/lib.ts deleted file mode 100644 index 9dff3d73..00000000 --- a/packages/test-peer/src/lib.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { resolveBinary } from '@iroha2/iroha-source' -import { execa } from 'execa' -import makeDir from 'make-dir' -import path from 'path' -import readline from 'readline' -import invariant from 'tiny-invariant' -import { match } from 'ts-pattern' -import { fs } from 'zx' -import { BLOCK_STORE_PATH_RELATIVE, EXECUTOR_WASM_PATH_RELATIVE, TMP_DIR } from '../etc/meta' -import debug from './dbg' -import { rmForce, setConfigurationChecked, waitUntilPeerIsHealthy } from './util' -import EXECUTOR_WASM from '@iroha2/iroha-source/src/subentries/executor' -import { CLIENT_CONFIG, PEER_CONFIG, PEER_GENESIS } from '@iroha2/test-configuration' - -/** - * Time within to check if peer is up and running - */ -const HEALTH_CHECK_TIMEOUT = 1_500 -const HEALTH_CHECK_INTERVAL = 200 - -export interface StartPeerParams { - /** - * @default true - */ - withGenesis?: boolean -} - -export interface KillPeerParams { - /** - * If set to `true`, then after killing all side effects will be cleared, e.g. saved blocks - * - * TODO remove not `blocks` dir, but dir, specified in kura config - */ - cleanSideEffects?: boolean -} - -export interface StartPeerReturn { - /** - * Kill peer's process - */ - kill: () => Promise - - /** - * Check for alive status - */ - isAlive: () => boolean -} - -export interface IrohaConfiguration { - genesis: unknown - config: unknown -} - -function resolveTempJsonConfigFile(key: keyof IrohaConfiguration): string { - return path.resolve(TMP_DIR, `${key}.json`) -} - -async function prepareTempDir(): Promise { - await makeDir(TMP_DIR) -} - -async function reportTmpContents() { - const contents = await fs.readdir(TMP_DIR) - debug('Dir contents BEFORE start: %o', contents) -} - -// eslint-disable-next-line no-undef -function readableToDebug(input: NodeJS.ReadableStream, prefix: string) { - const dbg = debug.extend(prefix) - readline.createInterface(input).on('line', (line) => dbg(line)) -} - -/** - * Start network with a single peer. - * - * **Note:** Iroha binary must be pre-built. - */ -export async function startPeer(params?: StartPeerParams): Promise { - const iroha = (await resolveBinary('iroha', { skipUpdate: true })).path - - await reportTmpContents() - - // state - let isAlive = false - - // starting peer - const withGenesis: boolean = params?.withGenesis ?? true - const subprocess = execa(iroha, withGenesis ? ['--submit-genesis'] : [], { - cwd: TMP_DIR, - env: { - IROHA2_CONFIG_PATH: resolveTempJsonConfigFile('config'), - IROHA2_GENESIS_PATH: resolveTempJsonConfigFile('genesis'), - }, - }) - - invariant(subprocess.stdout && subprocess.stderr) - readableToDebug(subprocess.stdout, 'subprocess-stdout') - readableToDebug(subprocess.stderr, 'subprocess-stderr') - - subprocess.once('spawn', () => { - isAlive = true - debug('Subprocess spawned') - }) - - subprocess.on('error', (err) => { - debug('Subprocess error:', err) - }) - - const healthCheckAbort = new AbortController() - const irohaIsHealthyPromise = waitUntilPeerIsHealthy(CLIENT_CONFIG.torii.apiURL, { - checkInterval: HEALTH_CHECK_INTERVAL, - checkTimeout: HEALTH_CHECK_TIMEOUT, - abort: healthCheckAbort.signal, - }) - - const exitPromise = new Promise((resolve) => { - subprocess.once('exit', (...args) => { - debug('Peer exited:', args) - isAlive = false - resolve() - }) - }) - - const kill = async function () { - if (!isAlive) throw new Error('Already dead') - debug('Killing peer...') - subprocess.kill('SIGTERM', { forceKillAfterTimeout: 500 }) - await exitPromise - debug('Peer is killed') - } - - await new Promise((resolve, reject) => { - exitPromise.then(() => { - reject(new Error('Iroha has exited already, maybe something went wrong')) - healthCheckAbort.abort() - }) - irohaIsHealthyPromise.then(() => resolve()).catch((err) => reject(err)) - }) - - return { - kill, - isAlive: () => isAlive, - } -} - -export async function prepareConfiguration() { - await setConfigurationChecked({ - // parsing with type-level check - peerGenesis: match(PEER_GENESIS) - .with({ executor: EXECUTOR_WASM_PATH_RELATIVE }, (x) => x) - .otherwise(() => { - throw new Error('Invalid genesis') - }), - peerConfig: match(PEER_CONFIG) - .with({ KURA: { BLOCK_STORE_PATH: BLOCK_STORE_PATH_RELATIVE } }, (x) => x) - .otherwise(() => { - throw new Error('Invalid peer config') - }), - - executorWasm: EXECUTOR_WASM, - }) -} - -/** - * Clear working peer directory completely - */ -export async function clearAll(): Promise { - const deleted = await rmForce(path.join(TMP_DIR, '*')) - debug('working dir is cleared: %o', deleted) -} - -/** - * Clear peer storage. Use it before each peer startup if you want to isolate states. - */ -export async function clearPeerStorage() { - const rmTarget = path.resolve(TMP_DIR, BLOCK_STORE_PATH_RELATIVE) - const deleted = await rmForce(rmTarget) - debug('Blocks are cleaned: %o', deleted) -} diff --git a/packages/test-peer/src/util.ts b/packages/test-peer/src/util.ts deleted file mode 100644 index 9fbc4f4e..00000000 --- a/packages/test-peer/src/util.ts +++ /dev/null @@ -1,71 +0,0 @@ -import del from 'del' -import { fs, path } from 'zx' -import { Torii } from '@iroha2/client' -import { BLOCK_STORE_PATH_RELATIVE, EXECUTOR_WASM_PATH_RELATIVE, TMP_DIR } from '../etc/meta' -import debug from './dbg' - -export async function saveDataAsJSON(data: unknown, destination: string): Promise { - await fs.writeFile(destination, JSON.stringify(data, null, 2), { encoding: 'utf-8' }) -} - -export async function rmForce(target: string | string[]): Promise { - return del(target, { force: true }) -} - -export async function waitUntilPeerIsHealthy( - apiURL: string, - options: { - checkInterval: number - checkTimeout: number - abort: AbortSignal - }, -): Promise { - const toriiPre = { apiURL, fetch } - - let now = Date.now() - const endAt = now + options.checkTimeout - - let aborted = false - options.abort.addEventListener('abort', () => { - aborted = true - }) - - while (true) { - if (aborted) throw new Error('Aborted') - - now = Date.now() - if (now > endAt) throw new Error(`Peer is still not alive even after ${options.checkTimeout}ms`) - - const health = await Torii.getHealth(toriiPre) - if (health.tag === 'Ok') return - debug('not yet healthy: %o', health.content) - - await new Promise((r) => setTimeout(r, options.checkInterval)) - } -} - -export interface CheckedConfig { - KURA: { BLOCK_STORE_PATH: typeof BLOCK_STORE_PATH_RELATIVE } -} - -export interface CheckedGenesis { - executor: typeof EXECUTOR_WASM_PATH_RELATIVE -} - -interface SetConfigurationCheckedParams { - peerConfig: C - peerGenesis: G - executorWasm: Buffer -} - -export async function setConfigurationChecked( - params: SetConfigurationCheckedParams, -) { - await fs.ensureDir(TMP_DIR) - await Promise.all([ - saveDataAsJSON(params.peerConfig, path.join(TMP_DIR, 'config.json')), - saveDataAsJSON(params.peerGenesis, path.join(TMP_DIR, 'genesis.json')), - fs.writeFile(path.join(TMP_DIR, EXECUTOR_WASM_PATH_RELATIVE), params.executorWasm), - ]) - debug('configuration is set') -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 07a1e8b5..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,7271 +0,0 @@ -lockfileVersion: '6.0' - -importers: - - .: - devDependencies: - '@changesets/cli': - specifier: ^2.26.2 - version: 2.26.2 - '@esbuild-kit/cjs-loader': - specifier: ^2.4.1 - version: 2.4.1 - '@iroha2/test-peer': - specifier: workspace:^0.0.1 - version: link:packages/test-peer - '@rollup/plugin-replace': - specifier: ^5.0.2 - version: 5.0.2(rollup@3.26.2) - '@types/jake': - specifier: ^0.0.33 - version: 0.0.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.9.0 - version: 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@5.2.2) - '@typescript-eslint/parser': - specifier: ^6.9.0 - version: 6.9.0(eslint@8.45.0)(typescript@5.2.2) - chalk: - specifier: 4.1.2 - version: 4.1.2 - consola: - specifier: ^2.15.3 - version: 2.15.3 - debug: - specifier: ^4.3.4 - version: 4.3.4(supports-color@8.1.1) - del: - specifier: ^6.0.0 - version: 6.1.1 - eslint: - specifier: ^8.45.0 - version: 8.45.0 - eslint-config-alloy: - specifier: ^5.0.0 - version: 5.0.0(@typescript-eslint/eslint-plugin@6.9.0)(@typescript-eslint/parser@6.9.0)(eslint-plugin-vue@9.15.1)(eslint@8.45.0)(typescript@5.2.2) - eslint-plugin-cypress: - specifier: ^2.13.3 - version: 2.13.3(eslint@8.45.0) - eslint-plugin-vue: - specifier: ^9.15.1 - version: 9.15.1(eslint@8.45.0) - execa: - specifier: ^7.0.0 - version: 7.0.0 - fp-ts: - specifier: ^2.13.1 - version: 2.14.0 - immutable: - specifier: ^4.2.4 - version: 4.2.4 - jake: - specifier: ^10.8.5 - version: 10.8.5 - make-dir: - specifier: ^3.1.0 - version: 3.1.0 - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 - prettier: - specifier: ^3.0.3 - version: 3.0.3 - prettier-eslint: - specifier: ^16.1.2 - version: 16.1.2 - prettier-eslint-cli: - specifier: ^8.0.1 - version: 8.0.1(prettier-eslint@16.1.2) - rollup: - specifier: ^3.26.2 - version: 3.26.2 - rollup-plugin-dts: - specifier: ^5.3.0 - version: 5.3.0(rollup@3.26.2)(typescript@5.2.2) - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.1 - ts-pattern: - specifier: ^5.0.1 - version: 5.0.1 - tsx: - specifier: ^3.12.2 - version: 3.12.2 - type-fest: - specifier: ^3.9.0 - version: 3.9.0 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - vite: - specifier: ^5.1.5 - version: 5.1.5(sass@1.54.0) - vitest: - specifier: ^1.3.1 - version: 1.3.1 - zx: - specifier: ^7.2.0 - version: 7.2.0 - - packages/client: - dependencies: - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../crypto/packages/core - '@iroha2/data-model': - specifier: workspace:7.1.0 - version: link:../data-model - debug: - specifier: ^4.3.4 - version: 4.3.4(supports-color@8.1.1) - emittery: - specifier: ^0.10.1 - version: 0.10.2 - json-bigint: - specifier: ^1.0.0 - version: 1.0.0 - type-fest: - specifier: ^3.6.1 - version: 3.9.0 - devDependencies: - '@types/debug': - specifier: ^4.1.7 - version: 4.1.7 - '@types/ws': - specifier: ^8.5.3 - version: 8.5.3 - ws: - specifier: ^8.8.1 - version: 8.8.1 - - packages/client/test/integration/test-node: - devDependencies: - '@iroha2/client': - specifier: workspace:^7.1.0 - version: link:../../.. - '@iroha2/crypto-target-node': - specifier: workspace:^2.0.0 - version: link:../../../../crypto/packages/target-node - '@iroha2/test-configuration': - specifier: workspace:^ - version: link:../../../../test-configuration - '@iroha2/test-peer': - specifier: workspace:^0.0.1 - version: link:../../../../test-peer - allure-vitest: - specifier: ^2.14.0 - version: 2.14.0 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - fp-ts: - specifier: ^2.13.1 - version: 2.14.0 - immer: - specifier: ^9.0.19 - version: 9.0.19 - vite: - specifier: ^5.1.5 - version: 5.1.5(sass@1.54.0) - - packages/client/test/integration/test-web: - devDependencies: - '@bahmutov/cypress-esbuild-preprocessor': - specifier: ^2.2.0 - version: 2.2.0(esbuild@0.17.10) - '@iroha2/client': - specifier: workspace:^7.1.0 - version: link:../../.. - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../../../../crypto/packages/core - '@iroha2/crypto-target-web': - specifier: workspace:^2.0.0 - version: link:../../../../crypto/packages/target-web - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../../../../data-model - '@iroha2/test-configuration': - specifier: workspace:^ - version: link:../../../../test-configuration - '@iroha2/test-peer': - specifier: workspace:^0.0.1 - version: link:../../../../test-peer - '@scale-codec/util': - specifier: ^1.1.2 - version: 1.1.2 - '@vitejs/plugin-vue': - specifier: ^5.0.4 - version: 5.0.4(vite@5.1.5)(vue@3.2.47) - '@vue-kakuyaku/core': - specifier: ^0.4.3 - version: 0.4.3 - '@vueuse/core': - specifier: ^8.0.1 - version: 8.9.4(vue@3.2.47) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - cypress: - specifier: ^12.5.1 - version: 12.5.1 - esbuild: - specifier: ^0.17.10 - version: 0.17.10 - fp-ts: - specifier: ^2.13.1 - version: 2.14.0 - sass: - specifier: ^1.52.1 - version: 1.54.0 - start-server-and-test: - specifier: ^1.14.0 - version: 1.14.0 - vite: - specifier: ^5.1.5 - version: 5.1.5(sass@1.54.0) - vue: - specifier: ^3.2.47 - version: 3.2.47 - - packages/crypto: {} - - packages/crypto/packages/core: - dependencies: - '@iroha2/crypto-util': - specifier: workspace:^0.2.0 - version: link:../util - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../../../data-model - devDependencies: - '@iroha2/crypto-interface-wrap': - specifier: workspace:^0.0.0 - version: link:../interface-wrap - - packages/crypto/packages/interface-wrap: - devDependencies: - '@iroha2/crypto-util': - specifier: workspace:^0.2.0 - version: link:../util - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../../../data-model - - packages/crypto/packages/target-bundler: - dependencies: - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../core - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../../../data-model - devDependencies: - '@iroha2/crypto-interface-wrap': - specifier: workspace:^0.0.0 - version: link:../interface-wrap - - packages/crypto/packages/target-node: - dependencies: - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../core - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../../../data-model - devDependencies: - '@iroha2/crypto-interface-wrap': - specifier: workspace:^0.0.0 - version: link:../interface-wrap - - packages/crypto/packages/target-web: - dependencies: - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../core - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../../../data-model - devDependencies: - '@iroha2/crypto-interface-wrap': - specifier: workspace:^0.0.0 - version: link:../interface-wrap - - packages/crypto/packages/util: {} - - packages/crypto/test/integration/interfaces: - devDependencies: - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../../../packages/core - '@iroha2/crypto-target-bundler': - specifier: workspace:^2.0.0 - version: link:../../../packages/target-bundler - '@iroha2/crypto-target-node': - specifier: workspace:^2.0.0 - version: link:../../../packages/target-node - '@iroha2/crypto-target-web': - specifier: workspace:^2.0.0 - version: link:../../../packages/target-web - - packages/crypto/test/integration/test-node: - devDependencies: - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../../../packages/core - '@iroha2/crypto-target-node': - specifier: workspace:^2.0.0 - version: link:../../../packages/target-node - - packages/crypto/test/integration/test-web: - devDependencies: - '@iroha2/crypto-target-web': - specifier: workspace:^2.0.0 - version: link:../../../packages/target-web - cypress: - specifier: ^12.5.1 - version: 12.5.1 - start-server-and-test: - specifier: ^1.14.0 - version: 1.14.0 - vite: - specifier: ^5.1.5 - version: 5.1.5(sass@1.54.0) - - packages/data-model: - dependencies: - '@iroha2/i64-fixnum': - specifier: workspace:^0.4.2 - version: link:../i64-fixnum - '@scale-codec/definition-runtime': - specifier: ^4.0.1 - version: 4.0.1 - devDependencies: - '@iroha2/data-model-schema': - specifier: workspace:* - version: link:../data-model-schema - '@scale-codec/definition-compiler': - specifier: ^4.0.1 - version: 4.0.1 - '@scale-codec/util': - specifier: ^1.1.2 - version: 1.1.2 - '@types/debug': - specifier: ^4.1.7 - version: 4.1.7 - camelcase: - specifier: ^7.0.1 - version: 7.0.1 - debug: - specifier: ^4.3.4 - version: 4.3.4(supports-color@8.1.1) - fp-ts: - specifier: ^2.16.0 - version: 2.16.0 - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.1 - - packages/data-model-rust-samples: {} - - packages/data-model-schema: - devDependencies: - '@iroha2/iroha-source': - specifier: workspace:^0.0.0 - version: link:../iroha-source - - packages/docs-recipes: - devDependencies: - '@iroha2/client': - specifier: workspace:^7.1.0 - version: link:../client - '@iroha2/crypto-core': - specifier: workspace:^2.0.0 - version: link:../crypto/packages/core - '@iroha2/crypto-target-bundler': - specifier: workspace:^2.0.0 - version: link:../crypto/packages/target-bundler - '@iroha2/crypto-target-node': - specifier: workspace:^2.0.0 - version: link:../crypto/packages/target-node - '@iroha2/crypto-target-web': - specifier: workspace:^2.0.0 - version: link:../crypto/packages/target-web - '@iroha2/data-model': - specifier: workspace:^7.1.0 - version: link:../data-model - fp-ts: - specifier: ^2.13.1 - version: 2.14.0 - node-fetch: - specifier: ^3.3.0 - version: 3.3.0 - undici: - specifier: ^5.20.0 - version: 5.20.0 - - packages/i64-fixnum: - dependencies: - '@scale-codec/util': - specifier: ^1.1.2 - version: 1.1.2 - - packages/iroha-source: - devDependencies: - '@types/yargs': - specifier: ^17.0.22 - version: 17.0.22 - yargs: - specifier: ^17.6.2 - version: 17.6.2 - - packages/test-configuration: - devDependencies: - '@iroha2/data-model': - specifier: workspace:^ - version: link:../data-model - '@iroha2/iroha-source': - specifier: workspace:^ - version: link:../iroha-source - pino-pretty: - specifier: ^10.0.0 - version: 10.0.0 - type-fest: - specifier: ^3.9.0 - version: 3.9.0 - - packages/test-peer: - devDependencies: - '@iroha2/client': - specifier: workspace:^7.0.0 - version: link:../client - '@iroha2/iroha-source': - specifier: workspace:^0.0.0 - version: link:../iroha-source - '@iroha2/test-configuration': - specifier: workspace:^ - version: link:../test-configuration - '@types/debug': - specifier: ^4.1.7 - version: 4.1.7 - '@types/yargs': - specifier: ^17.0.22 - version: 17.0.22 - axios: - specifier: ^0.24.0 - version: 0.24.0(debug@4.3.4) - debug: - specifier: ^4.3.4 - version: 4.3.4(supports-color@8.1.1) - h3: - specifier: ^1.6.5 - version: 1.6.5 - listhen: - specifier: ^1.0.4 - version: 1.0.4 - pino: - specifier: ^8.14.1 - version: 8.14.1 - pino-http: - specifier: ^8.3.3 - version: 8.3.3 - pino-pretty: - specifier: ^10.0.0 - version: 10.0.0 - yargs: - specifier: ^17.6.2 - version: 17.6.2 - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - requiresBuild: true - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.20.15: - resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} - engines: {node: '>=6.0.0'} - dependencies: - '@babel/types': 7.20.7 - dev: true - - /@babel/runtime@7.23.2: - resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: true - - /@babel/types@7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@bahmutov/cypress-esbuild-preprocessor@2.2.0(esbuild@0.17.10): - resolution: {integrity: sha512-pTvxRi6+OFsXy6uCn/HlO5zi0fUZWbiCtTiLTDf/+kgEfZ/Y8WIxZ2pjuir9MEM8prQenBw60TLcM0wcazh7+Q==} - peerDependencies: - esbuild: '>=0.17.0' - dependencies: - debug: 4.3.4(supports-color@8.1.1) - esbuild: 0.17.10 - transitivePeerDependencies: - - supports-color - dev: true - - /@changesets/apply-release-plan@6.1.4: - resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/config': 2.3.1 - '@changesets/get-version-range-type': 0.3.2 - '@changesets/git': 2.0.0 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.5.4 - dev: true - - /@changesets/assemble-release-plan@5.2.4: - resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.6 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - semver: 7.5.4 - dev: true - - /@changesets/changelog-git@0.1.14: - resolution: {integrity: sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==} - dependencies: - '@changesets/types': 5.2.1 - dev: true - - /@changesets/cli@2.26.2: - resolution: {integrity: sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==} - hasBin: true - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/apply-release-plan': 6.1.4 - '@changesets/assemble-release-plan': 5.2.4 - '@changesets/changelog-git': 0.1.14 - '@changesets/config': 2.3.1 - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.6 - '@changesets/get-release-plan': 3.0.17 - '@changesets/git': 2.0.0 - '@changesets/logger': 0.0.5 - '@changesets/pre': 1.0.14 - '@changesets/read': 0.5.9 - '@changesets/types': 5.2.1 - '@changesets/write': 0.2.3 - '@manypkg/get-packages': 1.1.3 - '@types/is-ci': 3.0.3 - '@types/semver': 7.5.4 - ansi-colors: 4.1.3 - chalk: 2.4.2 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - is-ci: 3.0.1 - meow: 6.1.1 - outdent: 0.5.0 - p-limit: 2.3.0 - preferred-pm: 3.1.2 - resolve-from: 5.0.0 - semver: 7.5.4 - spawndamnit: 2.0.0 - term-size: 2.2.1 - tty-table: 4.2.3 - dev: true - - /@changesets/config@2.3.1: - resolution: {integrity: sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==} - dependencies: - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.6 - '@changesets/logger': 0.0.5 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.5 - dev: true - - /@changesets/errors@0.1.4: - resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} - dependencies: - extendable-error: 0.1.7 - dev: true - - /@changesets/get-dependents-graph@1.3.6: - resolution: {integrity: sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==} - dependencies: - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 - semver: 7.5.4 - dev: true - - /@changesets/get-release-plan@3.0.17: - resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/assemble-release-plan': 5.2.4 - '@changesets/config': 2.3.1 - '@changesets/pre': 1.0.14 - '@changesets/read': 0.5.9 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - dev: true - - /@changesets/get-version-range-type@0.3.2: - resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} - dev: true - - /@changesets/git@2.0.0: - resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 - dev: true - - /@changesets/logger@0.0.5: - resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} - dependencies: - chalk: 2.4.2 - dev: true - - /@changesets/parse@0.3.16: - resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} - dependencies: - '@changesets/types': 5.2.1 - js-yaml: 3.14.1 - dev: true - - /@changesets/pre@1.0.14: - resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - dev: true - - /@changesets/read@0.5.9: - resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/git': 2.0.0 - '@changesets/logger': 0.0.5 - '@changesets/parse': 0.3.16 - '@changesets/types': 5.2.1 - chalk: 2.4.2 - fs-extra: 7.0.1 - p-filter: 2.1.0 - dev: true - - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: true - - /@changesets/types@5.2.1: - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - dev: true - - /@changesets/write@0.2.3: - resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/types': 5.2.1 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - dev: true - - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true - optional: true - - /@cypress/request@2.88.11: - resolution: {integrity: sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==} - engines: {node: '>= 6'} - dependencies: - aws-sign2: 0.7.0 - aws4: 1.12.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.4 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - dev: true - - /@cypress/xvfb@1.2.4(supports-color@8.1.1): - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@esbuild-kit/cjs-loader@2.4.1: - resolution: {integrity: sha512-lhc/XLith28QdW0HpHZvZKkorWgmCNT7sVelMHDj3HFdTfdqkwEKvT+aXVQtNAmCC39VJhunDkWhONWB7335mg==} - dependencies: - '@esbuild-kit/core-utils': 3.0.0 - get-tsconfig: 4.3.0 - dev: true - - /@esbuild-kit/core-utils@3.0.0: - resolution: {integrity: sha512-TXmwH9EFS3DC2sI2YJWJBgHGhlteK0Xyu1VabwetMULfm3oYhbrsWV5yaSr2NTWZIgDGVLHbRf0inxbjXqAcmQ==} - dependencies: - esbuild: 0.15.18 - source-map-support: 0.5.21 - dev: true - - /@esbuild-kit/esm-loader@2.5.4: - resolution: {integrity: sha512-afmtLf6uqxD5IgwCzomtqCYIgz/sjHzCWZFvfS5+FzeYxOURPUo4QcHtqJxbxWOMOogKriZanN/1bJQE/ZL93A==} - dependencies: - '@esbuild-kit/core-utils': 3.0.0 - get-tsconfig: 4.3.0 - dev: true - - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.17.10: - resolution: {integrity: sha512-ht1P9CmvrPF5yKDtyC+z43RczVs4rrHpRqrmIuoSvSdn44Fs1n6DGlpZKdK6rM83pFLbVaSUwle8IN+TPmkv7g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.15.18: - resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.10: - resolution: {integrity: sha512-7YEBfZ5lSem9Tqpsz+tjbdsEshlO9j/REJrfv4DXgKTt1+/MHqGwbtlyxQuaSlMeUZLxUKBaX8wdzlTfHkmnLw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.10: - resolution: {integrity: sha512-CYzrm+hTiY5QICji64aJ/xKdN70IK8XZ6iiyq0tZkd3tfnwwSWTYH1t3m6zyaaBxkuj40kxgMyj1km/NqdjQZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.10: - resolution: {integrity: sha512-3HaGIowI+nMZlopqyW6+jxYr01KvNaLB5znXfbyyjuo4lE0VZfvFGcguIJapQeQMS4cX/NEispwOekJt3gr5Dg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.10: - resolution: {integrity: sha512-J4MJzGchuCRG5n+B4EHpAMoJmBeAE1L3wGYDIN5oWNqX0tEr7VKOzw0ymSwpoeSpdCa030lagGUfnfhS7OvzrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.10: - resolution: {integrity: sha512-ZkX40Z7qCbugeK4U5/gbzna/UQkM9d9LNV+Fro8r7HA7sRof5Rwxc46SsqeMvB5ZaR0b1/ITQ/8Y1NmV2F0fXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.10: - resolution: {integrity: sha512-0m0YX1IWSLG9hWh7tZa3kdAugFbZFFx9XrvfpaCMMvrswSTvUZypp0NFKriUurHpBA3xsHVE9Qb/0u2Bbi/otg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.10: - resolution: {integrity: sha512-g1EZJR1/c+MmCgVwpdZdKi4QAJ8DCLP5uTgLWSAVd9wlqk9GMscaNMEViG3aE1wS+cNMzXXgdWiW/VX4J+5nTA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.10: - resolution: {integrity: sha512-whRdrrl0X+9D6o5f0sTZtDM9s86Xt4wk1bf7ltx6iQqrIIOH+sre1yjpcCdrVXntQPCNw/G+XqsD4HuxeS+2QA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.10: - resolution: {integrity: sha512-1vKYCjfv/bEwxngHERp7huYfJ4jJzldfxyfaF7hc3216xiDA62xbXJfRlradiMhGZbdNLj2WA1YwYFzs9IWNPw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.15.18: - resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.10: - resolution: {integrity: sha512-mvwAr75q3Fgc/qz3K6sya3gBmJIYZCgcJ0s7XshpoqIAIBszzfXsqhpRrRdVFAyV1G9VUjj7VopL2HnAS8aHFA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.10: - resolution: {integrity: sha512-XilKPgM2u1zR1YuvCsFQWl9Fc35BqSqktooumOY2zj7CSn5czJn279j9TE1JEqSqz88izJo7yE4x3LSf7oxHzg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.10: - resolution: {integrity: sha512-kM4Rmh9l670SwjlGkIe7pYWezk8uxKHX4Lnn5jBZYBNlWpKMBCVfpAgAJqp5doLobhzF3l64VZVrmGeZ8+uKmQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.10: - resolution: {integrity: sha512-r1m9ZMNJBtOvYYGQVXKy+WvWd0BPvSxMsVq8Hp4GzdMBQvfZRvRr5TtX/1RdN6Va8JMVQGpxqde3O+e8+khNJQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.10: - resolution: {integrity: sha512-LsY7QvOLPw9WRJ+fU5pNB3qrSfA00u32ND5JVDrn/xG5hIQo3kvTxSlWFRP0NJ0+n6HmhPGG0Q4jtQsb6PFoyg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.10: - resolution: {integrity: sha512-zJUfJLebCYzBdIz/Z9vqwFjIA7iSlLCFvVi7glMgnu2MK7XYigwsonXshy9wP9S7szF+nmwrelNaP3WGanstEg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.10: - resolution: {integrity: sha512-lOMkailn4Ok9Vbp/q7uJfgicpDTbZFlXlnKT2DqC8uBijmm5oGtXAJy2ZZVo5hX7IOVXikV9LpCMj2U8cTguWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.10: - resolution: {integrity: sha512-/VE0Kx6y7eekqZ+ZLU4AjMlB80ov9tEz4H067Y0STwnGOYL8CsNg4J+cCmBznk1tMpxMoUOf0AbWlb1d2Pkbig==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.10: - resolution: {integrity: sha512-ERNO0838OUm8HfUjjsEs71cLjLMu/xt6bhOlxcJ0/1MG3hNqCmbWaS+w/8nFLa0DDjbwZQuGKVtCUJliLmbVgg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.10: - resolution: {integrity: sha512-fXv+L+Bw2AeK+XJHwDAQ9m3NRlNemG6Z6ijLwJAAVdu4cyoFbBWbEtyZzDeL+rpG2lWI51cXeMt70HA8g2MqIg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.10: - resolution: {integrity: sha512-3s+HADrOdCdGOi5lnh5DMQEzgbsFsd4w57L/eLKKjMnN0CN4AIEP0DCP3F3N14xnxh3ruNc32A0Na9zYe1Z/AQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.10: - resolution: {integrity: sha512-oP+zFUjYNaMNmjTwlFtWep85hvwUu19cZklB3QsBOcZSs6y7hmH4LNCJ7075bsqzYaNvZFXJlAVaQ2ApITDXtw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.45.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.52.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@eslint/js@8.52.0: - resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: true - - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: true - - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - dependencies: - '@babel/runtime': 7.23.2 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: true - - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - dependencies: - '@babel/runtime': 7.23.2 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - dev: true - - /@messageformat/core@3.2.0: - resolution: {integrity: sha512-ppbb/7OYqg/t4WdFk8VAfZEV2sNUq3+7VeBAo5sKFhmF786sh6gB7fUeXa2qLTDIcTHS49HivTBN7QNOU5OFTg==} - dependencies: - '@messageformat/date-skeleton': 1.0.1 - '@messageformat/number-skeleton': 1.2.0 - '@messageformat/parser': 5.1.0 - '@messageformat/runtime': 3.0.1 - make-plural: 7.3.0 - safe-identifier: 0.4.2 - dev: true - - /@messageformat/date-skeleton@1.0.1: - resolution: {integrity: sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==} - dev: true - - /@messageformat/number-skeleton@1.2.0: - resolution: {integrity: sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==} - dev: true - - /@messageformat/parser@5.1.0: - resolution: {integrity: sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==} - dependencies: - moo: 0.5.2 - dev: true - - /@messageformat/runtime@3.0.1: - resolution: {integrity: sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==} - dependencies: - make-plural: 7.3.0 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - /@rollup/plugin-replace@5.0.2(rollup@3.26.2): - resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.26.2) - magic-string: 0.27.0 - rollup: 3.26.2 - dev: true - - /@rollup/pluginutils@5.0.2(rollup@3.26.2): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.0 - estree-walker: 2.0.2 - picomatch: 2.3.1 - rollup: 3.26.2 - dev: true - - /@rollup/rollup-android-arm-eabi@4.12.1: - resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.12.1: - resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.12.1: - resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.12.1: - resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.12.1: - resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.12.1: - resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.12.1: - resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.12.1: - resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.12.1: - resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.12.1: - resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.12.1: - resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.12.1: - resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.12.1: - resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@scale-codec/core@2.0.1: - resolution: {integrity: sha512-3Ei7Gf3wNDrP5l7W/dEF9Q7Py1ttdNTFulzNNdFrqBw8v1khyC7SZIcYpsbAJ5uo/PDIhhK4FKOrK467I0vv4Q==} - engines: {node: '>=14.5.0'} - dependencies: - '@scale-codec/enum': 2.1.1 - '@scale-codec/util': 1.1.2 - dev: false - - /@scale-codec/definition-compiler@4.0.1: - resolution: {integrity: sha512-qXdFD7MvcPXRtGRF5dRqoF/yvhInYYsvS0haynGbcx26g29/f9cQoWqS/e+9YYnOJJKMPg3RCxF7/2OgXUfqKw==} - engines: {node: '>16.8'} - dependencies: - '@scale-codec/enum': 2.1.1 - '@scale-codec/util': 1.1.2 - immutable: 4.2.4 - sort-es: 1.6.6 - tarjan-graph: 3.0.0 - ts-pattern: 4.2.1 - dev: true - - /@scale-codec/definition-runtime@4.0.1: - resolution: {integrity: sha512-fu+zVJYB5qp6CXZofPNANsJQlb6jYYDNIuGnSPEyngP4u5rdN8bK0GUiOgXDJDtOtb1aeD8gRira1+YFHydpUw==} - dependencies: - '@scale-codec/core': 2.0.1 - '@scale-codec/util': 1.1.2 - fmt-subs: 1.1.1 - dev: false - - /@scale-codec/enum@2.1.1: - resolution: {integrity: sha512-n5mTWxc4wbeIBn+HlIXjeU7PtzUAY1hqX3Y+BTd5OOCds83+DA/qB+bikKCDZ+NjDHBMZo1667vXudxjMTIW3g==} - - /@scale-codec/util@1.1.2: - resolution: {integrity: sha512-Aali9gWoI1vOUUwk2H1FktstiInl6x5rjrPd3Am/b1WJV603NEI9QcJ7UGM7Eh42UjLD9e6H7E1ZF0yFnlRUUQ==} - - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: true - - /@sideway/formula@3.0.0: - resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} - dev: true - - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - dependencies: - '@types/ms': 0.7.31 - dev: true - - /@types/estree@1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - - /@types/fs-extra@11.0.1: - resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} - dependencies: - '@types/jsonfile': 6.1.1 - '@types/node': 18.14.2 - dev: true - - /@types/is-ci@3.0.3: - resolution: {integrity: sha512-FdHbjLiN2e8fk9QYQyVYZrK8svUDJpxSaSWLUga8EZS1RGAvvrqM9zbVARBtQuYPeLgnJxM2xloOswPwj1o2cQ==} - dependencies: - ci-info: 3.9.0 - dev: true - - /@types/jake@0.0.33: - resolution: {integrity: sha512-ABCtXDsYzjYnio9gc5zoc5j9AXdFnTgBDJjJeAv98eHh6Vpt2dCAWRDOQsPv2Kg6UEZnLqqGsQ3dIdaisuPcXg==} - dependencies: - '@types/node': 18.0.0 - dev: true - - /@types/json-schema@7.0.14: - resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} - dev: true - - /@types/jsonfile@6.1.1: - resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} - dependencies: - '@types/node': 18.14.2 - dev: true - - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - - /@types/minimist@1.2.4: - resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} - dev: true - - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true - - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: true - - /@types/node@14.18.36: - resolution: {integrity: sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==} - dev: true - - /@types/node@18.0.0: - resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==} - dev: true - - /@types/node@18.14.2: - resolution: {integrity: sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==} - dev: true - - /@types/normalize-package-data@2.4.3: - resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} - dev: true - - /@types/ps-tree@1.1.2: - resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==} - dev: true - - /@types/semver@7.5.4: - resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} - dev: true - - /@types/sinonjs__fake-timers@8.1.1: - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - dev: true - - /@types/sizzle@2.3.3: - resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} - dev: true - - /@types/web-bluetooth@0.0.14: - resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==} - dev: true - - /@types/which@2.0.2: - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} - dev: true - - /@types/ws@8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} - dependencies: - '@types/node': 18.0.0 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs@17.0.22: - resolution: {integrity: sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - requiresBuild: true - dependencies: - '@types/node': 14.18.36 - dev: true - optional: true - - /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@5.2.2): - resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/type-utils': 6.9.0(eslint@8.45.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.0(eslint@8.45.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.45.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.9.0(eslint@8.45.0)(typescript@5.2.2): - resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.45.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@6.9.0: - resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 - dev: true - - /@typescript-eslint/type-utils@6.9.0(eslint@8.45.0)(typescript@5.2.2): - resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.0(eslint@8.45.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.45.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@6.9.0: - resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2): - resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.9.0(eslint@8.45.0)(typescript@5.2.2): - resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) - '@types/json-schema': 7.0.14 - '@types/semver': 7.5.4 - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - eslint: 8.45.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@6.9.0: - resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.9.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@vitejs/plugin-vue@5.0.4(vite@5.1.5)(vue@3.2.47): - resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 - vue: ^3.2.25 - dependencies: - vite: 5.1.5(sass@1.54.0) - vue: 3.2.47 - dev: true - - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} - dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - chai: 4.4.1 - dev: true - - /@vitest/runner@1.3.1: - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} - dependencies: - '@vitest/utils': 1.3.1 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true - - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} - dependencies: - magic-string: 0.30.8 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.3.1: - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} - dependencies: - tinyspy: 2.2.1 - dev: true - - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /@vue-kakuyaku/core@0.4.3: - resolution: {integrity: sha512-1+H3+7FA9/WocTV+jAlrnCD08sY5BtrKQ1Opvjkz4E5MRQaaIhiU5jF/tAgO1e25b+Q/01C8BiWX4a3bMgGIqw==} - dependencies: - '@vueuse/core': 8.9.4(vue@3.2.47) - type-fest: 3.9.0 - vue: 3.2.47 - transitivePeerDependencies: - - '@vue/composition-api' - dev: true - - /@vue/compiler-core@3.2.47: - resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} - dependencies: - '@babel/parser': 7.20.15 - '@vue/shared': 3.2.47 - estree-walker: 2.0.2 - source-map: 0.6.1 - dev: true - - /@vue/compiler-dom@3.2.47: - resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} - dependencies: - '@vue/compiler-core': 3.2.47 - '@vue/shared': 3.2.47 - dev: true - - /@vue/compiler-sfc@3.2.47: - resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} - dependencies: - '@babel/parser': 7.20.15 - '@vue/compiler-core': 3.2.47 - '@vue/compiler-dom': 3.2.47 - '@vue/compiler-ssr': 3.2.47 - '@vue/reactivity-transform': 3.2.47 - '@vue/shared': 3.2.47 - estree-walker: 2.0.2 - magic-string: 0.25.9 - postcss: 8.4.31 - source-map: 0.6.1 - dev: true - - /@vue/compiler-ssr@3.2.47: - resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} - dependencies: - '@vue/compiler-dom': 3.2.47 - '@vue/shared': 3.2.47 - dev: true - - /@vue/reactivity-transform@3.2.47: - resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} - dependencies: - '@babel/parser': 7.20.15 - '@vue/compiler-core': 3.2.47 - '@vue/shared': 3.2.47 - estree-walker: 2.0.2 - magic-string: 0.25.9 - dev: true - - /@vue/reactivity@3.2.47: - resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} - dependencies: - '@vue/shared': 3.2.47 - dev: true - - /@vue/runtime-core@3.2.47: - resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} - dependencies: - '@vue/reactivity': 3.2.47 - '@vue/shared': 3.2.47 - dev: true - - /@vue/runtime-dom@3.2.47: - resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} - dependencies: - '@vue/runtime-core': 3.2.47 - '@vue/shared': 3.2.47 - csstype: 2.6.21 - dev: true - - /@vue/server-renderer@3.2.47(vue@3.2.47): - resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} - peerDependencies: - vue: 3.2.47 - dependencies: - '@vue/compiler-ssr': 3.2.47 - '@vue/shared': 3.2.47 - vue: 3.2.47 - dev: true - - /@vue/shared@3.2.47: - resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} - dev: true - - /@vueuse/core@8.9.4(vue@3.2.47): - resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==} - peerDependencies: - '@vue/composition-api': ^1.1.0 - vue: ^2.6.0 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue: - optional: true - dependencies: - '@types/web-bluetooth': 0.0.14 - '@vueuse/metadata': 8.9.4 - '@vueuse/shared': 8.9.4(vue@3.2.47) - vue: 3.2.47 - vue-demi: 0.13.6(vue@3.2.47) - dev: true - - /@vueuse/metadata@8.9.4: - resolution: {integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==} - dev: true - - /@vueuse/shared@8.9.4(vue@3.2.47): - resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==} - peerDependencies: - '@vue/composition-api': ^1.1.0 - vue: ^2.6.0 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue: - optional: true - dependencies: - vue: 3.2.47 - vue-demi: 0.13.6(vue@3.2.47) - dev: true - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /allure-js-commons@2.14.0: - resolution: {integrity: sha512-lVkLfcuFNhCezTAaHFQKdpmKOyW9dbd1NmBkee5LPI9cLjHCj3gLZ6Z4ECEj+pDxIuvMhWWZtSghrBYgnKLV+Q==} - dependencies: - properties: 1.2.1 - strip-ansi: 5.2.0 - dev: true - - /allure-vitest@2.14.0: - resolution: {integrity: sha512-FkJuScAkZvzohKo8WqgM/Jp59W6dBuW6BO/uyC16+o+upLhCmcgy676adk5ij3ofgDg3VcR3dvNG0/GbUOr7Hw==} - dependencies: - allure-js-commons: 2.14.0 - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.2 - dev: true - - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true - - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - dev: true - - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - dev: true - - /axios@0.21.4(debug@4.3.2): - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - dependencies: - follow-redirects: 1.15.1(debug@4.3.2) - transitivePeerDependencies: - - debug - dev: true - - /axios@0.24.0(debug@4.3.4): - resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} - dependencies: - follow-redirects: 1.15.1(debug@4.3.4) - transitivePeerDependencies: - - debug - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - dev: true - - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - dependencies: - is-windows: 1.0.2 - dev: true - - /bignumber.js@9.0.2: - resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==} - dev: false - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - dev: true - - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /boolify@1.0.1: - resolution: {integrity: sha512-ma2q0Tc760dW54CdOyJjhrg/a54317o1zYADQJFgperNGKIKgAUGIcKnuMiff8z57+yGlrGNEt4lPgZfCgTJgA==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - dependencies: - wcwidth: 1.0.1 - dev: true - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - dev: true - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.1.2 - dev: true - - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase-keys@9.1.2: - resolution: {integrity: sha512-nFhquwz7p3nWSHeVYoIkefNPdR2Rt4EuKs9/gaqx3DhJL6HkNHIEcsH+D6N4NvW/MHxc4TT+rp0rc4K7E7x9hw==} - engines: {node: '>=16'} - dependencies: - camelcase: 8.0.0 - map-obj: 5.0.0 - quick-lru: 6.1.2 - type-fest: 4.6.0 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true - - /camelcase@8.0.0: - resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} - engines: {node: '>=16'} - dev: true - - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true - - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: true - - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: true - - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: true - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - dev: true - - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} - dev: true - - /cookie-es@1.0.0: - resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} - dev: true - - /core-js@3.33.1: - resolution: {integrity: sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==} - requiresBuild: true - dev: true - - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: true - - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - dependencies: - cross-spawn: 7.0.3 - dev: true - - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /csstype@2.6.21: - resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} - dev: true - - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true - - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true - - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true - - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - dev: true - - /cypress@12.5.1: - resolution: {integrity: sha512-ZmCmJ3lsyeOpBfh410m5+AO2CO1AxAzFBt7k6/uVbNcrNZje1vdiwYTpj2ksPKg9mjr9lR6V8tmlDNMvr4H/YQ==} - engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} - requiresBuild: true - dependencies: - '@cypress/request': 2.88.11 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.36 - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.3 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 5.7.1 - cachedir: 2.3.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.3 - commander: 5.1.0 - common-tags: 1.8.2 - dayjs: 1.11.7 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.3.6 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.14.0(enquirer@2.3.6) - lodash: 4.17.21 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.3.8 - supports-color: 8.1.1 - tmp: 0.2.1 - untildify: 4.0.0 - yauzl: 2.10.0 - dev: true - - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true - - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: true - - /dayjs@1.11.7: - resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} - dev: true - - /debug@3.2.7(supports-color@8.1.1): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 8.1.1 - dev: true - - /debug@4.3.2: - resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - - /defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} - dev: true - - /del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.10 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /destr@1.2.2: - resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} - dev: true - - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - - /emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - dev: true - - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-abstract@1.20.1: - resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.1.2 - get-symbol-description: 1.0.0 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - is-callable: 1.2.4 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-weakref: 1.0.2 - object-inspect: 1.12.2 - object-keys: 1.1.1 - object.assign: 4.1.2 - regexp.prototype.flags: 1.4.3 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 - unbox-primitive: 1.0.2 - dev: true - - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} - 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.2 - 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.1 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - 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 - dev: true - - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 - dev: true - - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.0 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.4 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /esbuild-android-64@0.15.18: - resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-android-arm64@0.15.18: - resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-64@0.15.18: - resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-arm64@0.15.18: - resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-64@0.15.18: - resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-arm64@0.15.18: - resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-32@0.15.18: - resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-64@0.15.18: - resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm64@0.15.18: - resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm@0.15.18: - resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-mips64le@0.15.18: - resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-ppc64le@0.15.18: - resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-riscv64@0.15.18: - resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-s390x@0.15.18: - resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-netbsd-64@0.15.18: - resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-openbsd-64@0.15.18: - resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-sunos-64@0.15.18: - resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-32@0.15.18: - resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild@0.15.18: - resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 - dev: true - - /esbuild@0.17.10: - resolution: {integrity: sha512-n7V3v29IuZy5qgxx25TKJrEm0FHghAlS6QweUcyIgh/U0zYmQcvogWROitrTyZId1mHSkuhhuyEXtI9OXioq7A==} - engines: {node: '>=12'} - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.10 - '@esbuild/android-arm64': 0.17.10 - '@esbuild/android-x64': 0.17.10 - '@esbuild/darwin-arm64': 0.17.10 - '@esbuild/darwin-x64': 0.17.10 - '@esbuild/freebsd-arm64': 0.17.10 - '@esbuild/freebsd-x64': 0.17.10 - '@esbuild/linux-arm': 0.17.10 - '@esbuild/linux-arm64': 0.17.10 - '@esbuild/linux-ia32': 0.17.10 - '@esbuild/linux-loong64': 0.17.10 - '@esbuild/linux-mips64el': 0.17.10 - '@esbuild/linux-ppc64': 0.17.10 - '@esbuild/linux-riscv64': 0.17.10 - '@esbuild/linux-s390x': 0.17.10 - '@esbuild/linux-x64': 0.17.10 - '@esbuild/netbsd-x64': 0.17.10 - '@esbuild/openbsd-x64': 0.17.10 - '@esbuild/sunos-x64': 0.17.10 - '@esbuild/win32-arm64': 0.17.10 - '@esbuild/win32-ia32': 0.17.10 - '@esbuild/win32-x64': 0.17.10 - dev: true - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-alloy@5.0.0(@typescript-eslint/eslint-plugin@6.9.0)(@typescript-eslint/parser@6.9.0)(eslint-plugin-vue@9.15.1)(eslint@8.45.0)(typescript@5.2.2): - resolution: {integrity: sha512-ikYrtxBj1yQM0QQUzx3M3VWB0of4CBBYJs6gX47f/Jd8XCHREBkDk8GhqsX7K0aunsdv7GS/dtf+gIHEajRy4g==} - peerDependencies: - '@babel/eslint-parser': 7.x - '@babel/preset-react': 7.x - '@typescript-eslint/eslint-plugin': '>=5.55.0' - '@typescript-eslint/parser': 5.x - eslint: '>=8.24.0' - eslint-plugin-react: '>=7.31.8' - eslint-plugin-vue: '>=9.5.1' - typescript: 5.x - vue-eslint-parser: 9.x - peerDependenciesMeta: - '@babel/eslint-parser': - optional: true - '@babel/preset-react': - optional: true - '@typescript-eslint/eslint-plugin': - optional: true - '@typescript-eslint/parser': - optional: true - eslint-plugin-react: - optional: true - eslint-plugin-vue: - optional: true - typescript: - optional: true - vue-eslint-parser: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@5.2.2) - eslint: 8.45.0 - eslint-plugin-vue: 9.15.1(eslint@8.45.0) - typescript: 5.2.2 - dev: true - - /eslint-plugin-cypress@2.13.3(eslint@8.45.0): - resolution: {integrity: sha512-nAPjZE5WopCsgJwl3vHm5iafpV+ZRO76Z9hMyRygWhmg5ODXDPd+9MaPl7kdJ2azj+sO87H3P1PRnggIrz848g==} - peerDependencies: - eslint: '>= 3.2.1' - dependencies: - eslint: 8.45.0 - globals: 11.12.0 - dev: true - - /eslint-plugin-vue@9.15.1(eslint@8.45.0): - resolution: {integrity: sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) - eslint: 8.45.0 - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 6.0.13 - semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.45.0) - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-scope@7.2.1: - resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.45.0: - resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.1 - eslint-visitor-keys: 3.4.1 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - 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 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint@8.52.0: - resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.52.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.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - 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.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - 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 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true - - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: true - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: true - - /eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@7.0.0: - resolution: {integrity: sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - 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 - dev: true - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - dependencies: - pify: 2.3.0 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: true - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - - /extract-zip@2.0.1(supports-color@8.1.1): - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: true - - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-redact@3.1.2: - resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} - engines: {node: '>=6'} - dev: true - - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: true - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - dependencies: - minimatch: 5.1.6 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /fmt-subs@1.1.1: - resolution: {integrity: sha512-11qUMl76/5d/gYAtvoBZacQ94DPRKtip989wKVbSb0JD1LWzNg16u47+hLVxmzDqPH74ljlxIyQlbPCAP4XEGQ==} - dev: false - - /follow-redirects@1.15.1(debug@4.3.2): - resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.2 - dev: true - - /follow-redirects@1.15.1(debug@4.3.4): - resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: true - - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - dev: true - - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: true - - /fp-ts@2.14.0: - resolution: {integrity: sha512-QLagLSYAgMA00pZzUzeksH/78Sd14y7+Gc2A8Yaja3/IpGOFMdm/gYBuDMxYqLsJ58iT5lz+bJb953RAeFfp1A==} - dev: true - - /fp-ts@2.16.0: - resolution: {integrity: sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==} - dev: true - - /from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: true - - /fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - functions-have-names: 1.2.3 - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-intrinsic@1.1.2: - resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - - /get-port-please@3.0.1: - resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} - dev: true - - /get-stdin@8.0.0: - resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} - engines: {node: '>=10'} - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.2 - dev: true - - /get-tsconfig@4.3.0: - resolution: {integrity: sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ==} - dev: true - - /getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - dependencies: - async: 3.2.4 - dev: true - - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - dependencies: - assert-plus: 1.0.0 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - dependencies: - ini: 2.0.0 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@13.1.3: - resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /h3@1.6.5: - resolution: {integrity: sha512-A0r2LCDzeavSfcAbJpMwHXLcSN0H3FpEZtYigbz4IYun0fOE8r6vy3galwubAnmc6gXVob4261zXQsu3sZayzg==} - dependencies: - cookie-es: 1.0.0 - defu: 6.1.2 - destr: 1.2.2 - iron-webcrypto: 0.7.0 - radix3: 1.0.1 - ufo: 1.1.2 - uncrypto: 0.1.2 - dev: true - - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.0 - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /help-me@4.2.0: - resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} - dependencies: - glob: 8.1.0 - readable-stream: 3.6.2 - dev: true - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.17.0 - dev: true - - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: true - - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /human-signals@4.3.0: - resolution: {integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==} - engines: {node: '>=14.18.0'} - dev: true - - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /immer@9.0.19: - resolution: {integrity: sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==} - dev: true - - /immutable@4.1.0: - resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} - dev: true - - /immutable@4.2.4: - resolution: {integrity: sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true - - /internal-slot@1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.1.2 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - dev: true - - /ip-regex@5.0.0: - resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /iron-webcrypto@0.7.0: - resolution: {integrity: sha512-WkX32iTcwd79ZsWRPP5wq1Jq6XXfPwO783ZiUBY8uMw4/AByx5WvBmxvYGnpVt6AOVJ0F41Qo420r8lIneT9Wg==} - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.4: - resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} - engines: {node: '>= 0.4'} - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - dependencies: - ci-info: 3.9.0 - dev: true - - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - dependencies: - better-path-resolve: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.13 - dev: true - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - dev: true - - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jake@10.8.5: - resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} - engines: {node: '>=10'} - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - dev: true - - /joi@17.6.0: - resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.0 - '@sideway/pinpoint': 2.0.0 - dev: true - - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} - dev: true - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - dev: true - - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - dependencies: - bignumber.js: 9.0.2 - dev: false - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - - /lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /listhen@1.0.4: - resolution: {integrity: sha512-r94k7kmXHb8e8wpv7+UP/qqhhD+j/9TgX19QKim2cEJuWCLwlTw+5BkCFmYyjhQ7Bt8KdVun/2DcD7MF2Fe3+g==} - dependencies: - clipboardy: 3.0.0 - colorette: 2.0.19 - defu: 6.1.2 - get-port-please: 3.0.1 - http-shutdown: 1.2.2 - ip-regex: 5.0.0 - node-forge: 1.3.1 - ufo: 1.1.2 - dev: true - - /listr2@3.14.0(enquirer@2.3.6): - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.19 - enquirer: 2.3.6 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.3.0 - rxjs: 7.8.0 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: true - - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - dev: true - - /loglevel-colored-level-prefix@1.0.0: - resolution: {integrity: sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==} - dependencies: - chalk: 1.1.3 - loglevel: 1.8.1 - dev: true - - /loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} - engines: {node: '>= 0.6.0'} - dev: true - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: true - - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /magic-string@0.30.1: - resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-plural@7.3.0: - resolution: {integrity: sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==} - dev: true - - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true - - /map-obj@5.0.0: - resolution: {integrity: sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - dev: true - - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true - - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - dependencies: - '@types/minimist': 1.2.4 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist@1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - - /mixme@0.5.9: - resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} - engines: {node: '>= 8.0.0'} - dev: true - - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 - dev: true - - /moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true - - /node-fetch@3.2.10: - resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: true - - /node-fetch@3.3.0: - resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: true - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.1 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.7.3 - string.prototype.padend: 3.1.3 - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /object-inspect@1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - dev: true - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.2: - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /on-exit-leak-free@2.1.0: - resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - dev: true - - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: true - - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - dependencies: - p-map: 2.1.0 - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.23.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.0.1 - minipass: 7.0.4 - dev: true - - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - dependencies: - through: 2.3.8 - dev: true - - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true - - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - dev: true - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - - /pino-abstract-transport@1.0.0: - resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} - dependencies: - readable-stream: 4.3.0 - split2: 4.2.0 - dev: true - - /pino-http@8.3.3: - resolution: {integrity: sha512-p4umsNIXXVu95HD2C8wie/vXH7db5iGRpc+yj1/ZQ3sRtTQLXNjoS6Be5+eI+rQbqCRxen/7k/KSN+qiZubGDw==} - dependencies: - get-caller-file: 2.0.5 - pino: 8.14.1 - pino-std-serializers: 6.2.1 - process-warning: 2.2.0 - dev: true - - /pino-pretty@10.0.0: - resolution: {integrity: sha512-zKFjYXBzLaLTEAN1ayKpHXtL5UeRQC7R3lvhKe7fWs7hIVEjKGG/qIXwQt9HmeUp71ogUd/YcW+LmMwRp4KT6Q==} - hasBin: true - dependencies: - colorette: 2.0.19 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 4.2.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.0.0 - pump: 3.0.0 - readable-stream: 4.3.0 - secure-json-parse: 2.7.0 - sonic-boom: 3.3.0 - strip-json-comments: 3.1.1 - dev: true - - /pino-std-serializers@6.2.1: - resolution: {integrity: sha512-wHuWB+CvSVb2XqXM0W/WOYUkVSPbiJb9S5fNB7TBhd8s892Xq910bRxwHtC4l71hgztObTjXL6ZheZXFjhDrDQ==} - dev: true - - /pino@8.14.1: - resolution: {integrity: sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.1.2 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.0.0 - pino-std-serializers: 6.2.1 - process-warning: 2.2.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.3.0 - thread-stream: 2.3.0 - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 - dev: true - - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /preferred-pm@3.1.2: - resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} - engines: {node: '>=10'} - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-eslint-cli@8.0.1(prettier-eslint@16.1.2): - resolution: {integrity: sha512-jru4JUDHzWEtM/SOxqagU7hQTVP8BVrxO2J0qNauWZuPRld6Ea2eyNaEzIGx6I+yjmOLCsjNM+vU1AJgaW1ZSQ==} - engines: {node: '>=16.10.0'} - hasBin: true - peerDependencies: - prettier-eslint: '*' - peerDependenciesMeta: - prettier-eslint: - optional: true - dependencies: - '@messageformat/core': 3.2.0 - '@prettier/eslint': /prettier-eslint@16.1.2 - arrify: 2.0.1 - boolify: 1.0.1 - camelcase-keys: 9.1.2 - chalk: 4.1.2 - common-tags: 1.8.2 - core-js: 3.33.1 - eslint: 8.52.0 - find-up: 5.0.0 - get-stdin: 8.0.0 - glob: 10.3.10 - ignore: 5.2.4 - indent-string: 4.0.0 - lodash.memoize: 4.1.2 - loglevel-colored-level-prefix: 1.0.0 - prettier-eslint: 16.1.2 - rxjs: 7.8.1 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: true - - /prettier-eslint@16.1.2: - resolution: {integrity: sha512-mGFGZQbAh11FSnwW3H1zngzQYR2QMmHO8vdfgnAuzOFhnDeUZHYtwpqQvOMOMT0k818Dr1X+J4a/sVE0r34RKQ==} - engines: {node: '>=16.10.0'} - dependencies: - '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@5.2.2) - common-tags: 1.8.2 - dlv: 1.1.3 - eslint: 8.45.0 - indent-string: 4.0.0 - lodash.merge: 4.6.2 - loglevel-colored-level-prefix: 1.0.0 - prettier: 3.0.3 - pretty-format: 29.7.0 - require-relative: 0.8.7 - typescript: 5.2.2 - vue-eslint-parser: 9.3.2(eslint@8.45.0) - transitivePeerDependencies: - - supports-color - dev: true - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /process-warning@2.2.0: - resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} - dev: true - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true - - /properties@1.2.1: - resolution: {integrity: sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ==} - engines: {node: '>=0.10'} - dev: true - - /proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} - dev: true - - /ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - dependencies: - event-stream: 3.3.4 - dev: true - - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: true - - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true - - /quick-lru@6.1.2: - resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} - engines: {node: '>=12'} - dev: true - - /radix3@1.0.1: - resolution: {integrity: sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==} - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.3 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@4.3.0: - resolution: {integrity: sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: true - - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true - - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 - dev: true - - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true - - /request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - dependencies: - throttleit: 1.0.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - - /require-relative@0.8.7: - resolution: {integrity: sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==} - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - dependencies: - glob: 7.2.3 - dev: true - - /rollup-plugin-dts@5.3.0(rollup@3.26.2)(typescript@5.2.2): - resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} - engines: {node: '>=v14'} - peerDependencies: - rollup: ^3.0.0 - typescript: ^4.1 || ^5.0 - dependencies: - magic-string: 0.30.1 - rollup: 3.26.2 - typescript: 5.2.2 - optionalDependencies: - '@babel/code-frame': 7.23.5 - dev: true - - /rollup@3.26.2: - resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /rollup@4.12.1: - resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.1 - '@rollup/rollup-android-arm64': 4.12.1 - '@rollup/rollup-darwin-arm64': 4.12.1 - '@rollup/rollup-darwin-x64': 4.12.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 - '@rollup/rollup-linux-arm64-gnu': 4.12.1 - '@rollup/rollup-linux-arm64-musl': 4.12.1 - '@rollup/rollup-linux-riscv64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-musl': 4.12.1 - '@rollup/rollup-win32-arm64-msvc': 4.12.1 - '@rollup/rollup-win32-ia32-msvc': 4.12.1 - '@rollup/rollup-win32-x64-msvc': 4.12.1 - fsevents: 2.3.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rxjs@7.5.6: - resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} - dependencies: - tslib: 2.5.0 - dev: true - - /rxjs@7.8.0: - resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} - dependencies: - tslib: 2.5.0 - dev: true - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: true - - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safe-identifier@0.4.2: - resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} - dev: true - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-regex: 1.1.4 - dev: true - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /sass@1.54.0: - resolution: {integrity: sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==} - engines: {node: '>=12.0.0'} - dependencies: - chokidar: 3.5.3 - immutable: 4.1.0 - source-map-js: 1.0.2 - dev: true - - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: true - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - dev: true - - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.7.3: - resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - dev: true - - /sonic-boom@3.3.0: - resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} - dependencies: - atomic-sleep: 1.0.0 - dev: true - - /sort-es@1.6.6: - resolution: {integrity: sha512-28+kv5wXehxePLk0SQ51qNCegiaBCH+o1QIPkdfkLqhfxovPbw/a0eLy8rdW11VSkZq2U10cwIVhwGoIM6xfAQ==} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - dev: true - - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - dev: true - - /spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.11 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.11 - dev: true - - /spdx-license-ids@3.0.11: - resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true - - /split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - dependencies: - through: 2.3.8 - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /start-server-and-test@1.14.0: - resolution: {integrity: sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==} - engines: {node: '>=6'} - dependencies: - bluebird: 3.7.2 - check-more-types: 2.24.0 - debug: 4.3.2 - execa: 5.1.1 - lazy-ass: 1.6.0 - ps-tree: 1.2.0 - wait-on: 6.0.0(debug@4.3.2) - transitivePeerDependencies: - - supports-color - dev: true - - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true - - /stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - dependencies: - duplexer: 0.1.2 - dev: true - - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - dependencies: - mixme: 0.5.9 - dev: true - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true - - /string.prototype.padend@3.1.3: - resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimend@1.0.5: - resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimstart@1.0.5: - resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} - dependencies: - js-tokens: 8.0.3 - dev: true - - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /tarjan-graph@3.0.0: - resolution: {integrity: sha512-sM1+1ZKnnCtTP9W0DHTMHTlej9buusVHaKiBVecc6tZpBffBeEpE4XdFz7WNs9H1zaYkcgm6MzfyXFxSV2S1rA==} - dev: true - - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thread-stream@2.3.0: - resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==} - dependencies: - real-require: 0.2.0 - dev: true - - /throttleit@1.0.0: - resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: true - - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true - - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - dev: true - - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.2.2 - dev: true - - /ts-pattern@4.2.1: - resolution: {integrity: sha512-lXCmHZb01QOM9HdCLvisCGUH9ATdKPON9UaUvwe007gJAhuSBhRWIAIowys5QqNxEq6odWctfMIdI96vzjnOMQ==} - dev: true - - /ts-pattern@5.0.1: - resolution: {integrity: sha512-ZyNm28Lsg34Co5DS3e9DVyjlX2Y+2exkI4jqTKyU+9/OL6Y2fKOOuL8i+7no71o74C6mVS+UFoP3ekM3iCT1HQ==} - dev: true - - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /tsx@3.12.2: - resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==} - dependencies: - '@esbuild-kit/cjs-loader': 2.4.1 - '@esbuild-kit/core-utils': 3.0.0 - '@esbuild-kit/esm-loader': 2.5.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-fest@3.9.0: - resolution: {integrity: sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA==} - engines: {node: '>=14.16'} - - /type-fest@4.6.0: - resolution: {integrity: sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==} - engines: {node: '>=16'} - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /ufo@1.1.2: - resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} - dev: true - - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - dev: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /uncrypto@0.1.2: - resolution: {integrity: sha512-kuZwRKV615lEw/Xx3Iz56FKk3nOeOVGaVmw0eg+x4Mne28lCotNFbBhDW7dEBCBKyKbRQiCadEZeNAFPVC5cgw==} - dev: true - - /undici@5.20.0: - resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} - engines: {node: '>=12.18'} - dependencies: - busboy: 1.6.0 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.1.1 - spdx-expression-parse: 3.0.1 - dev: true - - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - - /vite-node@1.3.1: - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.5(sass@1.54.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@5.1.5(sass@1.54.0): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.1 - sass: 1.54.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vitest@1.3.1: - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4(supports-color@8.1.1) - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.8 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.1.5(sass@1.54.0) - vite-node: 1.3.1 - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vue-demi@0.13.6(vue@3.2.47): - resolution: {integrity: sha512-02NYpxgyGE2kKGegRPYlNQSL1UWfA/+JqvzhGCOYjhfbLWXU5QQX0+9pAm/R2sCOPKr5NBxVIab7fvFU0B1RxQ==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - dependencies: - vue: 3.2.47 - dev: true - - /vue-eslint-parser@9.3.1(eslint@8.45.0): - resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.45.0 - eslint-scope: 7.2.1 - eslint-visitor-keys: 3.4.1 - espree: 9.6.1 - esquery: 1.5.0 - lodash: 4.17.21 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /vue-eslint-parser@9.3.2(eslint@8.45.0): - resolution: {integrity: sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.45.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - lodash: 4.17.21 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /vue@3.2.47: - resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} - dependencies: - '@vue/compiler-dom': 3.2.47 - '@vue/compiler-sfc': 3.2.47 - '@vue/runtime-dom': 3.2.47 - '@vue/server-renderer': 3.2.47(vue@3.2.47) - '@vue/shared': 3.2.47 - dev: true - - /wait-on@6.0.0(debug@4.3.2): - resolution: {integrity: sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==} - engines: {node: '>=10.0.0'} - dependencies: - axios: 0.21.4(debug@4.3.2) - joi: 17.6.0 - lodash: 4.17.21 - minimist: 1.2.6 - rxjs: 7.5.6 - transitivePeerDependencies: - - debug - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: true - - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: true - - /webpod@0.0.2: - resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true - - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true - - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - dependencies: - isexe: 2.0.0 - dev: true - - /which@3.0.0: - resolution: {integrity: sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - isexe: 2.0.0 - dev: true - - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@8.8.1: - resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} - 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 - dev: true - - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml@2.2.1: - resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} - engines: {node: '>= 14'} - dev: true - - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: true - - /yargs@17.6.2: - resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - - /zx@7.2.0: - resolution: {integrity: sha512-SMuOZ21zFnBxicw+WMtTv3z3eERh6KBtZExAJaL8EAV+Ev/3M1NIAOkrZ8kRfCzD9acv9heUH/WZctTR4vQxBQ==} - engines: {node: '>= 16.0.0'} - dependencies: - '@types/fs-extra': 11.0.1 - '@types/minimist': 1.2.2 - '@types/node': 18.14.2 - '@types/ps-tree': 1.1.2 - '@types/which': 2.0.2 - chalk: 5.2.0 - fs-extra: 11.1.0 - globby: 13.1.3 - minimist: 1.2.8 - node-fetch: 3.2.10 - ps-tree: 1.2.0 - webpod: 0.0.2 - which: 3.0.0 - yaml: 2.2.1 - dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index ab6e1e3c..00000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - "packages/**" - - "!packages/crypto-rs/**" - - "!packages/client-isomorphic-*" diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 66fb45d7..00000000 --- a/rollup.config.js +++ /dev/null @@ -1,3 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -require('@esbuild-kit/cjs-loader') -module.exports = require('./etc/rollup.config') diff --git a/packages/client/test/integration/test-web/.gitignore b/tests/browser/.gitignore similarity index 100% rename from packages/client/test/integration/test-web/.gitignore rename to tests/browser/.gitignore diff --git a/packages/client/test/integration/test-web/cypress.config.ts b/tests/browser/cypress.config.ts similarity index 75% rename from packages/client/test/integration/test-web/cypress.config.ts rename to tests/browser/cypress.config.ts index f4c87c73..604ce2e3 100644 --- a/packages/client/test/integration/test-web/cypress.config.ts +++ b/tests/browser/cypress.config.ts @@ -1,12 +1,10 @@ import { defineConfig } from 'cypress' - -// @ts-ignore import createBundler from '@bahmutov/cypress-esbuild-preprocessor' export default defineConfig({ e2e: { - setupNodeEvents(on, config) { - on('file:preprocessor', createBundler({})) + setupNodeEvents(on, _config) { + on('file:preprocessor', createBundler()) }, baseUrl: 'http://localhost:3000', supportFile: false, diff --git a/packages/client/test/integration/test-web/cypress/e2e/main.cy.ts b/tests/browser/cypress/e2e/main.cy.ts similarity index 51% rename from packages/client/test/integration/test-web/cypress/e2e/main.cy.ts rename to tests/browser/cypress/e2e/main.cy.ts index 0e018eca..5ebb8787 100644 --- a/packages/client/test/integration/test-web/cypress/e2e/main.cy.ts +++ b/tests/browser/cypress/e2e/main.cy.ts @@ -1,21 +1,12 @@ -import * as testPeerClient from '@iroha2/test-peer/src/api/client' - -testPeerClient.setBaseURL('/peer-server') - -before(async () => { - await testPeerClient.prepareConfiguration() -}) - beforeEach(async () => { - await testPeerClient.killPeer() - await testPeerClient.clearPeerStorage() - await testPeerClient.startPeer() + await fetch('/peer-server/kill', { method: 'POST' }) + await fetch('/peer-server/start', { method: 'POST' }) }) it('Register new domain and wait until commitment', () => { cy.visit('/') - // wait for genesis commitment + // wait for the genesis block cy.get('h3').contains('Status').closest('div').contains('Blocks: 1') cy.get('button').contains('Listen').click().contains('Stop') @@ -23,9 +14,9 @@ it('Register new domain and wait until commitment', () => { cy.get('input').type('bob') cy.get('button').contains('Register domain').click() - // Ensure that blocks count is incremented + // Ensure that block count is incremented cy.contains('Blocks: 2') - // And that events are caught - cy.get('ul.events-list').children('li').should('have.length', 1) + // And all events are caught + cy.get('ul.events-list').children('li').should('have.length', 6).last().contains('Block').contains('Applied') }) diff --git a/packages/client/test/integration/test-web/cypress/tsconfig.json b/tests/browser/cypress/tsconfig.json similarity index 100% rename from packages/client/test/integration/test-web/cypress/tsconfig.json rename to tests/browser/cypress/tsconfig.json diff --git a/tests/browser/deno.jsonc b/tests/browser/deno.jsonc new file mode 100644 index 00000000..493fbeed --- /dev/null +++ b/tests/browser/deno.jsonc @@ -0,0 +1,38 @@ +{ + "tasks": { + "legacy-install": { + "description": "Install packages using PNPM", + "command": "pnpm install" + }, + "app:dev": { + "description": "Run the web app itself", + "command": "pnpm vite", + "dependencies": ["legacy-install"] + }, + // TODO: run `vue-tsc --noEmit` in some future? + "app:build": { + "command": "pnpm vite build", + "dependencies": ["legacy-install"] + }, + "serve-peer": { + "description": "Run stateful server that controls `irohad` execution", + "command": "deno run --allow-all etc/serve-peer.ts" + }, + "cy-open": { + "description": "Open Cypress", + "command": "pnpm cypress open", + "dependencies": ["legacy-install"] + }, + "dev": { + "description": "Run app server, peer server, and open Cypress", + "dependencies": ["app:dev", "serve-peer", "cy-open"] + }, + "test": { + "command": "deno task app:build && deno task test:run" + }, + "test:run": { + "command": "DEBUG=\"@iroha*\" deno run --allow-all ./etc/test-run.ts", + "dependencies": ["legacy-install"] + } + } +} diff --git a/packages/client/test/integration/test-web/etc/meta.ts b/tests/browser/etc/meta.ts similarity index 74% rename from packages/client/test/integration/test-web/etc/meta.ts rename to tests/browser/etc/meta.ts index d1db05ba..3b641544 100644 --- a/packages/client/test/integration/test-web/etc/meta.ts +++ b/tests/browser/etc/meta.ts @@ -1,3 +1,4 @@ export const PORT_VITE = 3000 export const PORT_PEER_API = 8080 +export const PORT_PEER_P2P = 1337 export const PORT_PEER_SERVER = 8765 diff --git a/tests/browser/etc/serve-peer.ts b/tests/browser/etc/serve-peer.ts new file mode 100644 index 00000000..87f023bf --- /dev/null +++ b/tests/browser/etc/serve-peer.ts @@ -0,0 +1,5 @@ +import '@iroha/crypto-target-node/install' +import { run } from '@iroha/test-peer/api/server' +import { PORT_PEER_API, PORT_PEER_P2P, PORT_PEER_SERVER } from './meta.ts' + +await run({ server: PORT_PEER_SERVER, toriiApi: PORT_PEER_API, toriiP2p: PORT_PEER_P2P }) diff --git a/tests/browser/etc/test-run.ts b/tests/browser/etc/test-run.ts new file mode 100644 index 00000000..438917b9 --- /dev/null +++ b/tests/browser/etc/test-run.ts @@ -0,0 +1,93 @@ +import $ from 'jsr:@david/dax' +import { delay, retry } from '@std/async' +import { PORT_PEER_API, PORT_PEER_P2P, PORT_PEER_SERVER, PORT_VITE } from './meta.ts' +import { assert } from '@std/assert' + +async function spawnLinked( + cmd: Deno.Command, + check: () => Promise, +): Promise<{ + kill: () => Promise + // isRunning: () => boolean +}> { + const child = cmd.spawn() + child.ref() + + for (const signal of (['SIGINT', 'SIGTERM', 'SIGQUIT'] satisfies Deno.Signal[])) { + Deno.addSignalListener(signal, () => { + $.logLight('Unexpected Deno termination, killing children') + child.kill() + }) + } + + let running = true + child.output().finally(() => { + running = false + }) + + await delay(1000) + await retry(check) + assert(running, 'process must not exit until killed') + + // window.addEventListener('') + + return { + kill: async () => { + child.kill() + await child.output() + }, + // isRunning: () => running, + } +} + +async function isPortBusy(port: number) { + const url = new URL(`http://localhost:${port}`) + try { + await fetch(url) + $.logLight(`Port ${port}: busy`) + return true + } catch (_err) { + $.logLight(`Port ${port}: free`) + return false + } +} + +async function assertPortBusy(port: number) { + assert(await isPortBusy(port)) +} + +$.logStep('Ensuring ports are available for Iroha') +await retry(async () => { + if ((await Promise.all([isPortBusy(PORT_PEER_API), isPortBusy(PORT_PEER_P2P)])).every((x) => !x)) return + throw new Error('still busy') +}) + +$.logStep('Running peer server and vite preview in parallel') +const tasks = await Promise.all([ + spawnLinked( + new Deno.Command('pnpm', { + args: ['vite', 'preview', '--port', String(PORT_VITE), '--strictPort'], + stderr: 'inherit', + 'stdout': 'inherit', + }), + () => assertPortBusy(PORT_VITE), + ), + spawnLinked( + new Deno.Command('deno', { + args: ['task', 'serve-peer'], + stderr: 'inherit', + 'stdout': 'inherit', + }), + () => assertPortBusy(PORT_PEER_SERVER), + ), +]) +$.logStep('Started Vite and Peer server') + +try { + $.logStep('Running Cypress') + await $`pnpm cypress run` + $.logStep('Finished Cypress withot errors') +} finally { + await Promise.all(tasks.map((x) => x.kill())) + $.logStep('Terminated Vite & Peer server') +} diff --git a/packages/client/test/integration/test-web/index.html b/tests/browser/index.html similarity index 100% rename from packages/client/test/integration/test-web/index.html rename to tests/browser/index.html diff --git a/tests/browser/package.json b/tests/browser/package.json new file mode 100644 index 00000000..f15814c7 --- /dev/null +++ b/tests/browser/package.json @@ -0,0 +1,17 @@ +{ + "type": "module", + "dependencies": { + "@bahmutov/cypress-esbuild-preprocessor": "^2.2.0", + "@deno/vite-plugin": "^1.0.3", + "@vitejs/plugin-vue": "^5.0.4", + "@vue-kakuyaku/core": "^0.4.3", + "@vueuse/core": "^8.0.1", + "cypress": "^13.12.0", + "esbuild": "^0.24.2", + "npm-run-all": "^4.1.5", + "sass": "^1.52.1", + "vite": "^6.1.0", + "vue": "^3.2.47" + }, + "packageManager": "pnpm@9.15.1+sha512.1acb565e6193efbebda772702950469150cf12bcc764262e7587e71d19dc98a423dff9536e57ea44c49bdf790ff694e83c27be5faa23d67e0c033b583be4bfcf" +} diff --git a/tests/browser/pnpm-lock.yaml b/tests/browser/pnpm-lock.yaml new file mode 100644 index 00000000..3be34d15 --- /dev/null +++ b/tests/browser/pnpm-lock.yaml @@ -0,0 +1,4580 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + '@bahmutov/cypress-esbuild-preprocessor': + specifier: ^2.2.0 + version: 2.2.4(esbuild@0.24.2) + '@deno/vite-plugin': + specifier: ^1.0.3 + version: 1.0.3(vite@6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2)) + '@vitejs/plugin-vue': + specifier: ^5.0.4 + version: 5.2.1(vite@6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2))(vue@3.5.13(typescript@5.7.3)) + '@vue-kakuyaku/core': + specifier: ^0.4.3 + version: 0.4.3(typescript@5.7.3) + '@vueuse/core': + specifier: ^8.0.1 + version: 8.9.4(vue@3.5.13(typescript@5.7.3)) + cypress: + specifier: ^13.12.0 + version: 13.17.0 + esbuild: + specifier: ^0.24.2 + version: 0.24.2 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + sass: + specifier: ^1.52.1 + version: 1.84.0 + vite: + specifier: ^6.1.0 + version: 6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2) + vue: + specifier: ^3.2.47 + version: 3.5.13(typescript@5.7.3) + +packages: + '@babel/helper-string-parser@7.25.9': + resolution: { + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-validator-identifier@7.25.9': + resolution: { + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, + } + engines: { node: '>=6.9.0' } + + '@babel/parser@7.26.7': + resolution: { + integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==, + } + engines: { node: '>=6.0.0' } + hasBin: true + + '@babel/types@7.26.7': + resolution: { + integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==, + } + engines: { node: '>=6.9.0' } + + '@bahmutov/cypress-esbuild-preprocessor@2.2.4': + resolution: { + integrity: sha512-t5xOKK+a6PlsxgRBtZDzayUcPJGDLKJt1pwKK/Y8szuDPPF+DbEsrqL8fbKgE1+koPvOVaYMX4ggwQwqfk99hA==, + } + peerDependencies: + esbuild: '>=0.17.0' + + '@colors/colors@1.5.0': + resolution: { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: '>=0.1.90' } + + '@cypress/request@3.0.7': + resolution: { + integrity: sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==, + } + engines: { node: '>= 6' } + + '@cypress/xvfb@1.2.4': + resolution: { + integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==, + } + + '@deno/vite-plugin@1.0.3': + resolution: { + integrity: sha512-As059Zjde6oaUw7+WXhu2WpnjnBzjUCs5+j21S1ilQRIorN+sCrArXpdSDsCXXnHQbCU1SHjVrjcca49YOuwIg==, + } + peerDependencies: + vite: 5.x || 6.x + + '@esbuild/aix-ppc64@0.23.1': + resolution: { + integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.2': + resolution: { + integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: { + integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.2': + resolution: { + integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: { + integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: { + integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: { + integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: { + integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: { + integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.2': + resolution: { + integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: { + integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: { + integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: { + integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: { + integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: { + integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: { + integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: { + integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.2': + resolution: { + integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: { + integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: { + integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: { + integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: { + integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: { + integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==, + } + engines: { node: '>=18' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: { + integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==, + } + engines: { node: '>=18' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: { + integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==, + } + engines: { node: '>=18' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: { + integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==, + } + engines: { node: '>=18' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: { + integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: { + integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: { + integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==, + } + engines: { node: '>=18' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: { + integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==, + } + engines: { node: '>=18' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: { + integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==, + } + engines: { node: '>=18' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: { + integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==, + } + engines: { node: '>=18' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: { + integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: { + integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: { + integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: { + integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: { + integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: { + integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: { + integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: { + integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: { + integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: { + integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.2': + resolution: { + integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: { + integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.2': + resolution: { + integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: { + integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: { + integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: { + integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: { + integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } + + '@parcel/watcher-android-arm64@2.5.1': + resolution: { + integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: { + integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: { + integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: { + integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: { + integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: { + integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: { + integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: { + integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: { + integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: { + integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: { + integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==, + } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: { + integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==, + } + engines: { node: '>= 10.0.0' } + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: { + integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==, + } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: { + integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==, + } + engines: { node: '>= 10.0.0' } + + '@rollup/rollup-android-arm-eabi@4.34.4': + resolution: { + integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==, + } + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.4': + resolution: { + integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==, + } + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.4': + resolution: { + integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==, + } + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.4': + resolution: { + integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==, + } + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.4': + resolution: { + integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==, + } + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.4': + resolution: { + integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==, + } + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + resolution: { + integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==, + } + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + resolution: { + integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==, + } + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + resolution: { + integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==, + } + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.4': + resolution: { + integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==, + } + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + resolution: { + integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==, + } + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + resolution: { + integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==, + } + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + resolution: { + integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==, + } + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + resolution: { + integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==, + } + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.4': + resolution: { + integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==, + } + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.4': + resolution: { + integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==, + } + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.4': + resolution: { + integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==, + } + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.4': + resolution: { + integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==, + } + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.4': + resolution: { + integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==, + } + cpu: [x64] + os: [win32] + + '@types/estree@1.0.6': + resolution: { + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, + } + + '@types/node@22.13.1': + resolution: { + integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==, + } + + '@types/sinonjs__fake-timers@8.1.1': + resolution: { + integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==, + } + + '@types/sizzle@2.3.9': + resolution: { + integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==, + } + + '@types/web-bluetooth@0.0.14': + resolution: { + integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==, + } + + '@types/yauzl@2.10.3': + resolution: { + integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, + } + + '@vitejs/plugin-vue@5.2.1': + resolution: { + integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue-kakuyaku/core@0.4.3': + resolution: { + integrity: sha512-1+H3+7FA9/WocTV+jAlrnCD08sY5BtrKQ1Opvjkz4E5MRQaaIhiU5jF/tAgO1e25b+Q/01C8BiWX4a3bMgGIqw==, + } + + '@vue/compiler-core@3.5.13': + resolution: { + integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==, + } + + '@vue/compiler-dom@3.5.13': + resolution: { + integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==, + } + + '@vue/compiler-sfc@3.5.13': + resolution: { + integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==, + } + + '@vue/compiler-ssr@3.5.13': + resolution: { + integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==, + } + + '@vue/reactivity@3.5.13': + resolution: { + integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==, + } + + '@vue/runtime-core@3.5.13': + resolution: { + integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==, + } + + '@vue/runtime-dom@3.5.13': + resolution: { + integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==, + } + + '@vue/server-renderer@3.5.13': + resolution: { + integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==, + } + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: { + integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==, + } + + '@vueuse/core@8.9.4': + resolution: { + integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==, + } + peerDependencies: + '@vue/composition-api': ^1.1.0 + vue: ^2.6.0 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue: + optional: true + + '@vueuse/metadata@8.9.4': + resolution: { + integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==, + } + + '@vueuse/shared@8.9.4': + resolution: { + integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==, + } + peerDependencies: + '@vue/composition-api': ^1.1.0 + vue: ^2.6.0 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue: + optional: true + + aggregate-error@3.1.0: + resolution: { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: '>=8' } + + ansi-colors@4.1.3: + resolution: { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } + + ansi-escapes@4.3.2: + resolution: { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } + + ansi-regex@5.0.1: + resolution: { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } + + ansi-styles@3.2.1: + resolution: { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } + + ansi-styles@4.3.0: + resolution: { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } + + arch@2.2.0: + resolution: { + integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, + } + + array-buffer-byte-length@1.0.2: + resolution: { + integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, + } + engines: { node: '>= 0.4' } + + arraybuffer.prototype.slice@1.0.4: + resolution: { + integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, + } + engines: { node: '>= 0.4' } + + asn1@0.2.6: + resolution: { + integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==, + } + + assert-plus@1.0.0: + resolution: { + integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==, + } + engines: { node: '>=0.8' } + + astral-regex@2.0.0: + resolution: { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: '>=8' } + + async-function@1.0.0: + resolution: { + integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, + } + engines: { node: '>= 0.4' } + + async@3.2.6: + resolution: { + integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, + } + + asynckit@0.4.0: + resolution: { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + + at-least-node@1.0.0: + resolution: { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: '>= 4.0.0' } + + available-typed-arrays@1.0.7: + resolution: { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: '>= 0.4' } + + aws-sign2@0.7.0: + resolution: { + integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==, + } + + aws4@1.13.2: + resolution: { + integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==, + } + + balanced-match@1.0.2: + resolution: { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base64-js@1.5.1: + resolution: { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + bcrypt-pbkdf@1.0.2: + resolution: { + integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==, + } + + blob-util@2.0.2: + resolution: { + integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==, + } + + bluebird@3.7.2: + resolution: { + integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, + } + + brace-expansion@1.1.11: + resolution: { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + + braces@3.0.3: + resolution: { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: '>=8' } + + buffer-crc32@0.2.13: + resolution: { + integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, + } + + buffer@5.7.1: + resolution: { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + + cachedir@2.4.0: + resolution: { + integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==, + } + engines: { node: '>=6' } + + call-bind-apply-helpers@1.0.1: + resolution: { + integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==, + } + engines: { node: '>= 0.4' } + + call-bind@1.0.8: + resolution: { + integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, + } + engines: { node: '>= 0.4' } + + call-bound@1.0.3: + resolution: { + integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==, + } + engines: { node: '>= 0.4' } + + caseless@0.12.0: + resolution: { + integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==, + } + + chalk@2.4.2: + resolution: { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } + + chalk@4.1.2: + resolution: { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } + + check-more-types@2.24.0: + resolution: { + integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==, + } + engines: { node: '>= 0.8.0' } + + chokidar@4.0.3: + resolution: { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: '>= 14.16.0' } + + ci-info@4.1.0: + resolution: { + integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==, + } + engines: { node: '>=8' } + + clean-stack@2.2.0: + resolution: { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: '>=6' } + + cli-cursor@3.1.0: + resolution: { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: '>=8' } + + cli-table3@0.6.5: + resolution: { + integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==, + } + engines: { node: 10.* || >= 12.* } + + cli-truncate@2.1.0: + resolution: { + integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==, + } + engines: { node: '>=8' } + + color-convert@1.9.3: + resolution: { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + + color-convert@2.0.1: + resolution: { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } + + color-name@1.1.3: + resolution: { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + color-name@1.1.4: + resolution: { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + colorette@2.0.20: + resolution: { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + + combined-stream@1.0.8: + resolution: { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } + + commander@6.2.1: + resolution: { + integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==, + } + engines: { node: '>= 6' } + + common-tags@1.8.2: + resolution: { + integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, + } + engines: { node: '>=4.0.0' } + + concat-map@0.0.1: + resolution: { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + core-util-is@1.0.2: + resolution: { + integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==, + } + + cross-spawn@6.0.6: + resolution: { + integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==, + } + engines: { node: '>=4.8' } + + cross-spawn@7.0.6: + resolution: { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: '>= 8' } + + csstype@3.1.3: + resolution: { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } + + cypress@13.17.0: + resolution: { + integrity: sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==, + } + engines: { node: ^16.0.0 || ^18.0.0 || >=20.0.0 } + hasBin: true + + dashdash@1.14.1: + resolution: { + integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, + } + engines: { node: '>=0.10' } + + data-view-buffer@1.0.2: + resolution: { + integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, + } + engines: { node: '>= 0.4' } + + data-view-byte-length@1.0.2: + resolution: { + integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, + } + engines: { node: '>= 0.4' } + + data-view-byte-offset@1.0.1: + resolution: { + integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, + } + engines: { node: '>= 0.4' } + + dayjs@1.11.13: + resolution: { + integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==, + } + + debug@3.2.7: + resolution: { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: { + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-data-property@1.1.4: + resolution: { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: '>= 0.4' } + + define-properties@1.2.1: + resolution: { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: '>= 0.4' } + + delayed-stream@1.0.0: + resolution: { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } + + detect-libc@1.0.3: + resolution: { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: '>=0.10' } + hasBin: true + + dunder-proto@1.0.1: + resolution: { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } + + ecc-jsbn@0.1.2: + resolution: { + integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==, + } + + emoji-regex@8.0.0: + resolution: { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + end-of-stream@1.4.4: + resolution: { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + + enquirer@2.4.1: + resolution: { + integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, + } + engines: { node: '>=8.6' } + + entities@4.5.0: + resolution: { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: '>=0.12' } + + error-ex@1.3.2: + resolution: { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + + es-abstract@1.23.9: + resolution: { + integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, + } + engines: { node: '>= 0.4' } + + es-define-property@1.0.1: + resolution: { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } + + es-errors@1.3.0: + resolution: { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } + + es-object-atoms@1.1.1: + resolution: { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } + + es-set-tostringtag@2.1.0: + resolution: { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: '>= 0.4' } + + es-to-primitive@1.3.0: + resolution: { + integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, + } + engines: { node: '>= 0.4' } + + esbuild@0.23.1: + resolution: { + integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==, + } + engines: { node: '>=18' } + hasBin: true + + esbuild@0.24.2: + resolution: { + integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==, + } + engines: { node: '>=18' } + hasBin: true + + escape-string-regexp@1.0.5: + resolution: { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } + + estree-walker@2.0.2: + resolution: { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } + + eventemitter2@6.4.7: + resolution: { + integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==, + } + + execa@4.1.0: + resolution: { + integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==, + } + engines: { node: '>=10' } + + executable@4.1.1: + resolution: { + integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==, + } + engines: { node: '>=4' } + + extend@3.0.2: + resolution: { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + extract-zip@2.0.1: + resolution: { + integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, + } + engines: { node: '>= 10.17.0' } + hasBin: true + + extsprintf@1.3.0: + resolution: { + integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==, + } + engines: { '0': node >=0.6.0 } + + fd-slicer@1.1.0: + resolution: { + integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, + } + + figures@3.2.0: + resolution: { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: '>=8' } + + fill-range@7.1.1: + resolution: { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: '>=8' } + + for-each@0.3.4: + resolution: { + integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==, + } + engines: { node: '>= 0.4' } + + forever-agent@0.6.1: + resolution: { + integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==, + } + + form-data@4.0.1: + resolution: { + integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==, + } + engines: { node: '>= 6' } + + fs-extra@9.1.0: + resolution: { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: '>=10' } + + fsevents@2.3.3: + resolution: { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + function.prototype.name@1.1.8: + resolution: { + integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, + } + engines: { node: '>= 0.4' } + + functions-have-names@1.2.3: + resolution: { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + + get-intrinsic@1.2.7: + resolution: { + integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, + } + engines: { node: '>= 0.4' } + + get-proto@1.0.1: + resolution: { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } + + get-stream@5.2.0: + resolution: { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: '>=8' } + + get-symbol-description@1.1.0: + resolution: { + integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, + } + engines: { node: '>= 0.4' } + + get-tsconfig@4.10.0: + resolution: { + integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, + } + + getos@3.2.1: + resolution: { + integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==, + } + + getpass@0.1.7: + resolution: { + integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==, + } + + global-dirs@3.0.1: + resolution: { + integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==, + } + engines: { node: '>=10' } + + globalthis@1.0.4: + resolution: { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: '>= 0.4' } + + gopd@1.2.0: + resolution: { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } + + graceful-fs@4.2.11: + resolution: { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + has-bigints@1.1.0: + resolution: { + integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, + } + engines: { node: '>= 0.4' } + + has-flag@3.0.0: + resolution: { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } + + has-flag@4.0.0: + resolution: { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } + + has-property-descriptors@1.0.2: + resolution: { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } + + has-proto@1.2.0: + resolution: { + integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, + } + engines: { node: '>= 0.4' } + + has-symbols@1.1.0: + resolution: { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } + + has-tostringtag@1.0.2: + resolution: { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: '>= 0.4' } + + hasown@2.0.2: + resolution: { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } + + hosted-git-info@2.8.9: + resolution: { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } + + http-signature@1.4.0: + resolution: { + integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==, + } + engines: { node: '>=0.10' } + + human-signals@1.1.1: + resolution: { + integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==, + } + engines: { node: '>=8.12.0' } + + ieee754@1.2.1: + resolution: { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + immutable@5.0.3: + resolution: { + integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==, + } + + indent-string@4.0.0: + resolution: { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } + + ini@2.0.0: + resolution: { + integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==, + } + engines: { node: '>=10' } + + internal-slot@1.1.0: + resolution: { + integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, + } + engines: { node: '>= 0.4' } + + is-array-buffer@3.0.5: + resolution: { + integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, + } + engines: { node: '>= 0.4' } + + is-arrayish@0.2.1: + resolution: { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + + is-async-function@2.1.1: + resolution: { + integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, + } + engines: { node: '>= 0.4' } + + is-bigint@1.1.0: + resolution: { + integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, + } + engines: { node: '>= 0.4' } + + is-boolean-object@1.2.2: + resolution: { + integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, + } + engines: { node: '>= 0.4' } + + is-callable@1.2.7: + resolution: { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } + + is-core-module@2.16.1: + resolution: { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: '>= 0.4' } + + is-data-view@1.0.2: + resolution: { + integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, + } + engines: { node: '>= 0.4' } + + is-date-object@1.1.0: + resolution: { + integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, + } + engines: { node: '>= 0.4' } + + is-extglob@2.1.1: + resolution: { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } + + is-finalizationregistry@1.1.1: + resolution: { + integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, + } + engines: { node: '>= 0.4' } + + is-fullwidth-code-point@3.0.0: + resolution: { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } + + is-generator-function@1.1.0: + resolution: { + integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, + } + engines: { node: '>= 0.4' } + + is-glob@4.0.3: + resolution: { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } + + is-installed-globally@0.4.0: + resolution: { + integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==, + } + engines: { node: '>=10' } + + is-map@2.0.3: + resolution: { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: '>= 0.4' } + + is-number-object@1.1.1: + resolution: { + integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, + } + engines: { node: '>= 0.4' } + + is-number@7.0.0: + resolution: { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } + + is-path-inside@3.0.3: + resolution: { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: '>=8' } + + is-regex@1.2.1: + resolution: { + integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, + } + engines: { node: '>= 0.4' } + + is-set@2.0.3: + resolution: { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: '>= 0.4' } + + is-shared-array-buffer@1.0.4: + resolution: { + integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, + } + engines: { node: '>= 0.4' } + + is-stream@2.0.1: + resolution: { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } + + is-string@1.1.1: + resolution: { + integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, + } + engines: { node: '>= 0.4' } + + is-symbol@1.1.1: + resolution: { + integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, + } + engines: { node: '>= 0.4' } + + is-typed-array@1.1.15: + resolution: { + integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, + } + engines: { node: '>= 0.4' } + + is-typedarray@1.0.0: + resolution: { + integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, + } + + is-unicode-supported@0.1.0: + resolution: { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: '>=10' } + + is-weakmap@2.0.2: + resolution: { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: '>= 0.4' } + + is-weakref@1.1.1: + resolution: { + integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, + } + engines: { node: '>= 0.4' } + + is-weakset@2.0.4: + resolution: { + integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, + } + engines: { node: '>= 0.4' } + + isarray@2.0.5: + resolution: { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } + + isexe@2.0.0: + resolution: { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + isstream@0.1.2: + resolution: { + integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==, + } + + jsbn@0.1.1: + resolution: { + integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==, + } + + json-parse-better-errors@1.0.2: + resolution: { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + + json-schema@0.4.0: + resolution: { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } + + json-stringify-safe@5.0.1: + resolution: { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } + + jsonfile@6.1.0: + resolution: { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + + jsprim@2.0.2: + resolution: { + integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==, + } + engines: { '0': node >=0.6.0 } + + lazy-ass@1.6.0: + resolution: { + integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==, + } + engines: { node: '> 0.8' } + + listr2@3.14.0: + resolution: { + integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==, + } + engines: { node: '>=10.0.0' } + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + load-json-file@4.0.0: + resolution: { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: '>=4' } + + lodash.once@4.1.1: + resolution: { + integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, + } + + lodash@4.17.21: + resolution: { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + log-symbols@4.1.0: + resolution: { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: '>=10' } + + log-update@4.0.0: + resolution: { + integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==, + } + engines: { node: '>=10' } + + magic-string@0.30.17: + resolution: { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } + + math-intrinsics@1.1.0: + resolution: { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } + + memorystream@0.3.1: + resolution: { + integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, + } + engines: { node: '>= 0.10.0' } + + merge-stream@2.0.0: + resolution: { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + micromatch@4.0.8: + resolution: { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } + + mime-db@1.52.0: + resolution: { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } + + mime-types@2.1.35: + resolution: { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } + + mimic-fn@2.1.0: + resolution: { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } + + minimatch@3.1.2: + resolution: { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + minimist@1.2.8: + resolution: { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + ms@2.1.3: + resolution: { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + nanoid@3.3.8: + resolution: { + integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + nice-try@1.0.5: + resolution: { + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, + } + + node-addon-api@7.1.1: + resolution: { + integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + } + + normalize-package-data@2.5.0: + resolution: { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } + + npm-run-all@4.1.5: + resolution: { + integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==, + } + engines: { node: '>= 4' } + hasBin: true + + npm-run-path@4.0.1: + resolution: { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } + + object-inspect@1.13.4: + resolution: { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } + + object-keys@1.1.1: + resolution: { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: '>= 0.4' } + + object.assign@4.1.7: + resolution: { + integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, + } + engines: { node: '>= 0.4' } + + once@1.4.0: + resolution: { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@5.1.2: + resolution: { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } + + ospath@1.2.2: + resolution: { + integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==, + } + + own-keys@1.0.1: + resolution: { + integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, + } + engines: { node: '>= 0.4' } + + p-map@4.0.0: + resolution: { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: '>=10' } + + parse-json@4.0.0: + resolution: { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: '>=4' } + + path-key@2.0.1: + resolution: { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: '>=4' } + + path-key@3.1.1: + resolution: { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } + + path-parse@1.0.7: + resolution: { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-type@3.0.0: + resolution: { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: '>=4' } + + pend@1.2.0: + resolution: { + integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, + } + + performance-now@2.1.0: + resolution: { + integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, + } + + picocolors@1.1.1: + resolution: { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@2.3.1: + resolution: { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } + + pidtree@0.3.1: + resolution: { + integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==, + } + engines: { node: '>=0.10' } + hasBin: true + + pify@2.3.0: + resolution: { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: '>=0.10.0' } + + pify@3.0.0: + resolution: { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: '>=4' } + + possible-typed-array-names@1.0.0: + resolution: { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: '>= 0.4' } + + postcss@8.5.1: + resolution: { + integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==, + } + engines: { node: ^10 || ^12 || >=14 } + + pretty-bytes@5.6.0: + resolution: { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: '>=6' } + + process@0.11.10: + resolution: { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: '>= 0.6.0' } + + proxy-from-env@1.0.0: + resolution: { + integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==, + } + + pump@3.0.2: + resolution: { + integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, + } + + qs@6.13.1: + resolution: { + integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==, + } + engines: { node: '>=0.6' } + + read-pkg@3.0.0: + resolution: { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: '>=4' } + + readdirp@4.1.1: + resolution: { + integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==, + } + engines: { node: '>= 14.18.0' } + + reflect.getprototypeof@1.0.10: + resolution: { + integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, + } + engines: { node: '>= 0.4' } + + regexp.prototype.flags@1.5.4: + resolution: { + integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, + } + engines: { node: '>= 0.4' } + + request-progress@3.0.0: + resolution: { + integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==, + } + + resolve-pkg-maps@1.0.0: + resolution: { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + + resolve@1.22.10: + resolution: { + integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, + } + engines: { node: '>= 0.4' } + hasBin: true + + restore-cursor@3.1.0: + resolution: { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: '>=8' } + + rfdc@1.4.1: + resolution: { + integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, + } + + rollup@4.34.4: + resolution: { + integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } + hasBin: true + + rxjs@7.8.1: + resolution: { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } + + safe-array-concat@1.1.3: + resolution: { + integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, + } + engines: { node: '>=0.4' } + + safe-buffer@5.2.1: + resolution: { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safe-push-apply@1.0.0: + resolution: { + integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, + } + engines: { node: '>= 0.4' } + + safe-regex-test@1.1.0: + resolution: { + integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, + } + engines: { node: '>= 0.4' } + + safer-buffer@2.1.2: + resolution: { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + sass@1.84.0: + resolution: { + integrity: sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==, + } + engines: { node: '>=14.0.0' } + hasBin: true + + semver@5.7.2: + resolution: { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + + semver@7.7.1: + resolution: { + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + } + engines: { node: '>=10' } + hasBin: true + + set-function-length@1.2.2: + resolution: { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: '>= 0.4' } + + set-function-name@2.0.2: + resolution: { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: '>= 0.4' } + + set-proto@1.0.0: + resolution: { + integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, + } + engines: { node: '>= 0.4' } + + shebang-command@1.2.0: + resolution: { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: '>=0.10.0' } + + shebang-command@2.0.0: + resolution: { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } + + shebang-regex@1.0.0: + resolution: { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: '>=0.10.0' } + + shebang-regex@3.0.0: + resolution: { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } + + shell-quote@1.8.2: + resolution: { + integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==, + } + engines: { node: '>= 0.4' } + + side-channel-list@1.0.0: + resolution: { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: '>= 0.4' } + + side-channel-map@1.0.1: + resolution: { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } + + side-channel-weakmap@1.0.2: + resolution: { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } + + side-channel@1.1.0: + resolution: { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: '>= 0.4' } + + signal-exit@3.0.7: + resolution: { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + slice-ansi@3.0.0: + resolution: { + integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==, + } + engines: { node: '>=8' } + + slice-ansi@4.0.0: + resolution: { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: '>=10' } + + source-map-js@1.2.1: + resolution: { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } + + spdx-correct@3.2.0: + resolution: { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + + spdx-exceptions@2.5.0: + resolution: { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } + + spdx-expression-parse@3.0.1: + resolution: { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + + spdx-license-ids@3.0.21: + resolution: { + integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==, + } + + sshpk@1.18.0: + resolution: { + integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==, + } + engines: { node: '>=0.10.0' } + hasBin: true + + string-width@4.2.3: + resolution: { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } + + string.prototype.padend@3.1.6: + resolution: { + integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==, + } + engines: { node: '>= 0.4' } + + string.prototype.trim@1.2.10: + resolution: { + integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, + } + engines: { node: '>= 0.4' } + + string.prototype.trimend@1.0.9: + resolution: { + integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, + } + engines: { node: '>= 0.4' } + + string.prototype.trimstart@1.0.8: + resolution: { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: '>= 0.4' } + + strip-ansi@6.0.1: + resolution: { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } + + strip-bom@3.0.0: + resolution: { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } + + strip-final-newline@2.0.0: + resolution: { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } + + supports-color@5.5.0: + resolution: { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } + + supports-color@7.2.0: + resolution: { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } + + supports-color@8.1.1: + resolution: { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } + + supports-preserve-symlinks-flag@1.0.0: + resolution: { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } + + throttleit@1.0.1: + resolution: { + integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==, + } + + through@2.3.8: + resolution: { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + tldts-core@6.1.76: + resolution: { + integrity: sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==, + } + + tldts@6.1.76: + resolution: { + integrity: sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==, + } + hasBin: true + + tmp@0.2.3: + resolution: { + integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, + } + engines: { node: '>=14.14' } + + to-regex-range@5.0.1: + resolution: { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } + + tough-cookie@5.1.0: + resolution: { + integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==, + } + engines: { node: '>=16' } + + tree-kill@1.2.2: + resolution: { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } + hasBin: true + + tslib@2.8.1: + resolution: { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + tsx@4.19.2: + resolution: { + integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==, + } + engines: { node: '>=18.0.0' } + hasBin: true + + tunnel-agent@0.6.0: + resolution: { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + + tweetnacl@0.14.5: + resolution: { + integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==, + } + + type-fest@0.21.3: + resolution: { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } + + type-fest@3.13.1: + resolution: { + integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, + } + engines: { node: '>=14.16' } + + typed-array-buffer@1.0.3: + resolution: { + integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, + } + engines: { node: '>= 0.4' } + + typed-array-byte-length@1.0.3: + resolution: { + integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, + } + engines: { node: '>= 0.4' } + + typed-array-byte-offset@1.0.4: + resolution: { + integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, + } + engines: { node: '>= 0.4' } + + typed-array-length@1.0.7: + resolution: { + integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, + } + engines: { node: '>= 0.4' } + + typescript@5.7.3: + resolution: { + integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==, + } + engines: { node: '>=14.17' } + hasBin: true + + unbox-primitive@1.1.0: + resolution: { + integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, + } + engines: { node: '>= 0.4' } + + undici-types@6.20.0: + resolution: { + integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, + } + + universalify@2.0.1: + resolution: { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: '>= 10.0.0' } + + untildify@4.0.0: + resolution: { + integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, + } + engines: { node: '>=8' } + + uuid@8.3.2: + resolution: { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + + verror@1.10.0: + resolution: { + integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==, + } + engines: { '0': node >=0.6.0 } + + vite@6.1.0: + resolution: { + integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue-demi@0.14.10: + resolution: { + integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==, + } + engines: { node: '>=12' } + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue@3.5.13: + resolution: { + integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==, + } + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + which-boxed-primitive@1.1.1: + resolution: { + integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, + } + engines: { node: '>= 0.4' } + + which-builtin-type@1.2.1: + resolution: { + integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, + } + engines: { node: '>= 0.4' } + + which-collection@1.0.2: + resolution: { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: '>= 0.4' } + + which-typed-array@1.1.18: + resolution: { + integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==, + } + engines: { node: '>= 0.4' } + + which@1.3.1: + resolution: { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + + which@2.0.2: + resolution: { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } + hasBin: true + + wrap-ansi@6.2.0: + resolution: { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } + + wrap-ansi@7.0.0: + resolution: { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } + + wrappy@1.0.2: + resolution: { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + yauzl@2.10.0: + resolution: { + integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, + } + +snapshots: + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.7': + dependencies: + '@babel/types': 7.26.7 + + '@babel/types@7.26.7': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bahmutov/cypress-esbuild-preprocessor@2.2.4(esbuild@0.24.2)': + dependencies: + debug: 4.4.0(supports-color@8.1.1) + esbuild: 0.24.2 + transitivePeerDependencies: + - supports-color + + '@colors/colors@1.5.0': + optional: true + + '@cypress/request@3.0.7': + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 4.0.1 + http-signature: 1.4.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + performance-now: 2.1.0 + qs: 6.13.1 + safe-buffer: 5.2.1 + tough-cookie: 5.1.0 + tunnel-agent: 0.6.0 + uuid: 8.3.2 + + '@cypress/xvfb@1.2.4(supports-color@8.1.1)': + dependencies: + debug: 3.2.7(supports-color@8.1.1) + lodash.once: 4.1.1 + transitivePeerDependencies: + - supports-color + + '@deno/vite-plugin@1.0.3(vite@6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2))': + dependencies: + vite: 6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2) + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.4': + optional: true + + '@rollup/rollup-android-arm64@4.34.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.4': + optional: true + + '@rollup/rollup-darwin-x64@4.34.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.4': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.4': + optional: true + + '@types/estree@1.0.6': {} + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + optional: true + + '@types/sinonjs__fake-timers@8.1.1': {} + + '@types/sizzle@2.3.9': {} + + '@types/web-bluetooth@0.0.14': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.13.1 + optional: true + + '@vitejs/plugin-vue@5.2.1(vite@6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2))(vue@3.5.13(typescript@5.7.3))': + dependencies: + vite: 6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2) + vue: 3.5.13(typescript@5.7.3) + + '@vue-kakuyaku/core@0.4.3(typescript@5.7.3)': + dependencies: + '@vueuse/core': 8.9.4(vue@3.5.13(typescript@5.7.3)) + type-fest: 3.13.1 + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.7 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.7 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.1 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + + '@vue/shared@3.5.13': {} + + '@vueuse/core@8.9.4(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@types/web-bluetooth': 0.0.14 + '@vueuse/metadata': 8.9.4 + '@vueuse/shared': 8.9.4(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + vue: 3.5.13(typescript@5.7.3) + + '@vueuse/metadata@8.9.4': {} + + '@vueuse/shared@8.9.4(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + vue: 3.5.13(typescript@5.7.3) + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + arch@2.2.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + astral-regex@2.0.0: {} + + async-function@1.0.0: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + blob-util@2.0.2: {} + + bluebird@3.7.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + optional: true + + buffer-crc32@0.2.13: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + cachedir@2.4.0: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + caseless@0.12.0: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-more-types@2.24.0: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + + ci-info@4.1.0: {} + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@6.2.1: {} + + common-tags@1.8.2: {} + + concat-map@0.0.1: {} + + core-util-is@1.0.2: {} + + cross-spawn@6.0.6: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + cypress@13.17.0: + dependencies: + '@cypress/request': 3.0.7 + '@cypress/xvfb': 1.2.4(supports-color@8.1.1) + '@types/sinonjs__fake-timers': 8.1.1 + '@types/sizzle': 2.3.9 + arch: 2.2.0 + blob-util: 2.0.2 + bluebird: 3.7.2 + buffer: 5.7.1 + cachedir: 2.4.0 + chalk: 4.1.2 + check-more-types: 2.24.0 + ci-info: 4.1.0 + cli-cursor: 3.1.0 + cli-table3: 0.6.5 + commander: 6.2.1 + common-tags: 1.8.2 + dayjs: 1.11.13 + debug: 4.4.0(supports-color@8.1.1) + enquirer: 2.4.1 + eventemitter2: 6.4.7 + execa: 4.1.0 + executable: 4.1.1 + extract-zip: 2.0.1(supports-color@8.1.1) + figures: 3.2.0 + fs-extra: 9.1.0 + getos: 3.2.1 + is-installed-globally: 0.4.0 + lazy-ass: 1.6.0 + listr2: 3.14.0(enquirer@2.4.1) + lodash: 4.17.21 + log-symbols: 4.1.0 + minimist: 1.2.8 + ospath: 1.2.2 + pretty-bytes: 5.6.0 + process: 0.11.10 + proxy-from-env: 1.0.0 + request-progress: 3.0.0 + semver: 7.7.1 + supports-color: 8.1.1 + tmp: 0.2.3 + tree-kill: 1.2.2 + untildify: 4.0.0 + yauzl: 2.10.0 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.13: {} + + debug@3.2.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.4.0(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + detect-libc@1.0.3: + optional: true + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + optional: true + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escape-string-regexp@1.0.5: {} + + estree-walker@2.0.2: {} + + eventemitter2@6.4.7: {} + + execa@4.1.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + executable@4.1.1: + dependencies: + pify: 2.3.0 + + extend@3.0.2: {} + + extract-zip@2.0.1(supports-color@8.1.1): + dependencies: + debug: 4.4.0(supports-color@8.1.1) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.3.0: {} + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + optional: true + + for-each@0.3.4: + dependencies: + is-callable: 1.2.7 + + forever-agent@0.6.1: {} + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + optional: true + + getos@3.2.1: + dependencies: + async: 3.2.6 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + global-dirs@3.0.1: + dependencies: + ini: 2.0.0 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} + + http-signature@1.4.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 2.0.2 + sshpk: 1.18.0 + + human-signals@1.1.1: {} + + ieee754@1.2.1: {} + + immutable@5.0.3: {} + + indent-string@4.0.0: {} + + ini@2.0.0: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: + optional: true + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-installed-globally@0.4.0: + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@7.0.0: + optional: true + + is-path-inside@3.0.3: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isstream@0.1.2: {} + + jsbn@0.1.1: {} + + json-parse-better-errors@1.0.2: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsprim@2.0.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + lazy-ass@1.6.0: {} + + listr2@3.14.0(enquirer@2.4.1): + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.4.1 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + optionalDependencies: + enquirer: 2.4.1 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + lodash.once@4.1.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + math-intrinsics@1.1.0: {} + + memorystream@0.3.1: {} + + merge-stream@2.0.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + nanoid@3.3.8: {} + + nice-try@1.0.5: {} + + node-addon-api@7.1.1: + optional: true + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.6 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.2 + string.prototype.padend: 3.1.6 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + ospath@1.2.2: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + pend@1.2.0: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: + optional: true + + pidtree@0.3.1: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-bytes@5.6.0: {} + + process@0.11.10: {} + + proxy-from-env@1.0.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + qs@6.13.1: + dependencies: + side-channel: 1.1.0 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + readdirp@4.1.1: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + request-progress@3.0.0: + dependencies: + throttleit: 1.0.1 + + resolve-pkg-maps@1.0.0: + optional: true + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + rfdc@1.4.1: {} + + rollup@4.34.4: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.4 + '@rollup/rollup-android-arm64': 4.34.4 + '@rollup/rollup-darwin-arm64': 4.34.4 + '@rollup/rollup-darwin-x64': 4.34.4 + '@rollup/rollup-freebsd-arm64': 4.34.4 + '@rollup/rollup-freebsd-x64': 4.34.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.4 + '@rollup/rollup-linux-arm-musleabihf': 4.34.4 + '@rollup/rollup-linux-arm64-gnu': 4.34.4 + '@rollup/rollup-linux-arm64-musl': 4.34.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4 + '@rollup/rollup-linux-riscv64-gnu': 4.34.4 + '@rollup/rollup-linux-s390x-gnu': 4.34.4 + '@rollup/rollup-linux-x64-gnu': 4.34.4 + '@rollup/rollup-linux-x64-musl': 4.34.4 + '@rollup/rollup-win32-arm64-msvc': 4.34.4 + '@rollup/rollup-win32-ia32-msvc': 4.34.4 + '@rollup/rollup-win32-x64-msvc': 4.34.4 + fsevents: 2.3.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sass@1.84.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + semver@5.7.2: {} + + semver@7.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + source-map-js@1.2.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + throttleit@1.0.1: {} + + through@2.3.8: {} + + tldts-core@6.1.76: {} + + tldts@6.1.76: + dependencies: + tldts-core: 6.1.76 + + tmp@0.2.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + optional: true + + tough-cookie@5.1.0: + dependencies: + tldts: 6.1.76 + + tree-kill@1.2.2: {} + + tslib@2.8.1: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-fest@0.21.3: {} + + type-fest@3.13.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.7.3: + optional: true + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.20.0: + optional: true + + universalify@2.0.1: {} + + untildify@4.0.0: {} + + uuid@8.3.2: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + vite@6.1.0(@types/node@22.13.1)(sass@1.84.0)(tsx@4.19.2): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.4 + optionalDependencies: + '@types/node': 22.13.1 + fsevents: 2.3.3 + sass: 1.84.0 + tsx: 4.19.2 + + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue@3.5.13(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.3 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 diff --git a/packages/client/test/integration/test-web/src/App.vue b/tests/browser/src/App.vue similarity index 100% rename from packages/client/test/integration/test-web/src/App.vue rename to tests/browser/src/App.vue diff --git a/tests/browser/src/client.ts b/tests/browser/src/client.ts new file mode 100644 index 00000000..57990c2e --- /dev/null +++ b/tests/browser/src/client.ts @@ -0,0 +1,26 @@ +import { ACCOUNT_KEY_PAIR, CHAIN, DOMAIN } from '@iroha/test-configuration' + +import { Client } from '@iroha/client' +import { adapter as WS } from '@iroha/client/web-socket/native' + +// it must resolve first, before using core crypto exports +import './setup-crypto.ts' + +import { KeyPair, PrivateKey, PublicKey } from '@iroha/core/crypto' + +const keyPair = KeyPair.fromParts( + PublicKey.fromMultihash(ACCOUNT_KEY_PAIR.publicKey), + PrivateKey.fromMultihash(ACCOUNT_KEY_PAIR.privateKey), +) + +const HOST = globalThis.location.host + +export const client = new Client({ + // proxified with vite + toriiBaseURL: new URL(`http://${HOST}/torii`), + + ws: WS, + chain: CHAIN, + accountDomain: DOMAIN, + accountKeyPair: keyPair, +}) diff --git a/tests/browser/src/components/CreateDomain.vue b/tests/browser/src/components/CreateDomain.vue new file mode 100644 index 00000000..84661ca7 --- /dev/null +++ b/tests/browser/src/components/CreateDomain.vue @@ -0,0 +1,30 @@ + + + diff --git a/tests/browser/src/components/EventListener.vue b/tests/browser/src/components/EventListener.vue new file mode 100644 index 00000000..d3c06220 --- /dev/null +++ b/tests/browser/src/components/EventListener.vue @@ -0,0 +1,65 @@ + + + diff --git a/packages/client/test/integration/test-web/src/components/StatusChecker.vue b/tests/browser/src/components/StatusChecker.vue similarity index 68% rename from packages/client/test/integration/test-web/src/components/StatusChecker.vue rename to tests/browser/src/components/StatusChecker.vue index dd689ba3..43a9b655 100644 --- a/packages/client/test/integration/test-web/src/components/StatusChecker.vue +++ b/tests/browser/src/components/StatusChecker.vue @@ -1,10 +1,9 @@ @@ -17,5 +16,7 @@ useIntervalFn(run, 1000)
  • Blocks: {{ stale.fulfilled.value.blocks }}
  • Uptime (sec): {{ stale.fulfilled.value.uptime.secs }}
  • + +
    {{ stale.rejected.reason }}
    diff --git a/tests/browser/src/env.d.ts b/tests/browser/src/env.d.ts new file mode 100644 index 00000000..0ffaf755 --- /dev/null +++ b/tests/browser/src/env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent, Record, any> + export default component +} diff --git a/tests/browser/src/main.ts b/tests/browser/src/main.ts new file mode 100644 index 00000000..6b1b8b16 --- /dev/null +++ b/tests/browser/src/main.ts @@ -0,0 +1,6 @@ +import App from './App.vue' +import { createApp } from 'vue' + +localStorage.debug = '*' + +createApp(App).mount('#app') diff --git a/tests/browser/src/setup-crypto.ts b/tests/browser/src/setup-crypto.ts new file mode 100644 index 00000000..a370655d --- /dev/null +++ b/tests/browser/src/setup-crypto.ts @@ -0,0 +1 @@ +import '@iroha/crypto-target-web/install' diff --git a/tests/browser/vite.config.ts b/tests/browser/vite.config.ts new file mode 100644 index 00000000..ef2bb765 --- /dev/null +++ b/tests/browser/vite.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import deno from '@deno/vite-plugin' +import { PORT_PEER_API, PORT_PEER_SERVER, PORT_VITE } from './etc/meta.ts' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), deno()], + optimizeDeps: { + esbuildOptions: { + target: 'esnext', + }, + }, + build: { + target: 'esnext', + }, + server: { + port: PORT_VITE, + strictPort: true, + proxy: { + '/torii': { + ws: true, + target: `http://localhost:${PORT_PEER_API}`, + rewrite: (path) => path.replace(/^\/torii/, ''), + }, + '/peer-server': { + ws: true, + target: `http://localhost:${PORT_PEER_SERVER}`, + rewrite: (path) => path.replace(/^\/peer-server/, ''), + }, + }, + fs: { allow: ['../../'] }, + }, + preview: { + port: PORT_VITE, + strictPort: true, + }, +}) diff --git a/packages/client/test/integration/test-node/README.md b/tests/node/README.md similarity index 64% rename from packages/client/test/integration/test-node/README.md rename to tests/node/README.md index 1f636a2c..881b372c 100644 --- a/packages/client/test/integration/test-node/README.md +++ b/tests/node/README.md @@ -4,8 +4,8 @@ This project is a collection of integration tests running from Node.js with actu ## SDK Compatibility Matrix -Tests for [compatibility matrix](https://hyperledger.github.io/iroha-2-docs/reference/compatibility-matrix.html) -are defined at [`compatibility` directory](./test/compatibility). +Tests for [compatibility matrix](https://hyperledger.github.io/iroha-2-docs/reference/compatibility-matrix.html) are +defined at [`compatibility` directory](./test/compatibility). The easiest way to run tests: @@ -22,6 +22,6 @@ pnpm jake test:prepare-client-integration pnpm --filter client-test-node test ``` -Allure reports are stored after tests run at `./allure-results` directory. -**Note:** these reports contain _all_ tests, not only compatibility tests results. -So, be sure to filter the results by their metadata before submitting them to TestOps. +Allure reports are stored after tests run at `./allure-results` directory. **Note:** these reports contain _all_ tests, +not only compatibility tests results. So, be sure to filter the results by their metadata before submitting them to +TestOps. diff --git a/tests/node/deno.jsonc b/tests/node/deno.jsonc new file mode 100644 index 00000000..2c2da465 --- /dev/null +++ b/tests/node/deno.jsonc @@ -0,0 +1,5 @@ +{ + "tasks": { + "test": "DEBUG=\"@iroha*\" vitest" + } +} diff --git a/tests/node/tests/client-apis.spec.ts b/tests/node/tests/client-apis.spec.ts new file mode 100644 index 00000000..c338bd66 --- /dev/null +++ b/tests/node/tests/client-apis.spec.ts @@ -0,0 +1,96 @@ +import { describe, expect, test } from 'vitest' + +import SCHEMA from '@iroha/core/data-model/schema-json' +import { HttpTransport, MainAPI } from '@iroha/client' + +import { useNetwork, usePeer } from './util.ts' +import { Buffer } from 'node:buffer' + +describe('Various API methods', () => { + test('health check passes', async () => { + const { client } = await usePeer() + + await expect(client.api.health()).resolves.toEqual({ kind: 'healthy' }) + }) + + test('health check catches an error when there is no peer started', async () => { + const result = await new MainAPI(new HttpTransport(new URL('http://localhost:8482'))).health() + + expect(result.kind).toBe('error') + }) + + describe('configuration', () => { + test('update and retrieve', async () => { + const { client } = await usePeer() + + let config = await client.api.getConfig() + expect(config.logger.level).toBe('debug') + + await client.api.setConfig({ logger: { level: 'TRACE' } }) + + config = await client.api.getConfig() + expect(config.logger.level).toBe('trace') + }) + + // FIXME: re-enable after fix of https://github.com/hyperledger-iroha/iroha/issues/5247 + test.skip('throws an error when trying to set an invalid configuration', async () => { + const { client } = await usePeer() + + await expect(client.api.setConfig({ logger: { level: 'TR' as any } })).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: 400: Bad Request]`, + ) + }) + }) + + test('schema matches the schema of the data model', async () => { + const { client } = await usePeer() + + const schema = await client.api.schema() + + expect(schema).toEqual(SCHEMA) + }) +}) + +describe('Telemetry API methods', () => { + test('metrics', async () => { + const { client } = await usePeer() + + const metrics = await client.api.telemetry.metrics() + + // just some line from Prometheus metrics + expect(metrics).toMatch('block_height 1') + }) + + test('status', async () => { + const { client } = await usePeer() + + const { uptime, ...rest } = await client.api.telemetry.status() + + expect(rest).toMatchInlineSnapshot(` + { + "blocks": 1n, + "peers": 0n, + "queueSize": 0n, + "txsAccepted": 3n, + "txsRejected": 0n, + "viewChanges": 0n, + } + `) + expect(uptime).toEqual( + expect.objectContaining({ + nanos: expect.any(Number), + secs: expect.any(BigInt), + }), + ) + }) + + test('peers (network of 4)', async () => { + const { peers } = await useNetwork({ peers: 4, seed: new Uint8Array(Buffer.from('deadbeef', 'hex')) }) + + const peersData = await peers[0].client.api.telemetry.peers() + + expect(peersData.map((x) => x.id.multihash())).contain.all.members( + peers.slice(1).map((x) => x.keypair.publicKey().multihash()), + ) + }) +}) diff --git a/tests/node/tests/client-misc.spec.ts b/tests/node/tests/client-misc.spec.ts new file mode 100644 index 00000000..dc5c49f9 --- /dev/null +++ b/tests/node/tests/client-misc.spec.ts @@ -0,0 +1,627 @@ +import { describe, expect, test } from 'vitest' + +import { Bytes, KeyPair } from '@iroha/core/crypto' +import { blockHash } from '@iroha/core' +import * as dm from '@iroha/core/data-model' +import { type Client, QueryValidationError } from '@iroha/client' +import { usePeer } from './util.ts' +import { match, P } from 'ts-pattern' +import { ACCOUNT_KEY_PAIR, DOMAIN } from '@iroha/test-configuration' + +async function submitTestData(client: Client) { + const bob = KeyPair.deriveFromSeed(Bytes.hex('bbbb')) + const bobAcc = new dm.AccountId(bob.publicKey(), new dm.DomainId('based')) + const bobPub = bob.publicKey().multihash() + + const madHatter = KeyPair.deriveFromSeed(Bytes.hex('aaaa')) + + const EMPTY_LOGO_META = { logo: null, metadata: [] } satisfies Pick + + const multitudeOfDomains = Array.from({ length: 25 }, (_v, i) => + dm.InstructionBox.Register.Domain({ + id: new dm.Name(`domains-multitude-${i}`), + ...EMPTY_LOGO_META, + })) + + const ALL_ISI = [ + dm.InstructionBox.Register.Domain({ id: new dm.Name('certainty'), ...EMPTY_LOGO_META }), + dm.InstructionBox.Register.Domain({ id: new dm.Name('based'), ...EMPTY_LOGO_META }), + dm.InstructionBox.Register.Domain({ id: new dm.Name('wherever'), ...EMPTY_LOGO_META }), + ...multitudeOfDomains, + dm.InstructionBox.Register.Account({ + id: bobAcc, + metadata: [{ key: new dm.Name('alias'), value: dm.Json.fromValue('Bob') }], + }), + dm.InstructionBox.Register.Account({ + id: new dm.AccountId(madHatter.publicKey(), new dm.Name('certainty')), + metadata: [{ key: new dm.Name('alias'), value: dm.Json.fromValue('Mad Hatter') }], + }), + dm.InstructionBox.Register.AssetDefinition({ + id: dm.AssetDefinitionId.parse('base_coin#based'), + type: dm.AssetType.Store, + mintable: dm.Mintable.Not, + ...EMPTY_LOGO_META, + }), + dm.InstructionBox.Register.AssetDefinition({ + id: dm.AssetDefinitionId.parse('neko_coin#wherever'), + type: dm.AssetType.Store, + mintable: dm.Mintable.Not, + logo: null, + metadata: [{ key: new dm.Name('foo'), value: dm.Json.fromValue(['bar', false]) }], + }), + dm.InstructionBox.Register.AssetDefinition({ + id: dm.AssetDefinitionId.parse('gator_coin#certainty'), + type: dm.AssetType.Numeric({ scale: null }), + mintable: dm.Mintable.Infinitely, + ...EMPTY_LOGO_META, + }), + + dm.InstructionBox.Mint.Asset({ + object: { scale: 0n, mantissa: 551_231n }, + destination: dm.AssetId.parse(`gator_coin#certainty#${bobPub}@based`), + }), + dm.InstructionBox.Burn.Asset({ + object: { scale: 3n, mantissa: 1_000n }, + destination: dm.AssetId.parse(`gator_coin#certainty#${bobPub}@based`), + }), + dm.InstructionBox.Mint.Asset({ + object: { scale: 2n, mantissa: 1904n }, + destination: dm.AssetId.parse(`gator_coin##${madHatter.publicKey().multihash()}@certainty`), + }), + + dm.InstructionBox.SetKeyValue.Asset({ + object: dm.AssetId.parse(`neko_coin#wherever#${bobAcc}`), + key: new dm.Name('mewo?'), + value: dm.Json.fromValue({ me: 'wo' }), + }), + dm.InstructionBox.SetKeyValue.Asset({ + object: dm.AssetId.parse(`base_coin#based#${madHatter.publicKey().multihash()}@certainty`), + key: new dm.Name('hey'), + value: dm.Json.fromValue([1, 2, 3]), + }), + dm.InstructionBox.Register.Trigger({ + // TODO: make just Name + id: new dm.Name('mewo_maker'), + action: { + filter: dm.EventFilterBox.Data.Asset({ + idMatcher: null, + eventSet: new Set(['MetadataInserted', 'MetadataRemoved', 'Created', 'Deleted', 'Added', 'Removed']), + }), + executable: dm.Executable.Instructions([dm.InstructionBox.Log({ level: { kind: 'WARN' }, msg: 'MEWO!' })]), + repeats: dm.Repeats.Indefinitely, + authority: bobAcc, + metadata: [], + }, + }), + dm.InstructionBox.Register.Trigger({ + id: new dm.Name('make_havoc_every_300_ms'), + action: { + filter: dm.EventFilterBox.Time.Schedule({ + start: dm.Timestamp.now(), + period: dm.Duration.fromMillis(300), + }), + repeats: dm.Repeats.Indefinitely, + authority: bobAcc, + executable: dm.Executable.Instructions([ + dm.InstructionBox.Mint.Asset({ + object: { mantissa: 30n, scale: 2n }, + destination: dm.AssetId.parse(`time#certainty#${bobAcc}`), + }), + ]), + metadata: [], + }, + }), + ] + + await client.transaction(dm.Executable.Instructions(ALL_ISI)).submit({ verify: true }) + + return { bob, madHatter } +} + +test('Test data is valid', async () => { + const { client } = await usePeer() + + await expect(submitTestData(client)).resolves.not.toThrow() +}) + +describe('Queries', () => { + test('.executeSingle() throws when there are no results', async () => { + const { client } = await usePeer() + + await expect( + client.find + .assets({ + predicate: dm.CompoundPredicate.FAIL, + }) + .executeSingle(), + ).rejects.toThrowErrorMatchingInlineSnapshot(`[TypeError: Expected query to return exactly one element, got 0]`) + }) + + test('fetch accounts with OR predicate', async () => { + const { client } = await usePeer() + const { bob } = await submitTestData(client) + + const items = await client.find + .accounts({ + predicate: dm.CompoundPredicate.Or( + dm.CompoundPredicate.Atom(dm.AccountProjectionPredicate.Id.Domain.Name.Atom.Contains('cert')), + dm.CompoundPredicate.Atom( + dm.AccountProjectionPredicate.Id.Signatory.Atom.Equals(bob.publicKey()), + ), + ), + selector: dm.AccountProjectionSelector.Metadata.Key({ + key: new dm.Name('alias'), + projection: { kind: 'Atom' }, + }), + }) + .executeAll() + + expect(items.map((x) => x.asValue())).toEqual(['Bob', 'Mad Hatter']) + }) + + test('find accounts with assets (query with payload)', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const items = await client.find + .accountsWithAsset( + { + assetDefinition: dm.AssetDefinitionId.parse('neko_coin#wherever'), + }, + { + selector: dm.AccountProjectionSelector.Metadata.Key({ + key: new dm.Name('alias'), + projection: { kind: 'Atom' }, + }), + }, + ) + .executeAll() + + expect(items.map((x) => x.asValue())).toEqual(['Bob']) + }) + + test('find blocks and block headers', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const blocks = await client.find.blocks({ selector: dm.SignedBlockProjectionSelector.Header.Atom }).executeAll() + const headers = await client.find.blockHeaders().executeAll() + + expect(blocks).toEqual(headers) + }) + + test('find transactions', async () => { + const { client } = await usePeer() + + const txs = await client.find.transactions().executeAll() + const status = await client.api.telemetry.status() + + expect(txs).toHaveLength(Number(status.txsAccepted)) + }) + + test('find triggers', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const all = await client.find.triggers({ selector: dm.TriggerProjectionSelector.Id.Atom }).executeAll() + const activeOnes = await client.find.activeTriggerIds().executeAll() + + expect(all).toEqual(activeOnes) + expect(activeOnes).toMatchInlineSnapshot(` + [ + "make_havoc_every_300_ms", + "mewo_maker", + ] + `) + }) + + test('filter assets by the ending of its definition name', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const items = await client.find + .assets({ + predicate: dm.CompoundPredicate.Atom(dm.AssetProjectionPredicate.Id.Definition.Name.Atom.EndsWith('_coin')), + selector: dm.AssetProjectionSelector.Id.Definition.Name.Atom, + }) + .executeAll() + + expect(items.map((x) => x.value)).contain.all.members(['base_coin', 'neko_coin', 'gator_coin']) + }) + + test('FAIL returns nothing, PASS returns all', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const domains = await client.find.domains().executeAll() + expect(domains.length).toBeGreaterThan(0) + + const failed = await client.find.domains({ predicate: dm.CompoundPredicate.FAIL }).executeAll() + expect(failed).toHaveLength(0) + + const passed = await client.find.domains({ predicate: dm.CompoundPredicate.PASS }).executeAll() + expect(passed).toEqual(domains) + }) + + test('pagination works', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const ids = await client.find + .domains({ + offset: 5, + limit: new dm.NonZero(3), + selector: dm.DomainProjectionSelector.Id.Name.Atom, + }) + .executeAll() + + expect(ids).toMatchInlineSnapshot(` + [ + "domains-multitude-11", + "domains-multitude-12", + "domains-multitude-13", + ] + `) + }) + + test('Fetch domains in batches with specified fetch size', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const stream = client.find + .domains({ + fetchSize: new dm.NonZero(5), + selector: dm.DomainProjectionSelector.Id.Name.Atom, + }) + .batches() + + // TODO: include information about remaining items into the stream return value + let batch = await stream.next() + expect(batch.value).toMatchInlineSnapshot(` + [ + "based", + "certainty", + "domains-multitude-0", + "domains-multitude-1", + "domains-multitude-10", + ] + `) + expect(batch.done).toBe(false) + + batch = await stream.next() + expect(batch.value).toMatchInlineSnapshot(` + [ + "domains-multitude-11", + "domains-multitude-12", + "domains-multitude-13", + "domains-multitude-14", + "domains-multitude-15", + ] + `) + expect(batch.done).toBe(false) + }) + + test('sort by metadata key', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const unsorted = await client.find.assets().executeAll() + const sorted = await client.find.assets({ sorting: { byMetadataKey: new dm.Name('mewo?') } }).executeAll() + + expect(new Set(sorted)).toEqual(new Set(unsorted)) + expect(sorted).not.toEqual(unsorted) + + expect( + sorted.map((asset) => + match(asset) + .with( + { value: { kind: 'Store', value: P.array({ key: { value: 'mewo?' }, value: P.select() }) } }, + ([val]) => val, + ) + .otherwise(() => null) + ), + ).toMatchInlineSnapshot(` + [ + { + "me": "wo", + }, + null, + null, + null, + ] + `) + }) + + test('find block by hash', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const someBlock = (await client.find.blocks().executeAll()).at(1)! + + const found = await client.find + .blocks({ + predicate: dm.CompoundPredicate.Atom( + dm.SignedBlockProjectionPredicate.Header.Hash.Atom.Equals( + blockHash(someBlock.value.payload.header), + ), + ), + }) + .executeSingle() + + expect(found.value.payload.header).toEqual(someBlock.value.payload.header) + }) + + test('find asset definitions', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const _items = await client.find.assetsDefinitions().executeAll() + + // TODO: check what? + }) + + test('find assets: filter by definition id, select account and quantity', async () => { + const { client } = await usePeer() + await submitTestData(client) + + const assets = await client.find + .assets({ + predicate: dm.CompoundPredicate.Atom( + dm.AssetProjectionPredicate.Id.Definition.Atom.Equals(dm.AssetDefinitionId.parse('gator_coin#certainty')), + ), + selector: [dm.AssetProjectionSelector.Id.Account.Atom, dm.AssetProjectionSelector.Value.Numeric.Atom], + }) + .executeAll() + + expect(assets).toMatchInlineSnapshot(` + [ + [ + "ed0120B6F3A798AA75B19102B0B2F5F675B1248D5DB7ADD770EB9684FE5ED19014F9F2@based", + { + "mantissa": 551230000n, + "scale": 3n, + }, + ], + [ + "ed01205DEE97BBA67AE39F87D94D3C66E4E4701685D483BCFF2657B44DF40B06DBDA71@certainty", + { + "mantissa": 1904n, + "scale": 2n, + }, + ], + ] + `) + }) + + test('when numeric assets filtered, but store is selected, validation error happens and passed', async () => { + const { client } = await usePeer() + await submitTestData(client) + + await expect( + client.find + .assets({ + predicate: dm.CompoundPredicate.Atom(dm.AssetProjectionPredicate.Value.Atom.IsNumeric), + selector: [dm.AssetProjectionSelector.Value.Store.Atom], + }) + .executeAll(), + ).rejects.toEqual( + new QueryValidationError(dm.ValidationFail.QueryFailed.Conversion('Expected store value, got numeric')), + ) + }) +}) + +describe('Singular queries', () => { + test('find parameters', async () => { + const { client } = await usePeer() + + const parameters = await client.find.parameters() + + expect(parameters).toMatchInlineSnapshot(` + { + "block": { + "maxTransactions": 512n, + }, + "custom": [], + "executor": { + "fuel": 55000000n, + "memory": 55000000n, + }, + "smartContract": { + "fuel": 55000000n, + "memory": 55000000n, + }, + "sumeragi": { + "blockTime": { + "ms": 0n, + }, + "commitTime": { + "ms": 0n, + }, + "maxClockDrift": { + "ms": 1000n, + }, + }, + "transaction": { + "maxInstructions": 4096n, + "smartContractSize": 4194304n, + }, + } + `) + }) + + test('Find executor data model', async () => { + const { client } = await usePeer() + + const dataModel = await client.find.executorDataModel() + + // TODO: check something in the schema? + expect(dataModel.parameters).toMatchInlineSnapshot(`[]`) + expect(dataModel.instructions).toMatchInlineSnapshot(`[]`) + }) +}) + +describe('Transactions', () => { + function randomAccountId() { + return new dm.AccountId(KeyPair.random().publicKey(), new dm.Name('wonderland')) + } + + test('invalid transaction with `verify: true` - throws', async () => { + const { client } = await usePeer() + + // TODO: include detailed rejection reason into the error + await expect( + client + .transaction( + dm.Executable.Instructions([ + dm.InstructionBox.Transfer.Domain({ + object: new dm.Name('non-existing-domain'), + destination: randomAccountId(), + source: randomAccountId(), + }), + ]), + ) + .submit({ verify: true }), + ).rejects.toThrowErrorMatchingInlineSnapshot(`[TransactionRejectedError]`) + }) + + test('invalid transaction without verification - no errors', async () => { + const { client } = await usePeer() + + // TODO: include detailed rejection reason into the error + await client + .transaction( + dm.Executable.Instructions([ + dm.InstructionBox.Transfer.Domain({ + object: new dm.Name('non-existing-domain'), + destination: randomAccountId(), + source: randomAccountId(), + }), + ]), + ) + .submit({ verify: false }) + }) + + test('find transaction using the provided `.hash()`', async () => { + const { client } = await usePeer() + + const tx = client.transaction( + dm.Executable.Instructions([dm.InstructionBox.Log({ level: dm.Level.INFO, msg: 'Hello' })]), + ) + await tx.submit({ verify: true }) + + const hash = tx.hash + const _found = await client.find + .transactions({ + predicate: dm.CompoundPredicate.Atom(dm.CommittedTransactionProjectionPredicate.Value.Hash.Atom.Equals(hash)), + }) + .executeSingle() + + // TODO: + // expect(found.value).toEqual(tx.signedTransaction) + }) +}) + +// TODO for block stream and events stream support async generators +describe('Block Stream API', () => { + test('Committing 3 blocks one after another', async () => { + const { client } = await usePeer() + + const stream = await client.blocks({ + fromBlockHeight: new dm.NonZero(2), + }) + const streamClosedPromise = stream.ee.once('close') + + for (const domainName of ['looking_glass', 'breakdown', 'island']) { + const blockPromise = stream.ee.once('block') + + await client + .transaction( + dm.Executable.Instructions([ + dm.InstructionBox.Register.Domain({ + id: new dm.Name(domainName), + logo: null, + metadata: [], + }), + ]), + ) + .submit() + + await Promise.race([ + blockPromise, + streamClosedPromise.then(() => { + throw new Error('The connection should not be closed within this loop') + }), + ]) + } + + await stream.stop() + }) +}) + +describe('Custom parameters', () => { + test('set & retrieve custom parameters', async () => { + const { client } = await usePeer() + + let params = await client.find.parameters().then((x) => x.custom) + expect(params).toEqual([]) + + await client + .transaction( + dm.Executable.Instructions([ + dm.InstructionBox.SetParameter.Custom({ + id: new dm.Name('dededede'), + payload: dm.Json.fromValue(['ha', { nya: 'nya' }, 'fu', 'wa']), + }), + ]), + ) + .submit({ verify: true }) + + params = await client.find.parameters().then((x) => x.custom) + expect(params).toMatchInlineSnapshot(` + [ + { + "key": "dededede", + "value": { + "id": "dededede", + "payload": [ + "ha", + { + "nya": "nya", + }, + "fu", + "wa", + ], + }, + }, + ] + `) + }) +}) + +describe('Roles & Permission', () => { + test('find account permissions from genesis', async () => { + const { client } = await usePeer() + + const permissions = await client.find + .permissionsByAccountId({ + id: new dm.AccountId(dm.PublicKey.fromMultihash(ACCOUNT_KEY_PAIR.publicKey), DOMAIN), + }) + .executeAll() + + // set in genesis block + expect(permissions).toMatchInlineSnapshot(` + [ + { + "name": "CanRegisterDomain", + "payload": null, + }, + { + "name": "CanSetParameters", + "payload": null, + }, + ] + `) + }) + + test.todo('find roles by account id') +}) diff --git a/tests/node/tests/codec-compat.spec.ts b/tests/node/tests/codec-compat.spec.ts new file mode 100644 index 00000000..501e5455 --- /dev/null +++ b/tests/node/tests/codec-compat.spec.ts @@ -0,0 +1,432 @@ +import type { Except, JsonValue } from 'type-fest' +import { type CodecContainer, defineCodec, getCodec } from '@iroha/core' +import * as dm from '@iroha/core/data-model' +import type SCHEMA from '@iroha/core/data-model/schema-json' +import { irohaCodecToScale } from 'iroha-build-utils' +import { describe, expect, test } from 'vitest' +import { Bytes, KeyPair } from '@iroha/core/crypto' + +export const SAMPLE_ACCOUNT_ID = dm.AccountId.parse( + 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', +) + +function toHex(bytes: Uint8Array) { + return [...bytes].map((x) => x.toString(16).padStart(2, '0')).join('') +} + +interface Case { + type: keyof typeof SCHEMA + codec: CodecContainer + value: T + json: JsonValue +} + +function defCase(data: Case) { + return data +} + +function* defMultipleValues(data: Except, 'value'>, ...values: T[]) { + for (const value of values) { + yield { ...data, value } + } +} + +function caseHash() { + const bytes = Uint8Array.from({ length: 32 }, (_v, i) => i) + const hex = toHex(bytes) + return defCase({ + type: 'Hash', + json: hex, + codec: dm.Hash, + value: dm.Hash.fromRaw(Bytes.array(bytes)), + }) +} + +// checks durations & timestamps +function casesSchedule() { + const base = { type: 'Schedule', codec: dm.Schedule } as const + const start = new Date('2024-07-24T04:26:38.736Z') + return [ + defCase({ + ...base, + json: { start_ms: 400 }, + value: { start: dm.Timestamp.fromMillis(400), period: null }, + }), + defCase({ + ...base, + json: { start_ms: 500 }, + value: { start: dm.Timestamp.fromMillis(500n), period: null }, + }), + defCase({ + ...base, + json: { start_ms: start.getTime() }, + value: { start: dm.Timestamp.fromDate(start), period: null }, + }), + defCase({ + ...base, + json: { start_ms: 400, period_ms: 100 }, + value: { + start: dm.Timestamp.fromMillis(400), + period: dm.Duration.fromMillis(100), + }, + }), + ] +} + +function casesTxPayload() { + const base = { + type: 'TransactionPayload', + codec: dm.TransactionPayload, + } as const + return [ + defCase({ + ...base, + json: { + chain: 'test', + authority: SAMPLE_ACCOUNT_ID.toJSON(), + instructions: { Instructions: [] }, + creation_time_ms: 505050, + metadata: {}, + }, + value: { + chain: 'test', + authority: SAMPLE_ACCOUNT_ID, + instructions: dm.Executable.Instructions([]), + creationTime: dm.Timestamp.fromDate(new Date(505050)), + timeToLive: null, + nonce: null, + metadata: [], + }, + }), + ] +} + +function casesCompoundPredicates() { + const base = { + type: 'CompoundPredicate', + codec: defineCodec( + dm.CompoundPredicate.with(getCodec(dm.AssetProjectionPredicate)), + ), + } as const + const atom = defCase( + { + ...base, + json: { + Atom: { + Id: { + Account: { Domain: { Name: { Atom: { Equals: 'wonderland' } } } }, + }, + }, + }, + value: dm.CompoundPredicate.Atom( + dm.AssetProjectionPredicate.Id.Account.Domain.Name.Atom.Equals( + 'wonderland', + ), + ), + } as const, + ) + return [ + atom, + defCase({ + ...base, + json: { Not: atom.json }, + value: dm.CompoundPredicate.Not(atom.value), + }), + defCase({ + ...base, + json: { And: [atom.json, atom.json] }, + value: dm.CompoundPredicate.And(atom.value, atom.value), + }), + defCase({ + ...base, + json: { Or: [atom.json, atom.json] }, + value: dm.CompoundPredicate.Or(atom.value, atom.value), + }), + ] +} +test.each([ + caseHash(), + defCase({ + type: 'AccountEventSet', + json: ['Deleted', 'Created'], + codec: dm.AccountEventSet, + value: new Set(['Created', 'Deleted'] as const), + }), + // defCase({ + // type: 'Level', + // json: 'INFO', + // codec: dm.LogLevel, + // value: dm.LogLevel.INFO, + // }), + ...defMultipleValues( + { + type: 'Json', + json: { whatever: ['foo', 'bar'] }, + codec: dm.Json, + }, + dm.Json.fromValue({ whatever: ['foo', 'bar'] }), + dm.Json.fromJsonString(`{"whatever":["foo","bar"]}`), + ), + ...defMultipleValues( + { + type: 'AccountId', + json: 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', + codec: dm.AccountId, + }, + dm.AccountId.parse( + 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', + ), + new dm.AccountId( + dm.PublicKey.fromMultihash( + 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E', + ), + new dm.Name('badland'), + ), + ), + ...defMultipleValues( + { + type: 'AssetDefinitionId', + json: 'rose#badland', + codec: dm.AssetDefinitionId, + }, + dm.AssetDefinitionId.parse('rose#badland'), + ), + ...defMultipleValues( + { + type: 'AssetId', + json: 'rose##ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', + codec: dm.AssetId, + }, + dm.AssetId.parse( + 'rose##ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', + ), + dm.AssetId.parse( + 'rose#badland#ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@badland', + ), + ), + ...casesSchedule(), + defCase({ + type: 'EventBox', + json: { Time: { interval: { since_ms: 15_000, length_ms: 18_000 } } }, + codec: dm.EventBox, + value: dm.EventBox.Time({ + interval: { + since: dm.Timestamp.fromMillis(15_000), + length: dm.Duration.fromMillis(18_000), + }, + }), + }), + ...casesTxPayload(), + defCase({ + type: 'QueryRequestWithAuthority', + json: { + authority: SAMPLE_ACCOUNT_ID.toJSON(), + request: { + Start: { + query: { FindAccounts: { query: null, predicate: { And: [] } } }, + }, + }, + }, + codec: dm.QueryRequestWithAuthority, + value: { + authority: SAMPLE_ACCOUNT_ID, + request: dm.QueryRequest.Start({ + query: dm.QueryBox.FindAccounts({ + predicate: dm.CompoundPredicate.PASS, + query: null, + selector: [dm.AccountProjectionSelector.Atom], + }), + params: { + pagination: { offset: 0n, limit: null }, + sorting: { sortByMetadataKey: null }, + fetchSize: null, + }, + }), + }, + }), + ...casesCompoundPredicates(), + defCase({ + type: 'SignedTransaction', + json: { + version: '1', + content: { + payload: { + chain: '0', + authority: 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@wonderland', + creation_time_ms: 1723592746838, + instructions: { + Instructions: [{ + Register: { Domain: { id: 'roses', metadata: {} } }, + }], + }, + metadata: {}, + }, + signature: + '4B3842C4CDB0E6364396A1019F303CE81CE4F01E56AF0FA9312AA070B88D405E831115112E5B23D76A30C6D81B85AB707FBDE0DE879D2ABA096D0CBEDB7BF30F', + }, + }, + codec: dm.SignedTransaction, + value: dm.SignedTransaction.V1({ + payload: { + chain: '0', + authority: dm.AccountId.parse( + 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E@wonderland', + ), + creationTime: dm.Timestamp.fromDate(new Date(1723592746838)), + instructions: dm.Executable.Instructions([ + dm.InstructionBox.Register.Domain({ + id: new dm.Name('roses'), + metadata: [], + logo: null, + }), + ]), + timeToLive: null, + nonce: null, + metadata: [], + }, + signature: dm.Signature.fromRaw(Bytes.hex( + '4B3842C4CDB0E6364396A1019F303CE81CE4F01E56AF0FA9312AA070B88D405E831115112E5B23D76A30C6D81B85AB707FBDE0DE879D2ABA096D0CBEDB7BF30F', + )), + }), + }), + defCase({ + type: 'SortedMap', + json: { 1: { WasmExecution: 'whichever' }, 0: { LimitCheck: 'mewo' } }, + codec: dm.TransactionErrors, + value: [ + { + index: 1n, + error: dm.TransactionRejectionReason.WasmExecution({ + reason: 'whichever', + }), + }, + { + index: 0n, + error: dm.TransactionRejectionReason.LimitCheck({ reason: 'mewo' }), + }, + ], + }), + // TODO: add SignedBlock +] as Case[])( + `Check encoding against iroha_codec of type $type: $value`, + async (data: Case) => { + const referenceEncoded = await irohaCodecToScale(data.type, data.json) + const actualEncoded = getCodec(data.codec).encode(data.value) + expect(toHex(actualEncoded)).toEqual(toHex(referenceEncoded)) + }, +) + +describe('BTree{Set/Map}', () => { + test('Metadata encoding matches with iroha_codec', async () => { + const CODEC = getCodec(dm.Metadata) + const reference = await irohaCodecToScale('Metadata', { + foo: 'bar', + bar: [1, 2, 3], + '1': 2, + 12: 1, + 2: false, + }) + + const value: dm.Metadata = [ + { key: new dm.Name('foo'), value: dm.Json.fromValue('bar') }, + { key: new dm.Name('bar'), value: dm.Json.fromValue([1, 2, 3]) }, + { key: new dm.Name('1'), value: dm.Json.fromValue(2) }, + { key: new dm.Name('12'), value: dm.Json.fromValue(1) }, + { key: new dm.Name('2'), value: dm.Json.fromValue(false) }, + ] + + expect(CODEC.decode(reference)).toEqual(CODEC.decode(CODEC.encode(value))) + expect(CODEC.encode(value)).toEqual(reference) + }) + + test('Metadata encoding is the same with and without duplicate entries', () => { + const CODEC = getCodec(dm.Metadata) + + const withDuplicate: dm.Metadata = [ + { key: new dm.Name('foo'), value: dm.Json.fromValue('bar') }, + { key: new dm.Name('foo'), value: dm.Json.fromValue([1, 2, 3]) }, + ] + const without: dm.Metadata = [{ + key: new dm.Name('foo'), + value: dm.Json.fromValue([1, 2, 3]), + }] + + expect(CODEC.encode(withDuplicate)).toEqual(CODEC.encode(without)) + }) + + test('BTreeSet - encoding matches with mixed keys and mixed domains', async () => { + const keys = Array.from( + { length: 7 }, + (_v, i) => + KeyPair.deriveFromSeed(Bytes.array(new Uint8Array([0, 1, 2, i]))) + .publicKey(), + ) + + const domains = Array.from( + { length: 5 }, + (_v, i) => new dm.DomainId(`domain-${i}`), + ) + + const ids = keys.flatMap((key) => + domains.flatMap(( + domain, + ) => [new dm.AccountId(key, domain), new dm.AccountId(key, domain)]) + ) + + const reference = await irohaCodecToScale( + 'SortedVec', + ids.map((x) => x.toJSON()), + ) + + expect(dm.BTreeSet.with(getCodec(dm.AccountId)).encode(ids)).toEqual( + reference, + ) + }) + + test('BTreeSet - encoding matches', async () => { + const codec = getCodec(dm.PermissionsSet) + const reference = await irohaCodecToScale('SortedVec', [ + { name: 'foo', payload: [1, 2, 3] }, + { name: 'foo', payload: [3, 2, 1] }, + { name: 'bar', payload: false }, + ]) + + const js: dm.PermissionsSet = [ + { name: 'foo', payload: dm.Json.fromValue([3, 2, 1]) }, + { name: 'foo', payload: dm.Json.fromValue([1, 2, 3]) }, + // this must be deduped + { name: 'foo', payload: dm.Json.fromValue([1, 2, 3]) }, + { name: 'bar', payload: dm.Json.fromValue(false) }, + ] + + const encoded = codec.encode(js) + expect(encoded).toEqual(reference) + + const decoded = codec.decode(encoded) + expect(decoded).toEqual(codec.decode(reference)) + expect(decoded).toMatchInlineSnapshot(` + [ + { + "name": "bar", + "payload": false, + }, + { + "name": "foo", + "payload": [ + 1, + 2, + 3, + ], + }, + { + "name": "foo", + "payload": [ + 3, + 2, + 1, + ], + }, + ] + `) + }) +}) diff --git a/tests/node/tests/crypto.spec.ts b/tests/node/tests/crypto.spec.ts new file mode 100644 index 00000000..b1169b16 --- /dev/null +++ b/tests/node/tests/crypto.spec.ts @@ -0,0 +1,176 @@ +import { describe, expect, test } from 'vitest' +import { wasmPkg } from '@iroha/crypto-target-node' +import { Algorithm, Bytes, KeyPair, PrivateKey, PublicKey, setWASM, Signature } from '@iroha/core/crypto' + +setWASM(wasmPkg) + +const { hex: bytesHex } = Bytes + +describe('KeyPair generation', () => { + test('Derives from a seed as expected', () => { + const SEED_BYTES = [49, 50, 51, 52] + + const kp = KeyPair.deriveFromSeed(Bytes.array(Uint8Array.from(SEED_BYTES))) + const parts = { publicKey: kp.publicKey().multihash(), privateKey: kp.privateKey().multihash() } + + expect(parts).toMatchInlineSnapshot(` + { + "privateKey": "80262001F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763", + "publicKey": "ed0120F149BB4B59FEB0ACE3074F10C65E179880EA2C4FE4E0D6022B1E82C33C3278C7", + } + `) + }) + + test('Derives from a private key as expected', () => { + const SAMPLE = '802620418A3712F4841FFE7A90B14E90BF76A6EF2A2546AC8DBBB1F442FFB8250426B0' + + const kp = KeyPair.deriveFromPrivateKey(PrivateKey.fromMultihash(SAMPLE)) + + expect({ + publicKey: kp.publicKey().multihash(), + privateKey: kp.privateKey().multihash(), + }).toMatchInlineSnapshot(` + { + "privateKey": "802620418A3712F4841FFE7A90B14E90BF76A6EF2A2546AC8DBBB1F442FFB8250426B0", + "publicKey": "ed012082528CCC8727333530C8F6F19F70C23882DEB1BF2BA3BE4A6654C7E8A91A7731", + } + `) + }) + + test('Generates randomly without an error', () => { + expect(() => KeyPair.random()).not.toThrow() + }) +}) + +describe('Given a multihash', () => { + const MULTIHASH = 'ed0120797507786F9C6A4DE91B5462B8A6F7BF9AB21C22B853E9C992C2EF68DA5307F9' + + test('a public key could be constructed', () => { + const key = PublicKey.fromMultihash(MULTIHASH) + + expect(key.algorithm).toMatchInlineSnapshot('"ed25519"') + expect(key.payload.hex()).toMatchInlineSnapshot( + '"797507786f9c6a4de91b5462b8a6f7bf9ab21c22b853e9c992c2ef68da5307f9"', + ) + expect(key.multihash()).toBe(MULTIHASH) + }) +}) + +describe('Signature verification', () => { + function pairFactory() { + return KeyPair.deriveFromSeed(Bytes.hex('aa1108')) + } + + test('result is ok', () => { + const MESSAGE = 'deadbeef' + + const pair = pairFactory() + const signature = pair.privateKey().sign(bytesHex(MESSAGE)) + const result = pair.publicKey().verifySignature(signature, bytesHex(MESSAGE)) + + expect(result).toEqual({ t: 'ok' }) + }) + + test('result is err', () => { + const pair = pairFactory() + const signature = pair.privateKey().sign(bytesHex('deadbeef')) + const result = pair.publicKey().verifySignature(signature, bytesHex('feedbabe')) + + expect(result).toMatchInlineSnapshot(` + { + "error": "Signature verification failed", + "t": "err", + } + `) + }) + + test('exception is thrown if input is invalid', () => { + const signature = pairFactory().privateKey().sign(bytesHex('deadbeef')) + + expect(() => signature.verify(pairFactory().publicKey(), bytesHex('not really a hex'))) + .toThrowErrorMatchingInlineSnapshot(`[Error: Invalid character 'n' at position 0]`) + }) +}) + +describe('Raw conversion', () => { + test('Construct PublicKey', () => { + const multihash = PublicKey.fromParts( + Algorithm.ed25519, + bytesHex('A88D1B0D23BC1ADC564DE57CEDBF8FD7D045D0D698EF27E5D9C1807C1041E016'), + ).multihash() + + expect(multihash).toMatchInlineSnapshot('"ed0120A88D1B0D23BC1ADC564DE57CEDBF8FD7D045D0D698EF27E5D9C1807C1041E016"') + }) + + // TODO: find a better way to test pub key parsing directly + test('Error when constructing an invalid PublicKey', () => { + const kp = KeyPair.random() + const signature = kp.privateKey().sign(Bytes.hex('deadbeef')) + + // it is parsed lazily in WASM: https://github.com/hyperledger-iroha/iroha/pull/5048 + const badPubKey = PublicKey.fromParts( + Algorithm.bls_normal, + // this payload is not valid for this algorithm + bytesHex('A88D1B0D23BC1ADC564DE57CEDBF8FD7D045D0D698EF27E5D9C1807C1041E016'), + ) + + expect(() => signature.verify(badPubKey, Bytes.hex('deadbeef'))) + // FIXME: not a good error. This should probably be reported to Iroha + .toThrowErrorMatchingInlineSnapshot(`[RuntimeError: unreachable]`) + }) + + test('Construct PrivateKey', () => { + const json = PrivateKey.fromParts( + Algorithm.ed25519, + bytesHex('01f2db2416255e79db67d5ac807e55459ed8754f07586864948aea00f6f81763'), + ).multihash() + + expect(json).toMatchInlineSnapshot(`"80262001F2DB2416255E79DB67D5AC807E55459ED8754F07586864948AEA00F6F81763"`) + }) + + test('Fail to construct PrivateKey', () => { + expect(() => + PrivateKey.fromParts( + Algorithm.secp256k1, + bytesHex( + '01f2db2416255e79db67d5ac807e55459ed8754f07586864948aea00f6f81763f149bb4b59feb0ace3074f10c65e179880ea2c4fe4e0d6022b1e82c33c3278c7', + ), + ) + ).toThrowErrorMatchingInlineSnapshot(`[Error: crypto error]`) + }) + + test('Fail to construct KeyPair', () => { + const kp1 = KeyPair.deriveFromSeed(bytesHex('deadbeef'), { algorithm: Algorithm.bls_normal }) + const kp2 = KeyPair.deriveFromSeed(bytesHex('beefdead')) + + expect(() => KeyPair.fromParts(kp1.publicKey(), kp2.privateKey())).toThrowErrorMatchingInlineSnapshot( + `[Error: Key generation failed. Mismatch of key algorithms]`, + ) + }) + + test('Construct Signature', () => { + const SAMPLE_PAYLOAD = + 'd0fbac97dcc1c859c110dcf3c55ecff6c28dd49b6e5560e2175a7f308a2214d3d4666c37f0ebfbeb24341a15e606d71780f992f151652adba39fe87e831a2000' + + const actualPayload = Signature.fromRaw(bytesHex(SAMPLE_PAYLOAD)).payload.hex() + + expect(actualPayload).toEqual(SAMPLE_PAYLOAD) + }) + + // TODO + // test.todo('Failed to construct Signature... is it possible?') +}) + +test('BlsSmall signature', () => { + const SEED = 'babe' + const PAYLOAD = 'deadbeef' + const EXPECTED_SIGNATURE = + '81ed6a74bb04f2a9d2007dcf7f39ae186019abc8ba46316a751c405a509fed2470443b60f82188102ed6bf3bf61d593a' + + const actual = KeyPair.deriveFromSeed(Bytes.hex(SEED), { algorithm: 'bls_small' }) + .privateKey() + .sign(Bytes.hex(PAYLOAD)) + .payload.hex() + + expect(actual).toBe(EXPECTED_SIGNATURE) +}) diff --git a/tests/node/tests/setup.ts b/tests/node/tests/setup.ts new file mode 100644 index 00000000..33c97e27 --- /dev/null +++ b/tests/node/tests/setup.ts @@ -0,0 +1,4 @@ +import { install } from '@iroha/crypto-target-node' + +// For some reason, WASM resets each time between test files +install() diff --git a/tests/node/tests/util.ts b/tests/node/tests/util.ts new file mode 100644 index 00000000..5e31f26b --- /dev/null +++ b/tests/node/tests/util.ts @@ -0,0 +1,89 @@ +import { onTestFinished } from 'vitest' +import uniquePort from 'get-port' +import { Client } from '../../../packages/client/mod.ts' +import { adapter as WS } from '../../../packages/client/web-socket/node.ts' +import { ACCOUNT_KEY_PAIR, CHAIN, DOMAIN } from '@iroha/test-configuration' +import { createGenesis } from '@iroha/test-configuration/node' +import { Bytes, KeyPair, PrivateKey, PublicKey } from '@iroha/core/crypto' +import type * as dm from '@iroha/core/data-model' +import * as TestPeer from '@iroha/test-peer' +import { delay } from '@std/async' + +async function waitForGenesisCommitted(f: () => Promise) { + while (true) { + const { blocks } = await f() + if (blocks >= 1) return + await delay(50) + } +} + +function getAccountKeyPair() { + const accountPublicKey = PublicKey.fromMultihash(ACCOUNT_KEY_PAIR.publicKey) + const accountPrivateKey = PrivateKey.fromMultihash(ACCOUNT_KEY_PAIR.privateKey) + const accountKeyPair = KeyPair.fromParts(accountPublicKey, accountPrivateKey) + return accountKeyPair +} + +async function uniquePortsPair() { + return { + api: await uniquePort(), + p2p: await uniquePort(), + } +} + +export async function usePeer(): Promise<{ client: Client }> { + const { + peers: [peer], + } = await useNetwork({ peers: 1 }) + + return peer +} + +export async function useNetwork(params: { + peers: number + seed?: Uint8Array +}): Promise<{ peers: { client: Client; keypair: KeyPair; ports: { api: number; p2p: number } }[] }> { + const configs = await Promise.all( + Array.from({ length: params.peers }, async (_v, i) => { + const key = params.seed + ? KeyPair.deriveFromSeed(Bytes.array(new Uint8Array([...params.seed, i, i, i]))) + : KeyPair.random() + return { key, ports: await uniquePortsPair() } + }), + ) + const topology = configs.map(({ key }) => key.publicKey()) + const genesis = await createGenesis({ topology }) + + const trustedPeers = (peerIndex: number) => + configs + .filter((_x, i) => i !== peerIndex) + .map(({ key, ports }) => ({ id: key.publicKey().multihash(), address: `localhost:${ports.p2p}` })) + + const peers = await Promise.all( + configs.map(async ({ key, ports }, i) => { + const { kill } = await TestPeer.startPeer({ + keypair: key, + ports, + genesis: i === 0 ? genesis : undefined, + trustedPeers: trustedPeers(i), + }) + onTestFinished(kill) + + const client = new Client({ + ws: WS, + toriiBaseURL: new URL(`http://localhost:${ports.api}`), + accountKeyPair: getAccountKeyPair(), + accountDomain: DOMAIN, + chain: CHAIN, + }) + + await waitForGenesisCommitted(() => client.api.telemetry.status()) + + return { keypair: key, ports, client } + }), + ) + + return { + peers, + } +} diff --git a/tests/node/vitest.config.mts b/tests/node/vitest.config.mts new file mode 100644 index 00000000..4f4eeb3b --- /dev/null +++ b/tests/node/vitest.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config' +import deno from '@deno/vite-plugin' + +export default defineConfig({ + plugins: [deno()], + test: { + setupFiles: ['tests/setup.ts'], + testTimeout: 10_000, + retry: 2, + }, +}) diff --git a/tests/support/test-configuration/deno.jsonc b/tests/support/test-configuration/deno.jsonc new file mode 100644 index 00000000..ac69ab8a --- /dev/null +++ b/tests/support/test-configuration/deno.jsonc @@ -0,0 +1,10 @@ +{ + "name": "@iroha/test-configuration", + "exports": { + ".": "./mod.ts", + "./node": "./node.ts" + }, + "imports": { + "tempy": "npm:tempy@^3.1.0" + } +} diff --git a/tests/support/test-configuration/mod.ts b/tests/support/test-configuration/mod.ts new file mode 100644 index 00000000..698769f4 --- /dev/null +++ b/tests/support/test-configuration/mod.ts @@ -0,0 +1,22 @@ +import * as dm from '@iroha/core/data-model' + +export const DOMAIN: dm.DomainId = new dm.Name('wonderland') + +export const ACCOUNT_KEY_PAIR = { + publicKey: 'ed0120B23E14F659B91736AAB980B6ADDCE4B1DB8A138AB0267E049C082A744471714E', + privateKey: '802620E28031CC65994ADE240E32FCFD0405DF30A47BDD6ABAF76C8C3C5A4F3DE96F75', +} as const + +export const GENESIS_KEY_PAIR = { + publicKey: 'ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4', + privateKey: '80262082B3BDE54AEBECA4146257DA0DE8D59D8E46D5FE34887DCD8072866792FCB3AD', +} as const + +export const CHAIN = '00000000-0000-0000-0000-000000000000' + +export const PEER_CONFIG_BASE = { + chain: CHAIN, + genesis: { + public_key: GENESIS_KEY_PAIR.publicKey, + }, +} as const diff --git a/tests/support/test-configuration/node.ts b/tests/support/test-configuration/node.ts new file mode 100644 index 00000000..9710a64c --- /dev/null +++ b/tests/support/test-configuration/node.ts @@ -0,0 +1,83 @@ +import * as dm from '@iroha/core/data-model' +import { getCodec } from '@iroha/core' +import fs from 'node:fs/promises' +import path from 'node:path' +import { temporaryDirectory } from 'tempy' +import { BIN_PATHS, EXECUTOR_WASM_PATH, irohaCodecToJson } from 'iroha-build-utils' +import type { PublicKey } from '@iroha/core/crypto' +import { ACCOUNT_KEY_PAIR, CHAIN, GENESIS_KEY_PAIR } from './mod.ts' +import { spawn } from 'node:child_process' +import { Buffer } from 'node:buffer' + +const BLOCK_TIME_MS = 0 +const COMMIT_TIME_MS = 0 + +export const DOMAIN: dm.DomainId = new dm.Name('wonderland') + +export async function createGenesis(params: { + /** + * A list of peers' public keys. Must be at least one. + */ + topology: PublicKey[] +}): Promise { + const alice = dm.AccountId.parse(`${ACCOUNT_KEY_PAIR.publicKey}@${DOMAIN.value}`) + const genesis = dm.AccountId.parse(`${GENESIS_KEY_PAIR.publicKey}@genesis`) + + const instructionsJson = await irohaCodecToJson( + 'Vec', + dm.Vec.with(getCodec(dm.InstructionBox)).encode([ + dm.InstructionBox.Register.Domain({ id: DOMAIN, metadata: [], logo: null }), + dm.InstructionBox.Register.Account({ id: alice, metadata: [] }), + dm.InstructionBox.Transfer.Domain({ source: genesis, object: DOMAIN, destination: alice }), + dm.InstructionBox.SetParameter.Sumeragi.BlockTime(dm.Duration.fromMillis(BLOCK_TIME_MS)), + dm.InstructionBox.SetParameter.Sumeragi.CommitTime(dm.Duration.fromMillis(COMMIT_TIME_MS)), + ...[ + { name: 'CanSetParameters', payload: dm.Json.fromValue(null) }, + { name: 'CanRegisterDomain', payload: dm.Json.fromValue(null) }, + ].map((object) => dm.InstructionBox.Grant.Permission({ object, destination: alice })), + ]), + ) + + // FIXME: produce SignedBlock directly, without Kagami. + const kagami_input = { + chain: CHAIN, + executor: EXECUTOR_WASM_PATH, + instructions: instructionsJson, + topology: params.topology.map((x) => x.multihash()), + // FIXME: migrate to direct building of `SignedBlock`, without `genesis.json`. + // And note that I don't use any WASMs and these fields are extra for my case. + wasm_dir: 'why the hell do you require wasm_dir at all times?', + wasm_triggers: [], + } + + return signGenesisWithKagami(kagami_input) +} + +async function signGenesisWithKagami(json: unknown): Promise { + const dir = temporaryDirectory() + await fs.writeFile(path.join(dir, 'genesis.json'), JSON.stringify(json)) + + const encoded = await new Promise((resolve, reject) => { + const child = spawn(BIN_PATHS.kagami, [ + `genesis`, + `sign`, + path.join(dir, 'genesis.json'), + `--public-key`, + GENESIS_KEY_PAIR.publicKey, + `--private-key`, + GENESIS_KEY_PAIR.privateKey, + // '--out-file', + // path.join(dir, 'genesis.scale'), + ], { stdio: ['ignore', 'pipe', 'inherit'] }) + + const outputChunks: Uint8Array[] = [] + child.stdout.on('data', (chunk) => outputChunks.push(chunk)) + + child.on('close', (code) => { + if (code !== 0) reject(new Error(`non-zero exit code: ${code}`)) + resolve(Buffer.concat(outputChunks)) + }) + }) + + return getCodec(dm.SignedBlock).decode(encoded) +} diff --git a/tests/support/test-peer/api/server.ts b/tests/support/test-peer/api/server.ts new file mode 100644 index 00000000..2fa158d3 --- /dev/null +++ b/tests/support/test-peer/api/server.ts @@ -0,0 +1,61 @@ +import * as h3 from 'h3' +import { listen } from 'listhen' + +import * as lib from '../mod.ts' +import { KeyPair } from '@iroha/core/crypto' +import { createGenesis } from '@iroha/test-configuration/node' + +export async function run(ports: { server: number; toriiApi: number; toriiP2p: number }) { + let peer: lib.StartPeerReturn | undefined + + const app = h3.createApp({ debug: true }) + + const router = h3 + .createRouter() + .post( + '/start', + h3.eventHandler(async (event) => { + if (peer) { + h3.setResponseStatus(event, 400) + return 'Kill first' + } + + const keypair = KeyPair.random() + const genesis = await createGenesis({ topology: [keypair.publicKey()] }) + peer = await lib.startPeer({ genesis, ports: { api: ports.toriiApi, p2p: ports.toriiP2p }, keypair }) + + h3.setResponseStatus(event, 204) + await h3.send(event) + }), + ) + .post( + '/kill', + h3.eventHandler(async (event) => { + if (!peer) { + h3.setResponseStatus(event, 204) + return 'Not alive' + } + + await peer.kill() + peer = undefined + + h3.setResponseStatus(event, 204) + await h3.send(event) + }), + ) + .get( + '/is-alive', + h3.eventHandler(async () => { + return { isAlive: peer?.isAlive() ?? false } + }), + ) + + app.use(router) + const { server: port } = ports + + try { + await listen(h3.toNodeListener(app), { port: { port, alternativePortRange: [port, port], random: false } }) + } finally { + await peer?.kill() + } +} diff --git a/tests/support/test-peer/deno.jsonc b/tests/support/test-peer/deno.jsonc new file mode 100644 index 00000000..6fc5dd32 --- /dev/null +++ b/tests/support/test-peer/deno.jsonc @@ -0,0 +1,16 @@ +{ + "name": "@iroha/test-peer", + "exports": { + ".": "./mod.ts", + "./api/server": "./api/server.ts" + }, + "tasks": { + "run": "DEBUG=\"@iroha*\" deno run --allow-all ./etc/run.ts" + }, + "imports": { + "debug": "npm:debug@^4.4.0", + "h3": "npm:h3@^1.15.0", + "listhen": "npm:listhen@^1.9.0", + "tempy": "npm:tempy@^3.1.0" + } +} diff --git a/tests/support/test-peer/mod.ts b/tests/support/test-peer/mod.ts new file mode 100644 index 00000000..f4f37d24 --- /dev/null +++ b/tests/support/test-peer/mod.ts @@ -0,0 +1,170 @@ +import { BIN_PATHS } from 'iroha-build-utils' +import path from 'node:path' +import { fs } from 'zx' +import { PEER_CONFIG_BASE } from '@iroha/test-configuration' +import * as TOML from '@std/toml' +import { format as formatDuration } from '@std/fmt/duration' +import * as dm from '@iroha/core/data-model' +import { getCodec } from '@iroha/core' +import { temporaryDirectory } from 'tempy' +import { HttpTransport, MainAPI } from '@iroha/client' +import { mergeDeep } from 'remeda' +import { spawn } from 'node:child_process' + +import Debug from 'debug' +import type { KeyPair } from '@iroha/core/crypto' +import { assert } from '@std/assert' + +const debug = Debug('@iroha/test-peer') + +const GENESIS_CHECK_TIMEOUT = 3_000 +const GENESIS_CHECK_INTERVAL = 200 + +async function waitForGenesis(url: URL, abort: AbortSignal) { + let now = Date.now() + const endAt = now + GENESIS_CHECK_TIMEOUT + + let aborted = false + abort.addEventListener('abort', () => { + aborted = true + }) + + while (true) { + if (aborted) throw new Error('Aborted') + + now = Date.now() + if (now > endAt) { + throw new Error( + `Genesis is still not committed after ${formatDuration(GENESIS_CHECK_TIMEOUT, { ignoreZero: true })}`, + ) + } + + try { + const { blocks } = await new MainAPI(new HttpTransport(url)).telemetry.status() + if (blocks === 1n) break + throw `blocks: ${blocks}` + } catch (error) { + debug('genesis is not yet ready: %o', error) + } + + await new Promise((r) => setTimeout(r, GENESIS_CHECK_INTERVAL)) + } +} + +export interface KillPeerParams { + /** + * If set to `true`, then after killing all side effects will be cleared, e.g. saved blocks + * + * TODO remove not `blocks` dir, but dir, specified in kura config + */ + cleanSideEffects?: boolean +} + +export interface StartPeerReturn { + /** + * Kill peer's process + */ + kill: () => Promise + + /** + * Check for alive status + */ + isAlive: () => boolean +} + +/** + * Start network with a single peer. + * + * **Note:** Iroha binary must be pre-built. + */ +export async function startPeer(params: { + ports: { api: number; p2p: number } + keypair: KeyPair + trustedPeers?: { + address: string + /** aka public key */ + id: string + }[] + genesis?: dm.SignedBlock +}): Promise { + const PORT = params.ports.api + const PORT_P2P = params.ports.p2p + const API_ADDRESS = `127.0.0.1:${PORT}` + const API_URL = new URL(`http://${API_ADDRESS}`) + const P2P_ADDRESS = `127.0.0.1:${PORT_P2P}` + const TMP_DIR = temporaryDirectory() + debug('Peer temporary directory: %o | See configs, logs, artifacts there', TMP_DIR) + + let configGenesisPart = {} + if (params?.genesis) { + await fs.writeFile(path.join(TMP_DIR, 'genesis.scale'), getCodec(dm.SignedBlock).encode(params.genesis)) + configGenesisPart = { + genesis: { + file: './genesis.scale', + }, + } + } + + await fs.writeFile( + path.join(TMP_DIR, 'config.toml'), + TOML.stringify( + mergeDeep(PEER_CONFIG_BASE, { + ...configGenesisPart, + public_key: params.keypair.publicKey().multihash(), + private_key: params.keypair.privateKey().multihash(), + trusted_peers: params.trustedPeers?.map((x) => `${x.id}@${x.address}`) ?? [], + kura: { store_dir: './storage' }, + torii: { address: API_ADDRESS }, + network: { address: P2P_ADDRESS, public_address: P2P_ADDRESS }, + snapshot: { mode: 'disabled' }, + logger: { + format: 'json', + level: 'DEBUG', + }, + }), + ), + ) + + const child = spawn(BIN_PATHS.irohad, ['--config', './config.toml'], { + cwd: TMP_DIR, + stdio: ['ignore', 'pipe', 'pipe'], + }) + let isAlive = true + + // child.stdout.pipe + child.stdout.pipe(fs.createWriteStream(path.join(TMP_DIR, 'stdout.json'))) + child.stderr.pipe(fs.createWriteStream(path.join(TMP_DIR, 'stderr'))) + + const healthCheckAbort = new AbortController() + + const exitPromise = new Promise<{ code: number }>((resolve) => { + child.on('close', (code) => { + isAlive = false + debug('Peer exited') + assert(typeof code === 'number') + resolve({ code }) + }) + }) + + const kill = async function () { + if (!isAlive) throw new Error('Already dead') + debug('Killing peer...') + child.kill('SIGTERM') + await exitPromise + } + + await Promise.race([ + exitPromise.then(({ code }) => { + healthCheckAbort.abort() + throw new Error(`Iroha exited with code ${code}, something went wrong`) + }), + waitForGenesis(API_URL, healthCheckAbort.signal), + ]) + + debug('Peer is alive and genesis is committed') + + return { + kill, + isAlive: () => isAlive, + } +} diff --git a/tests/support/test-peer/run.ts b/tests/support/test-peer/run.ts new file mode 100644 index 00000000..6c64ad15 --- /dev/null +++ b/tests/support/test-peer/run.ts @@ -0,0 +1,16 @@ +import { startPeer } from '@iroha/test-peer' +import * as colors from 'jsr:@std/fmt/colors' +import { KeyPair } from '@iroha/core/crypto' +import { createGenesis } from '@iroha/test-configuration/node' +import { install } from '@iroha/crypto-target-node' + +install() + +const API = 8080 +const P2P = 1337 + +const keypair = KeyPair.random() +const genesis = await createGenesis({ topology: [keypair.publicKey()] }) + +console.log(`Torii URL: ${colors.blue(`http://localhost:${API}`)}`) +await startPeer({ ports: { api: API, p2p: P2P }, genesis, keypair }) diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index 5e5a38b0..00000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "esnext", - "lib": ["esnext", "DOM"], - "esModuleInterop": true, - "alwaysStrict": true, - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "moduleResolution": "bundler", - "skipLibCheck": true, - "resolveJsonModule": true, - "stripInternal": true, - "allowJs": true - } -} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json deleted file mode 100644 index 703a4be6..00000000 --- a/tsconfig.eslint.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "allowJs": true - }, - "include": ["**/*.ts", "**/*.js", ".eslintrc.js", "**/*.vue"] -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 6ea521bf..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "declaration": true, - "outDir": "dist-tsc", - "types": ["vitest/importMeta"], - "paths": { - // these virtual imports are replaced in Rollup - "@iroha2/crypto/~wasm-pkg/*": ["./packages/crypto/crypto-rs/wasm-pkg-*/iroha_crypto"], - - // "default" virtual import - might be any of `wasm-pkg-*` - "@iroha2/crypto/~wasm-pkg": ["./packages/crypto/crypto-rs/wasm-pkg-nodejs/iroha_crypto"], - - "@iroha2/crypto-*": ["./packages/crypto/packages/*/src/lib.ts"], - "@iroha2/client/*": ["./packages/client/src/*"], - "@iroha2/*": ["./packages/*/src/lib.ts"] - } - }, - "exclude": [ - "**/dist", - "**/node_modules", - "**/test/integration", - "packages/client-isomorphic-*", - "packages/crypto/crypto-rs" - ] -} diff --git a/vitest.config.mts b/vitest.config.mts new file mode 100644 index 00000000..9e7033c3 --- /dev/null +++ b/vitest.config.mts @@ -0,0 +1,19 @@ +import { defineConfig } from 'vitest/config' +import deno from '@deno/vite-plugin' + +// Config for global monorepo unit-testing +export default defineConfig({ + plugins: [deno()], + test: { + include: ['**/*.spec.ts'], + exclude: [ + './.iroha', + './tests/node', + './tests/browser', + './crypto-wasm', + '**/node_modules', + '**/dist', + '**/dist-tsc', + ], + }, +}) diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index 91022dba..00000000 --- a/vitest.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { defineConfig } from 'vitest/config' -import path from 'path' -import url from 'url' - -const resolve = (...paths: string[]) => path.resolve(url.fileURLToPath(new URL('.', import.meta.url)), ...paths) - -// Config for global monorepo unit-testing -export default defineConfig({ - resolve: { - alias: { - '@iroha2/i64-fixnum': resolve('./packages/i64-fixnum/src/lib.ts'), - '@iroha2/data-model': resolve('./packages/data-model/src/lib.ts'), - '@iroha2/crypto-core': resolve('./packages/crypto/packages/core/src/lib.ts'), - '@iroha2/crypto-util': resolve('./packages/crypto/packages/util/src/lib.ts'), - }, - }, - test: { - include: ['**/*.spec.ts'], - exclude: ['**/test/integration', '**/node_modules', '**/dist', '**/dist-tsc'], - includeSource: ['packages/i64-fixnum/src/**/*.ts', 'packages/client/src/**/*.ts'], - }, -})